EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++

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

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

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

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

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

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

Что я еще не понимаю? Прошу пояснить опытных юнит-тестеров, которые применяют юнит-тестирование не один месяц, а лучше не один год.
  • Вопрос задан
  • 2868 просмотров
Пригласить эксперта
Ответы на вопрос 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).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы