Ответ
В Python для unit-тестирования используются два основных фреймворка:
unittest
: Входит в стандартную библиотеку Python. Основан на классах и следует паттернам xUnit.pytest
: Сторонний пакет, ставший де-факто стандартом. Отличается более простым синтаксисом, мощными фикстурами и богатой экосистемой плагинов.
Ключевые принципы unit-тестирования:
- Изоляция: Каждый тест должен быть независим от других. Его результат не должен зависеть от порядка выполнения тестов.
- Атомарность: Один тест проверяет одну конкретную единицу функциональности (например, один метод или функцию с определенным набором входных данных).
- Детерминированность: При одинаковых входных данных тест всегда должен давать одинаковый результат (проходить или падать).
Пример с использованием pytest
:
pytest
позволяет писать тесты в виде простых функций, используя стандартный оператор assert
для проверок.
# a_module.py
def add(a, b):
"""Простая функция сложения чисел."""
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
raise TypeError("Оба аргумента должны быть числами")
return a + b
# test_a_module.py
import pytest
from a_module import add
# Позитивный сценарий
def test_add_positive_numbers():
assert add(2, 3) == 5
# Проверка граничных случаев
def test_add_zero():
assert add(-1, 1) == 0
# Проверка вызова исключения
def test_add_raises_type_error_on_string_input():
with pytest.raises(TypeError):
add("a", 2)
Важные практики:
- Мокинг (Mocking): Использование объектов-заглушек (например, с помощью
unittest.mock
илиpytest-mock
) для изоляции тестируемого кода от внешних зависимостей (базы данных, API). - Фикстуры (Fixtures): Механизм
pytest
для подготовки данных и состояния перед выполнением тестов и очистки после них (например, создание временной БД). - Покрытие кода (Code Coverage): Инструменты (например,
pytest-cov
) для анализа того, какая часть кода была выполнена во время тестов. Помогает выявить непротестированные участки.