CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl-labs/pytest-api-testing

Pytest patterns for Python APIs -- httpx AsyncClient, conftest fixtures, database isolation, parametrize edge cases, error response testing, auth flows, factory fixtures

99

1.23x
Quality

99%

Does it follow best practices?

Impact

100%

1.23x

Average score across 5 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

test-flask-api.jsonverifiers/

{
  "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"
    }
  ]
}

tile.json