Pytest patterns for Python APIs -- httpx AsyncClient, conftest fixtures, database isolation, parametrize edge cases, error response testing, auth flows, factory fixtures
99
99%
Does it follow best practices?
Impact
100%
1.23xAverage score across 5 eval scenarios
Passed
No known issues
{
"instruction": "Write pytest tests for a FastAPI order API with endpoints: POST /api/orders (create order), GET /api/orders/{id} (get order), PATCH /api/orders/{id}/status (update status). Orders have statuses: pending, confirmed, preparing, ready, delivered, cancelled. Test edge cases and validation thoroughly.",
"relevant_when": "Agent writes tests for an API with state transitions or business logic edge cases",
"context": "Proactively verify that agents use parametrize for edge cases, test invalid state transitions, and cover validation errors -- not just happy paths.",
"sources": [
{
"type": "file",
"filename": "skills/pytest-api-testing/SKILL.md",
"tile": "tessl-labs/pytest-api-testing"
}
],
"checklist": [
{
"name": "httpx-async-client",
"rule": "Tests use httpx.AsyncClient with ASGITransport to test the FastAPI app",
"relevant_when": "Agent sets up a test client for FastAPI"
},
{
"name": "uses-parametrize",
"rule": "Tests use @pytest.mark.parametrize to test multiple input variations (e.g., multiple invalid payloads, multiple status transitions) rather than writing separate test functions for each case",
"relevant_when": "Agent writes tests for multiple similar validation cases or edge cases"
},
{
"name": "tests-invalid-status-transition",
"rule": "At least one test verifies that an invalid status transition (e.g., pending -> delivered, cancelled -> preparing) returns an error status code, not 200",
"relevant_when": "Agent writes tests for status update endpoints"
},
{
"name": "tests-validation-errors",
"rule": "Tests verify that creating an order with invalid data (empty body, missing required fields, invalid item references) returns 400 or 422 with an error response body",
"relevant_when": "Agent writes tests for order creation"
},
{
"name": "tests-nonexistent-resource",
"rule": "At least one test verifies that GET or PATCH on a nonexistent order ID returns 404, not 500",
"relevant_when": "Agent writes tests for endpoints that look up resources by ID"
},
{
"name": "factory-fixture-for-orders",
"rule": "Tests use a factory fixture or helper to create orders in a known state rather than repeating the full creation payload in every test",
"relevant_when": "Agent writes multiple tests that need order test data"
},
{
"name": "asserts-response-body",
"rule": "Tests assert the response body content (e.g., verifying order status changed, error message present) not just the HTTP status code",
"relevant_when": "Agent writes assertions for API responses"
}
]
}