Ответ
В 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).