TL; DR
Писати хороші, корисні тести важко і має високу вартість на C ++. Чи можете ви досвідчені розробники поділитися вашим обґрунтуванням того, що і коли тестувати?
Довга історія
Раніше я робив тестові розробки, вся моя команда, але нас це не спрацювало. У нас є багато тестів, але вони, здається, ніколи не охоплюють випадків, коли у нас є фактичні помилки та регресії - які, як правило, виникають під час взаємодії одиниць, а не від їх окремої поведінки.
Це часто настільки важко перевірити на рівні пристрою, що ми перестали робити TDD (за винятком компонентів, де це дійсно прискорює розвиток), а замість цього вклали більше часу, збільшуючи покриття тесту на інтеграцію. Незважаючи на те, що невеликі тестові одиниці ніколи не виявляли реальних помилок і в основному були лише накладними витратами на обслуговування, інтеграційні тести справді варті зусиль.
Тепер я успадкував новий проект, і мені цікаво, як продовжувати тестувати його. Це рідний додаток C ++ / OpenGL, тому тести на інтеграцію насправді не є варіантом. Але тестування одиниць на C ++ трохи складніше, ніж у Java (ви повинні чітко робити речі virtual
), і програма не сильно орієнтована на об’єкти, тому я не можу глузувати / заглушувати деякі речі.
Я не хочу розривати і OO-ize всю справу просто написати тести заради написання тестів. Тож я запитую вас: для чого я повинен писати тести? наприклад:
- Функції / класи, які, як я думаю, часто змінюватиму?
- Функції / класи, які складніше перевірити вручну?
- Функції / класи, які вже легко перевірити?
Я почав досліджувати деякі шановні бази C ++, щоб побачити, як вони проходять тестування. Зараз я переглядаю вихідний код Chromium, але мені важко витягнути з цього коду обґрунтування тестування. Якщо хтось має хороший приклад або опублікує, як популярні користувачі C ++ (хлопці з комітету, автори книг, Google, Facebook, Microsoft, ...) підходять до цього, це було б корисно.
Оновлення
Я шукав свій шлях по цьому веб-сайту та Інтернету з часу написання цього. Знайшов кілька хороших речей:
- Коли доцільно не проводити одиничний тест?
- /programming/109432/what-not-to-test-when-it- Результа-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
На жаль, все це скоріше орієнтоване на Java / C #. Написання безлічі тестів на Java / C # не є великою проблемою, тому вигода зазвичай переважає витрати.
Але як я писав вище, у C ++ складніше. Тим більше, якщо ваша база коду не є такою, що вам належить, ви повинні сильно зіпсувати речі, щоб отримати хороше покриття тестових одиниць. Наприклад: У додатку, який я успадкував, є Graphics
простір імен, який є тонким шаром над OpenGL. Для того щоб перевірити будь-яку сутність, яка всі безпосередньо використовує її функції, я повинен був би перетворити це на інтерфейс та клас та ввести його у всі сутності. Це лише один приклад.
Тож відповідаючи на це запитання, майте на увазі, що я маю зробити досить велику інвестицію для написання тестів.