Advanced Testing
Mocking, fixtures, parameterized tests, and test patterns.
Overview
Master advanced testing techniques.
Mocking
from unittest.mock import Mock, patch, MagicMock
import requests
# Basic mock
mock_response = Mock()
mock_response.status_code = 200
mock_response.json.return_value = {"result": "success"}
# Patching
@patch('requests.get')
def test_api_call(mock_get):
mock_get.return_value.status_code = 200
mock_get.return_value.json.return_value = {"data": "test"}
result = requests.get("https://api.example.com")
assert result.status_code == 200
mock_get.assert_called_once()
# MagicMock for complex objects
mock_db = MagicMock()
mock_db.users.find.return_value = [{"name": "Alice"}]
users = mock_db.users.find({"active": True})
assert len(users) == 1
Fixtures
import pytest
@pytest.fixture
def sample_data():
return {"users": [{"name": "Alice", "age": 25}]}
@pytest.fixture
def database():
db = create_test_database()
yield db
db.cleanup()
def test_user_creation(sample_data, database):
user = create_user(sample_data["users"][0])
database.save(user)
assert database.get(user.id) is not None
# Parametrized fixtures
@pytest.fixture(params=[1, 2, 3])
def number(request):
return request.param
def test_numbers(number):
assert number > 0
Parameterized Tests
@pytest.mark.parametrize("input,expected", [
(1, 2),
(2, 4),
(3, 6),
(4, 8),
])
def test_double(input, expected):
assert double(input) == expected
# Multiple parameters
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(2, 3, 5),
(3, 4, 7),
])
def test_add(a, b, expected):
assert add(a, b) == expected
Practice
Write tests for an API endpoint with mocking and fixtures.