Какие основные инструменты и принципы unit-тестирования в Python

Ответ

В Python для unit-тестирования используются два основных фреймворка:

  1. unittest: Входит в стандартную библиотеку Python. Основан на классах и следует паттернам xUnit.
  2. 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) для анализа того, какая часть кода была выполнена во время тестов. Помогает выявить непротестированные участки.