Короткий ответ
unittest — встроенный в стандартную библиотеку фреймворк модульного тестирования в стиле xUnit: тесты оформляются классами на базе unittest.TestCase, проверки — методами-утверждениями. pytest позволяет писать тесты как простые функции с обычным assert, автоматически обнаруживает тесты и имеет множество плагинов, при этом умеет запускать и unittest-тесты.
Как это работает подробнее
Оба инструмента решают одну задачу, но по-разному организуют код тестов, а pytest дополнительно умеет работать с unittest-тестами.
- Стиль unittest. Класс наследует
unittest.TestCase, каждый тест — метод с именем наtest_, проверки выполняются черезassertEqual(),assertTrue(),assertIn()и подобные. - Подготовка окружения. Метод
setUp()готовит фиксированное окружение перед каждым тестом, чтобы результаты были воспроизводимы. - Запуск unittest. Набор запускается через
unittest.main()или командой запуска файла с флагом-v; возможные исходы — OK, FAIL или ERROR. - Философия pytest. Минимум шаблонного кода: тесты-функции, обычные выражения
assert, автообнаружение тестовых файлов и методов, богатая экосистема плагинов. - Совместимость. pytest может запускать тесты, написанные в стиле unittest, поэтому он часто становится единым раннером.
Пример кода
Тест в стиле unittest
import unittest
def add(a, b):
return a + b
class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(1, 2), 3)
if __name__ == '__main__':
unittest.main()Что использовать на практике
- Новые проекты. Обычно выбирают pytest: меньше шаблонного кода и больше плагинов.
- Стандартная библиотека. unittest всегда доступен «из коробки» и не требует установки дополнительных зависимостей.
- Смешанная кодовая база. pytest можно использовать как общий раннер для тестов, написанных в обоих стилях.
Подводные камни
- Шаблонный код. В unittest тесты привязаны к классам и специальным методам утверждений, поэтому код получается многословнее.
- Префикс test_. Метод без имени, начинающегося с
test_, молча не запускается — ошибку легко пропустить. - Несогласованность. Одновременное использование двух стилей в одном проекте усложняет чтение, лучше выбрать основной.
Как отвечать на собеседовании
- Расскажи, что unittest — встроенный xUnit-фреймворк с классами и методами-утверждениями → сравни с pytest, где тесты — функции с обычным assert и есть плагины → упомяни совместимость и рекомендацию: pytest для новых проектов, unittest — когда нужен инструмент «из коробки».