Какие основные инструменты для юнит-тестирования существуют в Python

Ответ

В Python для юнит-тестирования наиболее популярны встроенный модуль unittest и сторонняя библиотека pytest.

unittest

Входит в стандартную библиотеку Python. Подход основан на классах, унаследованных от unittest.TestCase.

  • Структура: Тесты организуются в классы.
  • Подготовка: Методы setUp() и tearDown() для подготовки и очистки окружения перед/после каждого теста.
  • Проверки (Assertions): Используются специальные методы: self.assertEqual(), self.assertTrue(), self.assertRaises().

pytest

Считается отраслевым стандартом де-факто благодаря своей простоте и мощным возможностям.

  • Структура: Тесты — это обычные функции, имена которых начинаются с test_.
  • Подготовка: Используются фикстуры (@pytest.fixture) — переиспользуемые функции для подготовки данных и окружения. Это более гибкий механизм, чем setUp/tearDown.
  • Проверки (Assertions): Используется стандартный оператор assert, который pytest дополняет подробными отчетами об ошибках.

Сравнительный пример:

# content of test_add.py
import pytest

def add(a, b):
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        raise TypeError("Both arguments must be numbers")
    return a + b

# Простой тест
def test_add_positive_numbers():
    assert add(2, 3) == 5

# Параметризованный тест для нескольких случаев
@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (-1, 1, 0),
    (0, 0, 0)
])
def test_add_various_cases(a, b, expected):
    assert add(a, b) == expected

# Тест на выброс исключения
def test_add_raises_type_error_on_string_input():
    with pytest.raises(TypeError):
        add("a", "b")

Другие важные инструменты:

  • unittest.mock: Модуль для создания "заглушек" (моков), чтобы изолировать тестируемый код от внешних зависимостей (БД, API, файловая система).
  • tox: Инструмент для автоматизации тестирования в различных окружениях (например, на разных версиях Python).