pytest-asyncio
The pytest plugin that lets you write and run async/await test functions and fixtures directly.
Repository Health
Technical Analysis
pytest-asyncio is a pytest plugin that makes it possible to write coroutine test functions and have pytest execute them correctly — no manual event-loop boilerplate required. Marking a test @pytest.mark.asyncio (or enabling the asyncio_mode = auto config option) lets you await code inside the test body just like you would in application code, and pytest-asyncio takes care of driving the event loop and running the coroutine to completion.
Maintained under the pytest-dev organization alongside pytest itself, it’s the de facto standard way to test asyncio-based Python code with pytest, supporting async fixtures with configurable scope (function, module, session), parametrized event loops, and custom loop factories. It explicitly does not support unittest.TestCase subclasses, pointing users instead to unittest.IsolatedAsyncioTestCase or an async-aware test framework for that case.
What You Get
- pytest.mark.asyncio to mark individual coroutine functions as pytest test items
- An asyncio_mode = auto configuration option that treats every async def test/fixture as async automatically, without per-test markers
- Async fixtures with configurable scope (function, class, module, session) via @pytest_asyncio.fixture
- Support for custom event loop factories and parametrized event loop configurations across a test session
- Integration with pytest’s existing fixture, parametrization, and collection machinery so async tests behave like any other pytest test
Common Use Cases
- Unit and integration testing of asyncio-based application code (async web frameworks, async DB clients, async task queues)
- Testing async context managers and async generators used as pytest fixtures with proper setup/teardown scoping
- Running the same async test logic against multiple event loop configurations via parametrization
- Migrating a codebase from manual asyncio.run()-wrapped tests to native async def test functions
Under The Hood
Architecture — The entire plugin lives in a single, focused module, pytest_asyncio/plugin.py (1,140 lines), which hooks into pytest’s collection and fixture machinery to detect async def test functions and fixtures, wrap them in an event loop runner, and manage loop lifecycle/scope so fixtures and tests sharing a scope share the same running loop. __init__.py exposes the small public surface (fixture, marker registration) that users actually import.
Tech Stack — Pure Python with pytest as its only required dependency (plus typing-extensions on older Pythons), designed to work with any asyncio-based code without also depending on a specific async framework (no forced dependency on Tornado, Trio, etc.) — it strictly targets Python’s built-in asyncio.
Code Quality — Exceptionally thorough test suite: 37+ test modules covering markers, fixture scopes (tests/modes/), event loop factories, subprocess handling, doctest support, Hypothesis-based property tests, and even task-cleanup edge cases — unusually deep coverage for a plugin of this size, backed by Codecov reporting and CI across supported Python versions. py.typed is shipped, signaling committed type-hint support for consumers.
API Design — The @pytest.mark.asyncio / asyncio_mode=auto split is a deliberate ergonomics choice: teams can opt into per-test explicitness or blanket-enable async support project-wide once they’ve standardized on it. The README is upfront about a real limitation (no support for unittest.TestCase subclasses) rather than leaving users to discover it via a confusing failure, which meaningfully shortens the debugging loop for newcomers.
Used by 49 apps in this directory
PostgresML
AI Development · Databases
Run ML training and LLM inference natively inside PostgreSQL with GPU acceleration — no data movement required.
PostHog
Ab Testing Experimentation · Analytics · Developer Tools
The all-in-one open source product platform combining analytics, session replay, feature flags, error tracking, AI observability, and a built-in data warehouse in a single self-hostable stack.
PrivateGPT
AI Development
The open-source API layer that turns local LLMs into production private AI applications with full Claude API compatibility
Promptfoo
AI Development
An open-source CLI and library for evaluating and red-teaming LLM applications — replace trial-and-error prompt engineering with systematic evals, vulnerability scanning, and CI/CD integration.
QRev
AI Agents · CRM
Open source AI-first sales platform that replaces Salesforce with autonomous agents handling prospecting, outreach, and lead management at scale.
Rasa Open Source
AI Assistants · AI Development · Voice AI
Rasa Open Source is a Python machine learning framework for building contextual, multi-turn chatbots and voice assistants that understand natural language and maintain conversation state.
Rivet
AI Agents · Developer Tools
Stateful actors as a primitive for AI agents, real-time collaboration, and durable execution — with in-memory state, WebSockets, queues, and scheduling built in.
rowboat
AI Assistants · AI Development
Build, test, and deploy multi-agent AI workflows with a visual editor, RAG data sources, MCP tool integration, and a production-ready REST API.
Scalar
Developer Tools
Beautiful, interactive OpenAPI documentation with a built-in offline-first API client and multi-language code generation — all in one open-source platform.