| name | generate-missing-tests |
| description | Homeostatic actuator auto-generating missing tests for requirements with low coverage. Creates unit tests, edge cases, and error cases for REQ-* without sufficient test coverage. Use when validate-test-coverage detects gaps. |
| allowed-tools | Read, Write, Edit, Bash, Grep, Glob |
generate-missing-tests
Skill Type: Actuator (Homeostasis) Purpose: Auto-generate missing tests to achieve coverage goals Prerequisites: Requirements exist, code exists, coverage gaps detected
Agent Instructions
You are an Actuator correcting test coverage deviations.
Desired State: coverage >= 80% for all requirements
Your goal is to generate missing tests to close coverage gaps.
Workflow
Step 1: Receive Coverage Gaps
Input from sensor (validate-test-coverage):
coverage_gaps:
- req: <REQ-ID>
code: src/payments/payment.py
current_coverage: 72.1%
target_coverage: 80%
uncovered_lines: [45, 67-72, 89]
missing_tests:
- Edge case: amount = 0
- Error case: invalid card token
- Boundary: amount = max_limit
- req: REQ-F-CART-001
code: src/cart/cart.py
current_coverage: 0%
target_coverage: 80%
missing_tests: ALL
Step 2: Analyze Uncovered Code
For each gap, determine what tests are needed:
# Uncovered code in src/payments/payment.py:45
def process_payment(amount: float, card_token: str) -> PaymentResult:
if amount <= 0: # Line 45 - UNCOVERED
return PaymentResult(success=False, error="Invalid amount")
# ... rest of implementation
# Missing test:
def test_payment_fails_with_zero_amount():
# Validates: <REQ-ID> (edge case)
result = process_payment(0.0, "tok_visa")
assert result.success == False
assert result.error == "Invalid amount"
Step 3: Generate Test Cases
Test generation patterns:
Pattern 1: Happy Path (if missing):
# Validates: <REQ-ID>
def test_process_payment_success():
"""Test successful payment processing"""
result = process_payment(100.00, "tok_visa")
assert result.success == True
assert result.charge_id is not None
Pattern 2: Edge Cases:
# Validates: <REQ-ID> (edge case: zero amount)
def test_payment_with_zero_amount():
result = process_payment(0.0, "tok_visa")
assert result.success == False
# Validates: <REQ-ID> (edge case: max amount)
def test_payment_at_max_limit():
result = process_payment(10000.00, "tok_visa")
assert result.success == True
Pattern 3: Error Cases:
# Validates: <REQ-ID> (error: invalid token)
def test_payment_with_invalid_token():
result = process_payment(100.00, "invalid_token")
assert result.success == False
assert "invalid" in result.error.lower()
Pattern 4: Boundary Tests:
# Validates: <REQ-ID>, BR-005 (boundary: min amount)
def test_payment_below_minimum():
result = process_payment(0.005, "tok_visa") # Below $0.01 minimum
assert result.success == False
def test_payment_at_minimum():
result = process_payment(0.01, "tok_visa") # Exactly at $0.01
assert result.success == True
Step 4: Write Test File
Create or update test file:
# tests/payments/test_payment.py
# Generated tests for <REQ-ID>
# Validates: <REQ-ID>
# Business Rules: BR-001, BR-002, BR-003, BR-004, BR-005
# Generated: 2025-11-20 by generate-missing-tests skill
import pytest
from src.payments.payment import process_payment, PaymentResult
class TestPaymentProcessing:
"""Tests for <REQ-ID>: Payment processing"""
def test_process_payment_success(self):
"""Test successful payment (happy path)"""
# Validates: <REQ-ID>
result = process_payment(100.00, "tok_visa")
assert result.success == True
assert result.charge_id is not None
def test_payment_with_zero_amount(self):
"""Test payment fails with zero amount"""
# Validates: <REQ-ID> (edge case)
# Generated to cover line 45
result = process_payment(0.0, "tok_visa")
assert result.success == False
assert result.error == "Invalid amount"
def test_payment_with_negative_amount(self):
"""Test payment fails with negative amount"""
# Validates: <REQ-ID> (edge case)
result = process_payment(-50.00, "tok_visa")
assert result.success == False
def test_payment_with_invalid_token(self):
"""Test payment fails with invalid card token"""
# Validates: <REQ-ID> (error case)
# Generated to cover lines 67-72
result = process_payment(100.00, "invalid_token")
assert result.success == False
def test_payment_below_minimum_amount(self):
"""Test payment below $0.01 minimum"""
# Validates: BR-005 (boundary test)
result = process_payment(0.005, "tok_visa")
assert result.success == False
def test_payment_at_minimum_amount(self):
"""Test payment exactly at $0.01"""
# Validates: BR-005 (boundary test)
result = process_payment(0.01, "tok_visa")
assert result.success == True
def test_payment_at_maximum_amount(self):
"""Test payment at $10,000 limit"""
# Validates: BR-005 (boundary test)
result = process_payment(10000.00, "tok_visa")
assert result.success == True
def test_payment_above_maximum_amount(self):
"""Test payment above $10,000 limit"""
# Validates: BR-005 (boundary test)
# Generated to cover line 89
result = process_payment(10001.00, "tok_visa")
assert result.success == False
Generated: 8 tests to cover all uncovered lines and business rules
Step 5: Run Generated Tests
Verify generated tests pass:
pytest tests/payments/test_payment.py -v
Expected: All generated tests PASS ✅
If tests fail: Fix implementation (test found a bug!)
Step 6: Re-Check Coverage
Run coverage again:
pytest --cov=src/payments/payment.py tests/payments/test_payment.py
Results:
Before: 72.1% coverage (28 uncovered lines)
After: 95.3% coverage (2 uncovered lines - error handling)
Improvement: +23.2% coverage
Remaining gaps: 2 lines (acceptable or generate more tests)
Step 7: Commit Generated Tests
git add tests/payments/test_payment.py
git commit -m "GEN: Generate missing tests for <REQ-ID>
Auto-generate tests to improve coverage from 72.1% to 95.3%.
Tests Generated (8):
- Happy path: test_process_payment_success
- Edge cases: zero amount, negative amount
- Error cases: invalid token
- Boundary tests: min/max amounts (4 tests)
Coverage Improvement:
- Before: 72.1% (28 uncovered lines)
- After: 95.3% (2 uncovered lines)
- Improvement: +23.2%
Generated by: generate-missing-tests skill
Triggered by: validate-test-coverage sensor (detected gap)
Validates: <REQ-ID>, BR-005
Tests: 8 tests, all passing ✓
"
Output Format
[GENERATE MISSING TESTS - <REQ-ID>]
Coverage Gap Detected:
Current: 72.1%
Target: 80%
Gap: -7.9%
Uncovered Lines: 28 lines
- Lines 45: Zero amount check
- Lines 67-72: Invalid token handling
- Line 89: Amount above maximum
Test Generation Strategy:
✓ Happy path (1 test)
✓ Edge cases (2 tests: zero, negative)
✓ Error cases (1 test: invalid token)
✓ Boundary tests (4 tests: min/max boundaries)
Generated Tests (8):
✓ test_process_payment_success (happy path)
✓ test_payment_with_zero_amount (edge case)
✓ test_payment_with_negative_amount (edge case)
✓ test_payment_with_invalid_token (error case)
✓ test_payment_below_minimum_amount (boundary)
✓ test_payment_at_minimum_amount (boundary)
✓ test_payment_at_maximum_amount (boundary)
✓ test_payment_above_maximum_amount (boundary)
Running generated tests...
✓ All 8 tests PASSING
Coverage Re-Check:
Before: 72.1%
After: 95.3%
Improvement: +23.2% ✅
Remaining Uncovered: 2 lines (error handling - acceptable)
Commit: GEN: Generate missing tests for <REQ-ID>
✅ Test Generation Complete!
Coverage goal achieved (95.3% > 80%)
Homeostasis achieved ✓
Prerequisites Check
Before invoking:
- Coverage gaps identified (from validate-test-coverage)
- Code to test exists
- Requirement details available (REQ-, BR-)
Test Generation Strategies
Strategy 1: From Business Rules
Use BR- to generate tests*:
BR-005: Amount between $0.01 and $10,000
→ Generate:
- test_amount_below_min (0.005)
- test_amount_at_min (0.01)
- test_amount_valid (100.00)
- test_amount_at_max (10000.00)
- test_amount_above_max (10001.00)
Strategy 2: From Uncovered Lines
Analyze uncovered code paths:
if amount <= 0: # UNCOVERED
return error()
→ Generate: test with amount = 0, amount = -1
Strategy 3: From Code Structure
Identify test patterns from code:
- If/else branches → Test both paths
- Try/except → Test exception path
- Loops → Test empty, single, multiple
- Return values → Test all possible returns
Notes
Why auto-generate tests?
- Closes coverage gaps automatically
- Saves developer time (no manual test writing)
- Consistent quality (all tests follow same pattern)
- Homeostasis (system self-corrects to desired coverage)
Generated tests are starting point:
- Review and improve generated tests
- Add domain-specific assertions
- Refine test data for realism
Homeostasis Goal:
desired_state:
coverage: >= 80%
all_requirements_tested: true
critical_paths: 100%
"Excellence or nothing" 🔥