Интеграция против юнит-тестов
Вы должны держать свои юнит-тесты и интеграционные тесты полностью разделенными. Ваши модульные тесты должны проверять одно и только одно и в полной изоляции остальной части вашей системы. Единица определена свободно, но обычно сводится к методу или функции.
Имеет смысл иметь тесты для каждого модуля, чтобы вы знали, что их алгоритмы реализованы правильно, и вы сразу знаете, где что пошло не так, если реализация имеет недостатки.
Поскольку вы тестируете в полной изоляции во время модульного тестирования, вы используете объекты-заглушки и макеты, чтобы вести себя как остальная часть вашего приложения. Вот тут-то и вступают интеграционные тесты. Тестирование всех модулей изолированно, но вам нужно знать, действительно ли модули работают вместе.
Это означает, что нужно знать, действительно ли модель хранится в базе данных или действительно выдается предупреждение после сбоя алгоритма X.
Тестовая разработка
Сделав шаг назад и взглянув на Test Driven Development (TDD), следует принять во внимание несколько моментов.
- Вы пишете свой модульный тест, прежде чем на самом деле написать код, который делает его успешным.
- Вы проходите тестирование и пишете достаточно кода для этого.
- Теперь, когда тест пройден, настало время сделать шаг назад. Есть ли что-то, что можно изменить с помощью этой новой функциональности? Вы можете сделать это безопасно, так как все покрыто тестами.
Интеграция первая против интеграции последняя
Интеграционные тесты вписываются в этот цикл TDD одним из двух способов. Я знаю людей, которые любят писать их заранее. Они называют интеграционный тест сквозным тестом и определяют сквозной тест как тест, который полностью проверяет весь путь использования (подумайте о настройке приложения, его начальной загрузке, переходе к контроллеру, его выполнении, проверка результата, вывода и т.д ...). Затем они начинают свой первый модульный тест, проходят его, добавляют второй, проходят и т. Д. Медленно все больше и больше частей интеграционного теста также проходят, пока функция не будет завершена.
Другой стиль - создание функционального модульного теста с помощью модульного теста и добавление интеграционных тестов, которые впоследствии сочтены необходимыми. Большая разница между этими двумя вариантами заключается в том, что в случае интеграционного теста сначала вы должны подумать о дизайне приложения. Этот вид не согласуется с предпосылкой, что TDD касается как разработки приложений, так и тестирования.
практические вопросы
У меня на работе все наши тесты в одном проекте. Однако есть разные группы. Инструмент непрерывной интеграции запускает так называемые модульные тесты. Только в случае успеха выполняются медленные интеграционные тесты (поскольку они делают реальные запросы, используют реальные базы данных и т. Д.).
Кстати, мы обычно используем один тестовый файл для одного класса.
Предлагаемое чтение
- Растущее объектно-ориентированное программное обеспечение, ориентированное на тесты. Эта книга является чрезвычайно хорошим примером методологии интеграционных тестов.
- Искусство юнит-тестирования, с примерами в dot.net О юнит-тестировании, с примерами в dot.net: D Очень хорошая книга о принципах юнит-тестирования.
- Роберт К. Мартин на TDD (бесплатные статьи): Прочтите также первые две статьи, на которые он ссылался.