Модульное, или юнит-тестирование – это способ определить правильность работы единичной функции в изоляции от более широкой кодовой базы. Идея в том, что если все отдельные, атомарные единицы приложения обособленно работают как надо, то интегрировать их вместе намного легче.
Почему модульное тестирование – это важно
Модульные тесты – это только одна из форм тестирования. Во время разработки программы они сочетаются с другими подходами к поиску багов.
Когда несколько функций и классов работают вместе, зачастую найти источник проблемы трудно. Особенно если несколько ошибок возникают одновременно.
Юнит-тестирование помогает устранить как можно больше частных оплошностей, чтобы при объединении приложения в единое целое, отдельные его модули работали максимально правильно. Если потом возникают проблемы, их проще отследить. Ведь нередко они кроются уже только в несовместимости компонентов, плохо работающих вместе.
Инструменты для модульного тестирования в Python
Существует множество инструментов для создания тестов в Python. Некоторые, вроде pytest, заменяют встроенный фреймворк для юнит-тестов. Другие, например nose, являются расширениями, облегчающими создание контрольных примеров. Отмечу, что многие из этих инструментов используются также для интеграционного тестирования, позволяя запускать в рамках одного тест-кейса множество фрагментов кода сразу.
- unittest – это встроенная стандартная библиотека для тестирования кода Python.
- pytest – полноценный инструмент для тестирования, с упором на обратную совместимость и минимизацию шаблонного кода.
- nose – расширение для unittest, облегчающее создание и исполнение тестовых примеров.
- Hypothesis – библиотека, помогающая разработчику генерировать тесты, которые проверяют в блоках кода пограничные случаи. Проще всего разобраться с ней, изучив замечательное краткое руководство.
- mimesis – автоматически синтезирует вводные данные для ваших тестов.
- testify – этот тестировочный фреймворк предназначался для замены традиционной комбинации unittest+nose. Однако команда данного проекта переходит на pytest, так что советуем не использовать testify на новых проектах.
Источники информации по модульному тестированию
Модульные тесты полезны в любом проекте, независимо от языка программирования. Следующие англоязычные источники дадут хороший, разносторонний обзор теории юнит-тестирования, а также позволят углубиться в особенности тестирования приложений на Python.
- «Введение в модульное тестирование» предоставляет общий обзор методики юнит-тестирования. Дает представление о его важности и советы о применении в ваших проектах.
- «Тестируем ваше Twilio приложение с использованием Flask и Nose» — подробное руководство по использованию тестировщика nose для проверки приложения, написанного на фреймворке Flask.
- Статья «Понять юнит-тестирование» объясняет, в чем важность этого тестирования, и показывает, как эффективно применять его в ваших приложениях.
- «Модульное тестирование на Python» — это высокоуровневый обзор юнит-тестирования. Здесь вы найдете диаграммы, показывающие, что происходит во время цикла тестирования.
- На Python Wiki имеется страница со списком инструментов и расширений Python для тестирования.
- «Расширенное введение во фреймворк для модульного тестирования nose». Эта статья рассказывает, как писать базовые наборы тестов при помощи nose. Хотя статья вышла еще в 2006 году, она остается актуальной для изучения nose и сегодня.
- «Возвращаясь к модульному и мок-тестированию на Python» — отменный материал со множеством примеров кода. Показывает, как и зачем использовать внедрение зависимостей и @property для создания объектов-заглушек в юнит-тестах.
- «Модульное тестирование влияет на кодовую базу не так, как вы думаете». Исследование о том, как юнит-тесты влияют (и как не влияют) на код проекта. Это лишь отчет об одном исследовании, но он содержит любопытные сведения о том, что увеличение количества модульных тестов приводит к большей цикломатической сложности методов.
- «Python unittest с Робертом Коллинзом». Расшифровка интервью с Робертом Коллинзом, одним из ключевых разработчиков unittest.
- «Точные юнит-тесты с PyHamcrest» — это краткое руководство по использованию инструментария утверждений (assertions) PyHamcrest для юнит-тестирования.
- «Почему большинство модульных тестов бесполезно». Автор размышляет о том, почему юнит-тесты с низким риском редко проваливаются, даже если код изменился. Также он разбирает, почему эти тесты не так важны для стабильности проекта, как принято считать в соответствии с догмами разработки через тестирование (TDD).
- «Написание модульных тестов для Django при миграции» — примеры кода для тестирования миграции данных на Django.
- «Экономическое обоснование юнит-тестирования» приводит доводы для менеджмента в пользу модульного тестирования. В частности, затрагивается вопрос управления рисками и ускорения графика разработки.
- Юнит-тестирование часто требует набора вымышленных данных в качестве вводной информации, которую в реальных условиях обеспечивают пользователи или другие компоненты тестируемой системы. Вместо написания таких данных вручную, их можно сгенерировать при помощи специальных инструментов. Этот пост показывает, как использовать в ваших тестах Faker с различными посевами и результатами.
- «Модульное тестирование приложений с Flask-Login и Flask-SocketIO» объясняет, как построить юнит-тесты для WebSockets с помощью нескольких популярных библиотек Flask.
Обо всех видах тестирования и вообще понимании основ можно почитать на сайте testengineer.ru