Чи нормально уникати тестування базових класів?


15

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

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

Чи нормально пропустити тестування базового класу?


1
Одне, що я іноді роблю, коли починаю задавати собі це питання, - це спробувати зламати код. Киньте на нього недійсне введення, вкажіть неправильні значення конфігурації тощо
Zymus

Відповіді:


31

Щоб перевірити, чи достатньо для вас тестів, ви можете перевірити покриття коду та покриття вашої гілки, викликане тестами (можливо, за допомогою інструмента покриття, можливо вручну, переглянувши кодові шляхи або за допомогою відладчика).

Якщо ви прийшли до висновку, тести для підкласів дають вам достатньо високе покриття коду базових класів, то додавання подальших тестів очевидно не принесе вам великої користі. З іншого боку, якщо є кодові шляхи, які ви можете протестувати, лише додаючи конкретні тести, використовуючи безпосередньо базовий клас, тоді вам слід пройти цей маршрут.

Інша можлива причина "безпосередньо перевірити базовий клас" полягає в тому, що ви хочете перевірити певну функцію цього класу "ізольовано". Іноді може бути простіше розробити тестові випадки безпосередньо для конкретного методу, а не тестувати цей метод побічно, викликаючи методи своїх підкласів, які використовують цей метод.

Зауважте, що у вас є загальний базовий клас, для якого типовий сценарій використання є отримання підкласу, базовий клас, ймовірно, абстрактний. Тож для тестування такого класу все одно потрібно зробити виведення. У цій ситуації тестування "базового класу безпосередньо", звичайно, може означати додавання спеціальної деривації лише для цілей тестування.


Так, я погоджуюся з прямими одиничними тестами базового класу для більш чітко визначених методів. Те, що я не хотів робити, - це протестувати все метапрограмування, оскільки одиничні тести на підкласах неявно перевіряють цей матеріал.
Натан

4
Проектування класу, який розширює базовий / абстрактний клас, який існує лише в тестовому каталозі і служить лише для викриття / інстанціювання базового класу, є цілком законним і розумним підходом до отримання відповідного висвітлення базового класу та запевнення, що основними методами є працюючи правильно, виділяючи ті складніші класи, які використовуються.

@MichaelT: так. Чи звучить моя відповідь так, що я маю іншу думку з цього приводу?
Doc Brown

@DocBrown зовсім не - ви чітко сформулювали цю точку. Я просто додав додаткове пояснення, яке я написав би у власній відповіді (якби ви цього ще не заявляли). Я не хочу писати відповідь, яка почалася б "Я згоден з усім, що сказав Док, але хочу конкретно зателефонувати та написати більше про ..."

2

Автоматизований тест був створений з користю для програмістів, програмісти не були створені для обслуговування тестів.

У нас є тести, щоб зробити нас більш продуктивними та зменшити кількість «питань», на які скаржаться клієнти.

Отже, з огляду на те, що у вас є поведінкові орієнтовані одиничні тести, що охоплюють усі випадки кожного підкласу, замовнику немає користі для вас, також випробовуючи базовий клас безпосередньо. Це можна підтвердити , змінивши якийсь код у базовому класі та побачивши, чи не виходить тест, наприклад, загальний рядок коду або додавання "не" до заяви "якщо". (Просто перевірка того, що кожен рядок коду охоплюється тестами, недостатньо хороша.)

Тоді нам залишається запитати, чи тест зробить вас більш продуктивними . Це може статися кількома способами.

  • Дозвольте подумати про зрозуміліший код - так як код написаний, це в цьому випадку малоймовірно.
  • Дозволяє вам перевірити деякий код базового класу поодиноко, тому налагоджуйте його швидше, ще раз малоймовірно у тому випадку, коли код вже працює.
  • Дозволяє вам змінити код у базовому класі, не розуміючи подробиць логіки в підкласах - можливо, якщо ви переробляєте код ???

Отже, враховуючи, що підкласи працюють, я не бачу сенсу писати прямі тести для базового класу. Це не сьогодні, щоб не було користі від написання цих тестів на ранній стадії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.