Можно ли избежать тестирования базовых классов?

15

У меня есть базовый класс с достаточным количеством «метапрограммирования», чтобы придать ему гибкость / абстракцию, которая должна быть достаточно общей.

У меня есть много подклассов, использующих общие методы базового класса, и у меня есть ориентированные на поведение модульные тесты, охватывающие все случаи в каждом подклассе.

Можно ли пропустить тестирование базового класса?

Натан
источник
1
Когда я начинаю задавать себе этот вопрос, иногда я пытаюсь взломать код. Добавьте туда неверный ввод, укажите неправильные значения конфигурации и т. Д.
Zymus

Ответы:

31

Чтобы проверить, достаточно ли у вас тестов или нет, вы можете проверить покрытие кода и покрытие ветви, вызванное тестами (возможно, с помощью инструмента покрытия, возможно вручную, путем просмотра путей кода или с помощью отладчика).

Если вы придете к выводу, что тесты для подклассов обеспечивают достаточно высокий охват кода базовых классов, то добавление дополнительных тестов, очевидно, не принесет вам большой пользы. С другой стороны, если есть пути кода, которые вы можете протестировать, только добавив конкретные тесты, используя базовый класс напрямую, то вам следует пойти по этому пути.

Другая возможная причина для «тестирования вашего базового класса напрямую» заключается в том, что вы хотите протестировать определенную функцию этого класса «в изоляции». Иногда бывает проще спроектировать тестовые случаи непосредственно для конкретного метода, а не только косвенно тестировать этот метод, вызывая методы ваших подклассов, которые используют этот метод.

Обратите внимание, что если у вас есть базовый базовый класс, для которого типичный сценарий использования состоит в получении подкласса, ваш базовый класс, вероятно, является абстрактным. Так что для тестирования такого класса вам все равно нужно сделать вывод. В этой ситуации тестирование «непосредственно базового класса» может означать, конечно, добавление специального деривации только для целей тестирования.

Док Браун
источник
Да, я согласен с прямыми модульными тестами в базовом классе для более определенных методов. Я не хотел тестировать все метапрограммирование, поскольку модульные тесты на подклассах неявно тестируют эти вещи.
Натан
4
Разработка класса, который расширяет базовый / абстрактный класс, который существует только в каталоге test и служит только для раскрытия / создания экземпляров базового класса, является совершенно законным и разумным подходом для получения соответствующего охвата базового класса и уверенности в том, что базовые методы работает правильно в изоляции от тех более сложных классов, которые используются.
@MichaelT: да. Мой ответ звучит так, будто у меня другое мнение по этому поводу?
Док Браун
@DocBrown совсем нет - вы четко сформулировали этот момент. Я просто добавил дополнительное объяснение, которое я написал бы в своем собственном ответе (если бы вы еще этого не заявили). Я не хочу писать ответ, который начинался бы так: «Я согласен со всем, что сказал Док, но хочу конкретно позвонить и написать больше о ...»
2

Автоматизированные тесты были созданы для пользы программистов, программисты не были созданы для обслуживания тестов.

У нас есть тесты, чтобы сделать нас более продуктивными и уменьшить количество «проблем», на которые жалуются клиенты.

Таким образом, учитывая, что у вас есть ориентированные на поведение модульные тесты, охватывающие все случаи в каждом подклассе, заказчику, который также тестирует базовый класс, нет никакой пользы. Это можно подтвердить , изменив некоторый код в базовом классе и посмотрев, провалился ли тест, например, выровнял ли строку кода или добавив «not» к «if if». (Просто проверить, что каждая строка кода покрыта тестами, недостаточно.)

Затем нам остается спросить, сделает ли этот тест вас более продуктивным . Это может произойти несколькими способами.

  • Позвольте вам думать о коде более четко - поскольку код написан, это маловероятно в этом случае.
  • Позволяет вам тестировать некоторый код в базовом классе изолированно, поэтому отлаживайте его быстрее, что в очередной раз маловероятно, поскольку код уже работает.
  • Позволяет вам изменить код в базовом классе, не разбираясь в деталях логики в подклассах - может быть, если вы рефакторинг кода ???

Итак, учитывая, что подклассы работают, я не вижу смысла в написании прямых тестов для базового класса. Это не сегодня, что не было бы пользы от написания этих тестов на раннем этапе.

Ян
источник