Advanced Topics in pytest
pytest is highly flexible, enabling advanced techniques for efficient testing workflows. This section covers combining parameterized tests with fixtures, advanced fixture usage, and integrating pytest with popular frameworks.
Parameterized Tests with Fixtures
Combining parameterized tests with fixtures enables dynamic and reusable test scenarios.
Example: Parameterized Tests with Fixtures
import pytest
# Fixture to provide a base number
@pytest.fixture
def base_number():
return 10
# Parameterized test using fixture and parameters
@pytest.mark.parametrize("multiplier, expected", [(1, 10), (2, 20), (3, 30)])
def test_multiplication(base_number, multiplier, expected):
result = base_number * multiplier
assert result == expected
In this example:
- The
base_number
fixture provides a common starting value. - The
@pytest.mark.parametrize
decorator dynamically tests with multiplemultiplier
andexpected
values.
Advanced Fixture Usage
Autouse Fixtures
Autouse fixtures are automatically applied to all tests within a scope, eliminating the need for explicit inclusion.
Example: Using Autouse Fixtures
import pytest
# Autouse fixture for setup
@pytest.fixture(autouse=True, scope="function")
def setup_environment():
print("Setting up environment...")
yield
print("Tearing down environment...")
def test_example():
print("Running test example.")
assert True
In this example:
- The
setup_environment
fixture automatically applies to each test within the function scope. yield
is used for setup and teardown logic.
Fixture Dependency
Fixtures can depend on other fixtures to create complex setups.
Example: Dependent Fixtures
import pytest
# Database fixture
@pytest.fixture
def db_connection():
return "Database Connection"
# Fixture dependent on db_connection
@pytest.fixture
def db_cursor(db_connection):
return f"Cursor using {db_connection}"
def test_db_cursor(db_cursor):
assert db_cursor == "Cursor using Database Connection"
Integrating pytest with Frameworks
pytest seamlessly integrates with popular frameworks like Django and FastAPI for testing web applications.
Example: Using pytest with Django
-
Install
pytest-django
:pip install pytest-django
-
Configure pytest for Django in
pytest.ini
:[pytest] DJANGO_SETTINGS_MODULE = myproject.settings
-
Write tests using Django models:
import pytest from myapp.models import MyModel @pytest.mark.django_db def test_model_creation(): obj = MyModel.objects.create(name="Test") assert obj.name == "Test"
Example: Using pytest with FastAPI
-
Install
httpx
for testing FastAPI:pip install httpx
-
Write tests for FastAPI endpoints:
from fastapi import FastAPI from fastapi.testclient import TestClient app = FastAPI() @app.get("/items/{item_id}") def read_item(item_id: int): return {"item_id": item_id} client = TestClient(app) def test_read_item(): response = client.get("/items/1") assert response.status_code == 200 assert response.json() == {"item_id": 1}
By mastering these advanced pytest topics, you can optimize your testing workflows and seamlessly integrate pytest with larger systems. This flexibility empowers robust and efficient testing strategies across diverse projects.