Error Explanation Generator
Analyze test failures and provide clear explanations with actionable fixes.
Core Capabilities
This skill helps debug failed tests by:
- Parsing error messages - Extract key information from test output
- Identifying root causes - Determine why tests fail
- Explaining clearly - Translate technical errors into understandable language
- Providing fixes - Suggest concrete, actionable solutions
- Recognizing patterns - Detect common error categories across frameworks
Error Analysis Workflow
Step 1: Gather Error Context
Collect all relevant information:
Essential Information:
- Complete error message and stack trace
- Test framework being used (pytest, jest, junit, etc.)
- Test code that failed
- Code being tested (if accessible)
- Programming language
Additional Context (if available):
- Recent code changes
- Environment details (OS, language version, dependencies)
- Test configuration files
How to gather:
# Python pytest
pytest -v --tb=long
# JavaScript/TypeScript jest
npm test -- --verbose
# Java junit
mvn test -X
# Go tests
go test -v
Step 2: Parse and Categorize the Error
Identify the error category using references/error_patterns.md:
Common Categories:
- Assertion Failures - Expected vs actual value mismatch
- Exceptions/Errors - Runtime errors during test execution
- Timeout Errors - Tests taking too long
- Setup/Teardown Failures - Fixture or initialization issues
- Import/Dependency Errors - Missing modules or broken imports
- Type Errors - Type mismatches in typed languages
- Mock/Stub Issues - Problems with test doubles
- Configuration Errors - Test framework or build config issues
- Compilation Errors - Syntax or build failures
- Flaky Test Issues - Intermittent failures
Step 3: Extract Key Information
Pull out critical details:
From Error Message:
- Error type (AssertionError, TypeError, NullPointerException, etc.)
- Expected vs actual values
- Error description
- Line numbers where error occurred
From Stack Trace:
- Failure point in test code
- Failure point in source code
- Call chain leading to error
Example Extraction:
FAILED tests/test_user.py::test_create_user - AssertionError: assert 201 == 200
Extracted:
- Test file:
tests/test_user.py - Test name:
test_create_user - Error type:
AssertionError - Expected:
200 - Actual:
201
Step 4: Identify Root Cause
Analyze why the error occurred:
Questions to Ask:
- What was the test expecting?
- What actually happened?
- Why did the actual behavior differ from expected?
- Is this a test bug or a code bug?
Common Root Causes:
- Logic error in implementation
- Incorrect test expectations
- Missing or wrong test data
- Race conditions or timing issues
- Environmental differences
- Outdated mocks or fixtures
- Dependency version conflicts
Step 5: Provide Explanation
Structure the explanation clearly:
## Error Summary
[One-sentence description of what went wrong]
## What Happened
[Explain the error in plain language]
**Expected:** [What the test expected to happen]
**Actual:** [What actually happened]
## Root Cause
[Explain why this happened - the underlying issue]
## How to Fix
### Option 1: [Most likely fix] ⭐
[Specific code change or action to take]
// Before [problematic code]
// After [fixed code]
**Why this works:** [Brief explanation]
### Option 2: [Alternative fix]
[Another possible solution if Option 1 doesn't apply]
## Verification
[How to verify the fix works]
[command to run test]
## Prevention
[How to avoid this error in the future]
Step 6: Suggest Next Steps
Provide actionable guidance:
If fix is clear:
- Show exact code change
- Provide test command to verify
- Mention related tests to check
If diagnosis needs more info:
- Suggest debugging steps
- Recommend logging/print statements to add
- Propose code to inspect
If issue is environmental:
- Suggest dependency checks
- Recommend configuration verification
- Propose environment comparison
Error Pattern Examples
Example 1: Assertion Failure (Python/pytest)
Error Output:
FAILED tests/test_calculator.py::test_divide - AssertionError: assert 2.5 == 2
Analysis:
## Error Summary
Test expected integer division but got float division result.
## What Happened
**Expected:** `2` (integer)
**Actual:** `2.5` (float)
The test `test_divide` called a divide function with arguments that produce
a decimal result (e.g., 5 / 2 = 2.5) but expected an integer result.
## Root Cause
The implementation uses true division (`/`) which returns floats in Python 3,
but the test expects integer division behavior.
## How to Fix
### Option 1: Update implementation to use integer division ⭐
Before
def divide(a, b): return a / b
After
def divide(a, b): return a // b # Integer division
**Why this works:** The `//` operator performs floor division, returning
integers when both operands are integers.
### Option 2: Update test to expect float result
Before
assert divide(5, 2) == 2
After
assert divide(5, 2) == 2.5
Use this if float division is the intended behavior.
## Verification
pytest tests/test_calculator.py::test_divide -v
## Prevention
- Clarify division requirements in function documentation
- Use type hints: `def divide(a: int, b: int) -> int:`
- Add test cases for both integer and float division scenarios
Example 2: TypeError (JavaScript/Jest)
Error Output:
TypeError: Cannot read property 'name' of undefined
at getUserName (src/user.js:5:20)
at Object.<anonymous> (tests/user.test.js:10:22)
Analysis:
## Error Summary
Attempted to access property 'name' on undefined user object.
## What Happened
**Expected:** User object with 'name' property
**Actual:** `undefined`
Function `getUserName()` tried to access `.name` property on a value that
was undefined, causing a runtime error.
## Root Cause
The user object passed to `getUserName()` was undefined. This commonly
happens when:
- Function called without argument
- Async data not yet loaded
- Database/API query returned no result
## How to Fix
### Option 1: Add null/undefined check ⭐
// Before function getUserName(user) { return user.name; }
// After function getUserName(user) { if (!user) { return null; // or throw error, or return default } return user.name; }
**Why this works:** Defensively handles cases where user might be undefined.
### Option 2: Fix the test to provide valid user object
// Before const name = getUserName(); // Called without argument
// After const name = getUserName({ name: 'Alice', id: 1 });
### Option 3: Use optional chaining (modern JS)
function getUserName(user) { return user?.name ?? 'Unknown'; }
## Verification
npm test -- user.test.js
## Prevention
- Add input validation to functions
- Use TypeScript for type safety
- Define clear function contracts
- Use optional chaining for property access
Example 3: Timeout Error (E2E/Cypress)
Error Output:
Timed out retrying after 4000ms: Expected to find element: [data-testid="submit-btn"],
but never found it.
Analysis:
## Error Summary
Test couldn't find submit button within timeout period.
## What Happened
**Expected:** Element with `data-testid="submit-btn"` to appear on page
**Actual:** Element never appeared within 4 seconds
## Root Cause
Possible reasons:
1. Element takes longer than 4s to render
2. Element has different selector/ID
3. Element only appears under certain conditions
4. JavaScript error preventing element from rendering
## How to Fix
### Option 1: Increase timeout for slow-loading elements ⭐