Короткий ответ
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()