Задать вопрос
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++

Всегда ли модульные тесты должны быть независимыми друг от друга?

Большинство евангелистов несущих в массы модульное тестирование утверждают, что такие тесты должны быть независимыми друг от друга. Почему?

Мне кажется это утверждение не совсем верно и вот почему:
Предположим разрабатывая класс a_Car я использую как другой класс an_Engine. Налицо отношение целое - часть. Как вывод полная работоспособность класса a_Car зависит от корректной работы класса an_Engine. Другими словами, если процесс тестирования класса an_Engine показывает что имеет 45% падений из всего набора тестов для an_Engine то это означает, что использовать класс a_Car не следует, т.к. он работает не совсем корректно!

Но большинство евангелистов не смотря на эту очевидную ситуацию продолжают утверждать, что тесты должны быть не зависимыми, почему?

Неужели и в жизни они будут пытаться тронуться с места и завести автомобиль у которого двигатель на 45% не работает?

На мой взгляд куда правильнее говорить о том что : "Класс автомобиль некорректно работает по причине некорректной работы класса Двигателя для которого обнаружено 45% падений" это более честное заявление, которое обосновывает остановку процесса тестирования класса Автомобиль.

Что я еще не понимаю? Прошу пояснить опытных юнит-тестеров, которые применяют юнит-тестирование не один месяц, а лучше не один год.
  • Вопрос задан
  • 2872 просмотра
Подписаться 3 Оценить Комментировать
Ответ пользователя Вячеслав Смирнов К ответам на вопрос (1)
@polarnik
Тестировщик
Раз в тегах есть bdd, то вы уже знаете, что такое Given, а что такое When.

Так вот, два теста зависимы, если начало второго теста не возможно, без предварительного выполнения первого теста (корректного выполнения). Так по началу многие разрабатывают. Тест1 создаёт объект с наименованием objectName123, а Тест2 ищет объект objectName123 в Given и выполняет некие действия с ним в When, плюс десяток проверок успешности выполнения действий в Then.

И так делать не надо по очевидным причинам.

Независимый тест устроен так.
Тест1 создаёт объект objectNameTest1_123 работает с ним, делает десяток проверок в Then.
Тест2 в Given вызывает те же методы, что создают объект в тесте Тест1, создаёт объект objectNameTest2_123, но выполняет одну базовую проверку, или не выполняет никаких проверок на корректность создания вообще (вызывается только часть Given и When из Тест1).

Тест2 предполагает, что Тест1 работает. И если Тест1 упадёт, то не выполняется предусловие начала тестирования для Тест1 (вызываются, ведь, одни и те же методы в одном случае, как основная логика теста, во втором как предусловия). И в отчёте будет видно, какие тесты были были провалены, а какие даже не начались (из-за того, что другие тесты были провалены).

Независимость в том, что Тест2 сам создаёт для себя нужный контекст. Не надеясь, что этот контекст подготовлен во время выполнения предыдущих тестов (Тест1).
Ответ написан