TL; DR: да, имеет смысл иметь интеграционные тесты, предполагающие, что другие стратегии тестирования разделяют ответственность за обнаружение ошибок.
Я думаю, вы обнаружите, что здесь есть две разные идеи, которые смешиваются.
Одной из проблем является независимая проверка .Есть много тестов, которые вы можете запустить, чтобы продемонстрировать, что данное решение внутренне непротиворечиво, но это не эквивалентно демонстрации того, что данное решение является правильным.Для последнего обычно требуется запросить у испытуемого данные и затем провести независимую оценку.
UltimateAnswer lifeTheUniverseAndEverything = deepThought()
// Compare this
assertEquals(new UltimateAnswer(42), lifeTheUniverseAndEverything);
// to this
assertEquals(42, lifeTheUniverseAndEverything.toInt());
Что считается независимым?Я считаю, что это нечеткая строка - если у нас было достаточно тестов, чтобы иметь какое-то произвольное число девяток с уверенностью в UltimateAnswer :: equals, то было бы неплохо рассматривать эту проверку как независимую.С другой стороны, я был сожжен, по крайней мере, дважды, используя независимые от домена примитивы для «независимой» проверки того, что все работает, только для того, чтобы обнаружить, что я фактически выполняю зависимую проверку, и тесты не удавались.поймать ошибку, которую я ожидал.
Вторая проблема связана с подгонкой - часто бывает так, что ряд различимых видов поведения может быть удовлетворительным.Пример: каким должен быть результат List.shuffle()
?Если тесты предназначены для описания ваших требований , то они будут более щадящими, чем тесты, в которых документируется пример поведения.
Строго подогнанные тесты фантастичны, когда ваша основная деятельность заключается в рефакторинге, иВы пытаетесь проверить, что внесенные вами изменения действительно сохраняют точное поведение вашей системы.Они могут быть паршивыми при тестировании новой системы с небольшим отклонением ядра в поведении, которое проявляется везде (рассмотрим тесты, которые проверяют выходные строки после изменения требований к форматированию даты).
На мой взгляд, ни одно из этихпроблемы особенно отличаются для "интеграционных тестов" против "модульных тестов".По общему признанию, часть проблемы состоит в том, что никогда не ясно, из какого определения этих идей работает другой человек.
В большинстве случаев различные виды тестов имеют различные компромиссы.Мы хотим, чтобы наша проверка была экономически эффективной.Поэтому, вероятно, у нас будет многоуровневая стратегия тестирования, в которой виды проверок, которые мы реализуем, зависят от контекста.