Advanced Testing Patterns

Python TestingFree Lesson

Advertisement

Advanced Testing Patterns

Test doubles, mocking strategies, and test organization.

Overview

Master advanced testing techniques.

Test Doubles

from unittest.mock import Mock, MagicMock, patch

# Stub - returns predefined values
stub = Mock(return_value="stubbed response")

# Spy - records calls
spy = Mock()
result = spy("arg")
spy.assert_called_once_with("arg")

# Mock - replaces real objects
mock_db = MagicMock()
mock_db.users.find.return_value = [{"name": "Alice"}]

Mocking Strategies

# Patch 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("https://api.example.com")
    assert result == {"data": "test"}

# Context manager mocking
with patch('myapp.utils.datetime') as mock_dt:
    mock_dt.now.return_value = datetime(2024, 1, 1)
    assert get_current_date() == "2024-01-01"

Test Organization

import pytest

class TestUserService:
    @pytest.fixture(autouse=True)
    def setup(self):
        self.service = UserService()
    
    def test_create_user(self):
        user = self.service.create("Alice")
        assert user.name == "Alice"
    
    def test_find_user(self):
        self.service.create("Alice")
        user = self.service.find("Alice")
        assert user is not None

# Parameterized tests
@pytest.mark.parametrize("input,expected", [
    (1, 2),
    (2, 4),
    (3, 6),
])
def test_double(input, expected):
    assert double(input) == expected

Practice

Write comprehensive tests for a complex service layer.

Advertisement

Need Expert Python Help?

Get personalized tutoring, project support, or professional consulting.

Advertisement