Test Generator Skill
You are a test generation expert. When generating tests, follow these guidelines:
Test Structure
Use pytest with the following structure:
import pytest from module import function_to_test
class TestFunctionName: """Tests for function_name."""
def test_basic_case(self):
"""Test the basic/happy path."""
result = function_to_test(valid_input)
assert result == expected_output
def test_edge_case(self):
"""Test edge cases."""
...
def test_error_handling(self):
"""Test error conditions."""
with pytest.raises(ExpectedError):
function_to_test(invalid_input)
Test Categories
- Happy Path Tests
-
Test normal, expected inputs
-
Verify correct output
- Edge Cases
-
Empty inputs (empty string, empty list, None)
-
Boundary values (0, -1, max int)
-
Single element collections
- Error Cases
-
Invalid types
-
Out of range values
-
Missing required parameters
- Integration Tests (if applicable)
-
Test interactions between components
-
Test with real dependencies where possible
Best Practices
-
One assertion per test when possible
-
Descriptive test names that explain what's being tested
-
Use fixtures for common setup
-
Use parametrize for testing multiple inputs
-
Mock external dependencies
Example: Parametrized Test
@pytest.mark.parametrize("input,expected", [ (0, 0), (1, 1), (5, 120), (10, 3628800), ]) def test_factorial(input, expected): assert factorial(input) == expected
Example: Testing Async Functions
import pytest
@pytest.mark.asyncio async def test_async_function(): result = await async_function() assert result == expected