Определения
Я думаю, что важно определить ваши термины, прежде чем проводить это обсуждение.
Юнит-тест тестирует отдельный блок в изоляции. Для меня это класс. Модульный тест создаст объект, вызовет метод и проверит результат. Он отвечает на вопрос «выполняет ли мой код то, что я намеревался сделать?»
Интеграционный тест тестирует комбинацию двух компонентов в системе. Он сфокусирован на отношениях между компонентами, а не на самих компонентах. Он отвечает на вопрос «работают ли эти компоненты вместе, как предполагалось».
Системный тест тестирует всю систему программного обеспечения. Он отвечает на вопрос «это программное обеспечение работает как задумано?»
Приемочный тест - это автоматизированный способ, позволяющий клиенту ответить на вопрос «это программное обеспечение, как мне кажется, я хочу?». Это своего рода системный тест.
Обратите внимание, что ни один из этих тестов не отвечает на вопросы типа "это программное обеспечение полезно?" или "это программное обеспечение легко в использовании?"
Все автоматизированные тесты ограничены аксиомой " Сквозная связь - это дальше, чем вы думаете " - в конечном итоге человеку приходится садиться перед компьютером и смотреть на ваш пользовательский интерфейс. *
Сравнения
Модульные тесты быстрее и легче писать, быстрее запускать и легче диагностировать. Они не зависят от «внешних» элементов, таких как файловая система или база данных, поэтому они намного проще / быстрее / надежнее. Большинство юнит-тестов продолжают работать при рефакторинге (и хорошие юнит-тесты являются единственным способом безопасного рефакторинга). Они абсолютно требуют, чтобы ваш код был отделен , что сложно, если вы сначала не напишете тест. Эта комбинация факторов делает последовательность Red / Green / Refactor TDD так хорошо работает.
Системные тесты написать сложно, потому что они должны пройти через столько настроек, чтобы попасть в конкретную ситуацию, которую вы хотите протестировать. Они хрупкие, потому что любое изменение в поведении программного обеспечения до этого может повлиять на последовательность, ведущую к ситуации, которую вы хотите протестировать, даже если это поведение не относится к тесту. Они значительно медленнее, чем модульные тесты по аналогичным причинам. Сбои может быть очень трудно диагностировать, потому что может потребоваться много времени, чтобы добраться до точки сбоя, и потому, что в сбое задействовано очень много программного обеспечения. В некоторых программах системные тесты очень сложно автоматизировать.
Интеграционные тесты находятся между ними: их легче писать, выполнять и диагностировать, чем системные тесты, но с более широким охватом, чем модульные тесты.
Рекомендация
Используйте комбинацию стратегий тестирования, чтобы сбалансировать затраты и значения каждой из них.