🎉 75% of content is free forever — Unlock Premium from $10/mo →
CW
đŸ’ŧ Servicesâ„šī¸ Aboutâœ‰ī¸ ContactView Pricing Plansfrom $10

Advanced Testing Patterns

Python TestingđŸŸĸ Free 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.

Need Expert Python Help?

Get personalized tutoring, project support, or professional consulting.

Advertisement