$ show pytest-dev/pytest-flask
pytest-flask is a pytest plugin that provides fixtures and helpers for testing Flask applications. It is a library/plugin, not a standalone application. When installed, it registers itself via the `pytest11` entry point and automatically provides fixtures such as `client`, `client_class`, `config`, `live_server`, and `accept_*` headers. It also installs autouse fixtures that push a Flask request context during tests (so `url_for`, `session`, and `request` work without context managers), apply `pytest.mark.options` to the app config, and monkeypatch the app's response class to add JSON-aware comparison helpers. Architecturally, the plugin is a thin layer over pytest's fixture system and Flask's testing utilities. The core entry point is `src/pytest_flask/plugin.py`, which registers CLI options (`--live-server-port`, `--live-server-host`, `--live-server-wait`, `--no-start-live-server`, etc.) and markers. The `live_server` fixture (in `fixtures.py`) uses the `LiveServer` class (in `live_server.py`) to run the Flask app in a separate multiprocessing process, wait for TCP readiness via a socket probe, and shut down cleanly with SIGINT. The plugin depends only on pytest, Flask, and Werkzeug, plus the Python standard library. The codebase is small, well-typed, and thoroughly tested with a test suite that uses pytest's `pytester` to validate plugin behavior in isolated subprocesses. It supports Python 3.8-3.12 and is compatible with Flask 3.x. The project is actively maintained, with recent commits and CI covering multiple OSes and Python versions. It is not a data research repository; it is a developer tool for testing Flask applications.
The LLM identified 2 files worth highlighting for reuse:
LiveServer class manages a Flask application in a separate OS process for integration tests. It binds to a random or fixed port, waits for the server to accept TCP connections using a socket probe (instead of polling HTTP), and supports clean shutdown via SIGINT with a timeout before forceful termination. It forces the 'fork' multiprocessing context on macOS to avoid issues with the default spawn context. The class is self-contained and could be extracted to manage any WSGI server process in a test harness.
Defines a JSONResponse mixin that lets Flask test responses be compared directly to integer status codes (e.g. `assert client.get('/x') == 404`), plus a factory `_make_test_response_class` that dynamically subclasses the app's response class only if it doesn't already define a `json` attribute, preserving user customizations. Also contains autouse fixtures that push a Flask request context and apply `pytest.mark.options` to app config. The mixin/factory pattern is reusable for any testing library that needs to extend response objects without overriding user-defined behavior.