Advanced Testing

Python TestingFree Lesson

Advertisement

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.

Advertisement

Need Expert Python Help?

Get personalized tutoring, project support, or professional consulting.

Advertisement