@Nikitko_Cent

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

Если кратко - то весь вопрос в сабже.
Если более подробно - я в тестировании новичёк, пишу первые в своей жизни тесты (с помощью Google Test Framework) для класса двусвязного списка.
Нужно протестировать, скажем, метод pop_back (удалить последний элемент списка). Но если не использовать другие методы класса, то для того, чтоб хоть как-нибудь наполнить этот список, придётся писать в тесте низкоуровневый код создания узлов, их связывания и т.п. Как быть?
  • Вопрос задан
  • 607 просмотров
Пригласить эксперта
Ответы на вопрос 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. Проверить, что элемент удален.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 07:47
2000 руб./за проект
26 апр. 2024, в 06:46
1000 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект