Advanced Testing Techniques
Property-based testing, mutation testing, and test patterns.
Overview
Master advanced testing techniques.
Property-Based Testing
from hypothesis import given, strategies as st
@given(st.lists(st.integers()))
def test_sort_returns_sorted(lst):
result = sorted(lst)
assert result == sorted(result)
assert len(result) == len(lst)
@given(st.text(), st.text())
def test_concat_length(a, b):
result = a + b
assert len(result) == len(a) + len(b)
# Run with: pytest --hypothesis-show-statistics
Mocking Best Practices
from unittest.mock import Mock, patch, MagicMock
# Mock at the right level
@patch('myapp.services.requests')
def test_api_call(mock_requests):
mock_requests.get.return_value.status_code = 200
mock_requests.get.return_value.json.return_value = {"data": "test"}
result = fetch_data()
assert result["data"] == "test"
mock_requests.get.assert_called_once()
# Use autospec for type safety
mock_db = MagicMock(spec=Database)
mock_db.query.return_value = [{"id": 1}]
Test Fixtures
import pytest
@pytest.fixture(scope="session")
def database():
db = create_test_database()
yield db
db.drop_all()
@pytest.fixture(autouse=True)
def clean_db(database):
yield
database.session.rollback()
def test_user_creation(database):
user = User(name="Alice")
database.session.add(user)
database.session.commit()
assert user.id is not None
Practice
Write property-based tests for a data structure.