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 Flask REST API for a task manager with endpoints: POST /api/tasks (create task), GET /api/tasks (list tasks with optional status filter), GET /api/tasks/{id} (get task), PUT /api/tasks/{id} (update task), DELETE /api/tasks/{id} (delete task). Tasks have title, description, and status (todo, in_progress, done).",
"relevant_when": "Agent writes tests for a Flask REST API",
"context": "Proactively verify that agents use Flask's test_client correctly, organize fixtures in conftest.py, test error responses, and use parametrize for validation edge cases.",
"sources": [
{
"type": "file",
"filename": "skills/pytest-api-testing/SKILL.md",
"tile": "tessl-labs/pytest-api-testing"
}
],
"checklist": [
{
"name": "flask-test-client",
"rule": "Tests use Flask's app.test_client() obtained through a pytest fixture, with the app configured in testing mode",
"relevant_when": "Agent sets up a test client for Flask"
},
{
"name": "conftest-fixtures",
"rule": "The client fixture and any database/app fixtures are defined in tests/conftest.py, not in individual test files",
"relevant_when": "Agent creates pytest fixtures for Flask testing"
},
{
"name": "database-isolation",
"rule": "Tests include database reset or isolation so tests do not depend on execution order or leak state",
"relevant_when": "Agent writes tests that interact with a database"
},
{
"name": "tests-error-responses",
"rule": "Tests include at least one test for 404 (nonexistent task) and at least one test for 400 or 422 (invalid input)",
"relevant_when": "Agent writes tests for Flask API endpoints"
},
{
"name": "asserts-json-body",
"rule": "Tests assert the response JSON body shape and content (using response.get_json() or response.json), not just status codes",
"relevant_when": "Agent writes assertions for Flask API responses"
},
{
"name": "uses-parametrize-or-multiple-cases",
"rule": "Tests use @pytest.mark.parametrize or test multiple validation scenarios (e.g., missing title, empty title, invalid status) rather than only testing one invalid input",
"relevant_when": "Agent writes validation tests"
},
{
"name": "tests-filtering",
"rule": "At least one test verifies that the list endpoint correctly filters by status (e.g., GET /api/tasks?status=done returns only done tasks)",
"relevant_when": "Agent writes tests for list endpoints with query parameters"
}
]
}