name: code-testing description: Generate and run unit and integration tests using pytest (Python) or Jest (JavaScript) with fixtures, mocks, and async support. Use for test-driven development, code review validation, coverage verification, and regression testing. Target 80%+ code coverage. Supports pytest markers, Jest snapshots, and CI/CD integration. Triggers on "test", "TDD", "unit test", "integration test", "test coverage", "pytest", "jest".
Code Testing
Purpose
Generate and run comprehensive unit and integration tests following TDD principles with proper fixtures, mocking, and coverage measurement.
When to Use
- Test-driven development (TDD)
- Code review validation
- Coverage verification
- Regression testing
- CI/CD pipeline integration
- Ensuring code quality
Core Instructions
Python Unit Test (pytest)
import pytest
from my_module import calculate_total
@pytest.fixture
def sample_data():
"""Fixture providing test data"""
return {
"items": [
{"price": 10.0, "quantity": 2},
{"price": 5.0, "quantity": 3}
]
}
def test_calculate_total(sample_data):
"""Test total calculation"""
result = calculate_total(sample_data["items"])
assert result == 35.0
def test_calculate_total_empty():
"""Test with empty list"""
result = calculate_total([])
assert result == 0.0
@pytest.mark.asyncio
async def test_async_function():
"""Test async operations"""
result = await fetch_data()
assert result is not None
assert "id" in result
JavaScript Test (Jest)
import { render, screen } from '@testing-library/react';
import { calculateTotal } from './utils';
import Component from './Component';
describe('calculateTotal', () => {
test('calculates total correctly', () => {
const items = [
{ price: 10, quantity: 2 },
{ price: 5, quantity: 3 }
];
expect(calculateTotal(items)).toBe(35);
});
test('handles empty array', () => {
expect(calculateTotal([])).toBe(0);
});
});
describe('Component', () => {
test('renders correctly', () => {
render(<Component />);
expect(screen.getByText('Hello')).toBeInTheDocument();
});
test('handles async data', async () => {
render(<Component />);
const data = await screen.findByTestId('data');
expect(data).toHaveTextContent('Loaded');
});
});
Mocking External Dependencies
Python (unittest.mock):
from unittest.mock import Mock, patch
@patch('my_module.external_api_call')
def test_with_mock(mock_api):
"""Mock external API"""
mock_api.return_value = {"status": "success"}
result = my_function()
assert result["status"] == "success"
mock_api.assert_called_once()
JavaScript (Jest):
jest.mock('./api', () => ({
fetchData: jest.fn()
}));
import { fetchData } from './api';
test('mocks API call', async () => {
fetchData.mockResolvedValue({ status: 'success' });
const result = await myFunction();
expect(result.status).toBe('success');
expect(fetchData).toHaveBeenCalledTimes(1);
});
TDD Workflow (Red-Green-Refactor)
1. RED: Write Failing Test
def test_new_feature():
"""Test for feature that doesn't exist yet"""
result = new_feature(input_data)
assert result == expected_output
Run test: pytest → ❌ FAILS (feature not implemented)
2. GREEN: Implement Minimum Code
def new_feature(input_data):
"""Minimal implementation to pass test"""
return expected_output
Run test: pytest → ✅ PASSES
3. REFACTOR: Improve Code
def new_feature(input_data):
"""Refactored implementation"""
# Clean, efficient implementation
return process(input_data)
Run test: pytest → ✅ STILL PASSES
Coverage Measurement
Python (pytest-cov)
# Run tests with coverage
pytest tests/ --cov=src --cov-report=html --cov-report=term
# Generate HTML report
pytest --cov=src --cov-report=html
open htmlcov/index.html
# Fail if coverage below threshold
pytest --cov=src --cov-fail-under=80
JavaScript (Jest)
# Run tests with coverage
npm test -- --coverage
# Coverage thresholds in jest.config.js
module.exports = {
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80
}
}
};
Best Practices
Structure Tests (AAA Pattern)
def test_user_creation():
# ARRANGE: Setup test data
user_data = {"name": "John", "email": "john@example.com"}
# ACT: Execute the function
user = create_user(user_data)
# ASSERT: Verify results
assert user.name == "John"
assert user.email == "john@example.com"
assert user.id is not None
Use Descriptive Names
# Good
def test_calculate_total_with_discount_applied():
pass
# Bad
def test_calc():
pass
Test Edge Cases
def test_division_by_zero():
with pytest.raises(ZeroDivisionError):
divide(10, 0)
def test_empty_input():
result = process([])
assert result == []
def test_null_input():
result = process(None)
assert result is None
Use Fixtures for Setup
@pytest.fixture
def database():
"""Setup test database"""
db = create_test_db()
yield db
db.cleanup()
def test_with_db(database):
user = database.create_user("test")
assert user.name == "test"
CI/CD Integration
GitHub Actions
- name: Run tests
run: |
pytest tests/ --cov=src --cov-report=xml
- name: Upload coverage
uses: codecov/codecov-action@v3
with:
files: ./coverage.xml
Output Formats
JUnit XML (for CI):
pytest --junitxml=test-results.xml
JSON (for parsing):
pytest --json-report --json-report-file=report.json
Performance Testing
import pytest
import time
@pytest.mark.benchmark
def test_performance(benchmark):
"""Benchmark function performance"""
result = benchmark(expensive_function, large_input)
assert result is not None
@pytest.mark.timeout(5)
def test_timeout():
"""Test must complete within 5 seconds"""
result = slow_function()
assert result is not None
Dependencies
Python:
pytest- Test frameworkpytest-cov- Coverage pluginpytest-asyncio- Async test supportpytest-mock- Mocking utilities
JavaScript:
jest- Test framework@testing-library/react- React testing@testing-library/jest-dom- Custom matchers
Version
v1.0.0 (2025-10-23)