Задать вопрос
@Nikitko_Cent

Может ли юнит-тест метода класса зависеть также от других методов?

Если кратко - то весь вопрос в сабже.
Если более подробно - я в тестировании новичёк, пишу первые в своей жизни тесты (с помощью Google Test Framework) для класса двусвязного списка.
Нужно протестировать, скажем, метод pop_back (удалить последний элемент списка). Но если не использовать другие методы класса, то для того, чтоб хоть как-нибудь наполнить этот список, придётся писать в тесте низкоуровневый код создания узлов, их связывания и т.п. Как быть?
  • Вопрос задан
  • 618 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
Один тест - одна проблема. Тест должен выявлять СТРОГО одну проблему! Как вывод: не следует делать так, чтобы один тест зависил от другого.

Мне кажется ВЫ не совсем верно понимаете что такое модульный тест. Вот его достаточно верное определение: Unit Test - Definition
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Да, может. Всё, что я здесь пишу, — моё ИМХО, обусловленное вечной нехваткой времени и ошибками в базовых функциях (высокоуровневый код тестировать крайне сложно и я не в курсе, есть ли стандартные методы автоматизации тестирования).

Излишне сложный код тестовых функций также приходится тестировать — поэтому нет ничего зазорного в том, чтобы использовать функции, проверенные другими тестами. Собственные низкоуровневые функции стоит использовать, если они либо проще, либо заводят объект в какое-то контролируемое состояние, которого сложно достичь общедоступным интерфейсом. Таким образом, код теста должен быть примерно такой.
1. Собрать нужный нам список.
2. Проверить, что список в нужном нам состоянии.
3. Удалить один элемент.
4. Проверить, что новое состояние правильное.

В пунктах 2 и 4 проверок может быть много — например, в пункте 2 «список корректно связан, в нём 3 элемента и два последних Б, В», в пункте 4 — «список корректно связан, в нём 2 элемента и последний Б». Главное, чтобы а) проверялась одна концепция — например, «работает удаление с конца»; и б) все концепции, которые нужны для корректной работы теста — например, «конструируется пустой список», «добавить в пустой» и «добавить в конец» — тоже надо проверить.

С зависимостью тестов друг от друга немного неоднозначно. Тесты не должны физически вмешиваться друг в друга: при отладке нужно запускать какое-то подмножество или даже один отказавший тест. Или изменилась внутренняя структура объекта и часть тестов вообще убираем, так как пропадает тестируемая концепция. А логическая — «если добавление не работает, этот тест бессмысленный» — да никаких проблем!
Ответ написан
@slvABTOP
Не может зависеть. Писать низкоуровневый код
Ответ написан
Комментировать
@Nikitko_Cent Автор вопроса
Мнения рознятся. Значит ли это, что однозначного ответа на мой вопрос нет?
Ответ написан
@immortal-true
Ну вообще согласно определения Юнит-тестирования, один тест тестирует один метод. Если тесту требуются какие-то вводные данные, то вы подсовываете ему "болванку". Так что сценарий теста будет скорее такой:
1. Создать (хардкодом) список.
2. Удалить элемент (с помощью тестируемого метода).
3. Проверить, что элемент удален.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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