Pytest — это популярный фреймворк для тестирования Python-кода. Вот подробное руководство по написанию unit-тестов:
pip install pytest
Тесты в pytest — это обычные функции, начинающиеся с test_
(или методы в классах, начинающихся с Test
).
# test_example.py
def test_addition():
assert 1 + 1 == 2 # Простейший assert (проверка)
Фикстуры позволяют создавать переиспользуемые компоненты для тестов.
import pytest
@pytest.fixture
def sample_data():
return {"a": 1, "b": 2}
def test_sample_data(sample_data): # Фикстура автоматически внедряется
assert sample_data["a"] == 1
Позволяет запускать один тест с разными входными данными.
import pytest
@pytest.mark.parametrize("input,expected", [
(2, 4),
(3, 9),
(4, 16)
])
def test_square(input, expected):
assert input * input == expected
Для проверки, что код вызывает ожидаемое исключение:
import pytest
def test_division_by_zero():
with pytest.raises(ZeroDivisionError):
result = 1 / 0
Позволяют помечать тесты для выборочного запуска.
@pytest.mark.slow
def test_long_operation():
# Тест с длительным выполнением
assert some_long_operation() == expected_result
Запуск только помеченных тестов:
pytest -m slow
Используем unittest.mock
для изоляции тестируемого кода:
from unittest.mock import Mock
def test_api_call():
mock_response = Mock(status_code=200, json=lambda: {"key": "value"})
assert mock_response.status_code == 200
Популярные плагины:
import pytest
from myapp.calculator import Calculator
@pytest.fixture
def calc():
return Calculator()
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(-1, -1, -2),
(0, 0, 0)
])
def test_add(calc, a, b, expected):
assert calc.add(a, b) == expected
def test_divide_by_zero(calc):
with pytest.raises(ValueError, match="Cannot divide by zero"):
calc.divide(10, 0)
Pytest предлагает мощный, но простой инструментарий для unit-тестирования. Ключевые особенности: фикстуры для управления зависимостями, параметризация для тестирования множества сценариев, богатая экосистема плагинов и понятный синтаксис. Начните с простых тестов и постепенно осваивайте более сложные возможности фреймворка.