Як проводити тестування одиниць в ігровому двигуні?


23

На жаль, я ніколи не писав належного тестового підрозділу, лише невеликі неорганізовані програми тестування, якими я б розпоряджався після успіху тесту. Я насправді не маю чіткого уявлення про те, як слід проводити тестування в ігровому проекті. (Моя мова - C ++.)

Чи повинен я мати окремий проект для кожної підсистеми свого двигуна і пов'язаний з ним тест, а потім мати більш масштабний проект / рішення, що будує фактичний двигун? Скажімо, наприклад, eventу мене в моторі є модуль; як мені це впоратися?


Цікаве запитання, коли ви розробляєте движок, перевірити функціональність досить просто, а як же великий проект в ігровому тесті?
Євген

2
Не соромно: одиничні тести не є автоматично гарною справою.
o0 '.

1
Якщо ви ніколи не пробували використовувати одиничні тести, це однозначно прикро.
Крістофер Джонсон

Відповіді:


18

По-перше, вам знадобиться блок тестування одиниць. Раніше я використовував UnitTest ++ та Google Test . Перший дуже легкий, а другий більш характерний, але дещо громіздкий. Він добре поєднується з Google Mock, якщо вам потрібні такі речі. Звичайно, існує багато інших варіантів: див. Цей список (можливим автором UnitTest ++) та Вікіпедію, наприклад.

Тестування підрозділу - це написання орієнтованих тестів, щоб підкреслити окремі незалежні біти коду ("одиниці") за різних сценаріїв. Хоча в деяких випадках ви можете протестувати все, зазвичай не практично досягти 100-відсоткового покриття, і, особливо в іграх, може бути досить складно - можна сперечатися, чи те, чи одиничне тестування результатів рендерінгу має сенс, корисне чи "справжній" одиничний тест незалежно.

Важливо пам’ятати, що будь-яке (автоматизоване) тестування краще, ніж ніяке (автоматизоване) тестування. Тож не варто занадто наголошувати на тому, що ваші тести не є "справжніми одиничними тестами", і пишатися тим, що у вас просто є тести. Рамки тестування блоків, як правило, корисні для того, щоб будувати більш "тісні" тести, оскільки вони включають функціональність для тестів на упаковку та рівномірно повідомляти про несправності.

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

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

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


3
If you have to [...] spend significantly more time writing the tests [...] than it took you to author the module... Тоді ваш модуль занадто складний. Спростіть його зараз, ви в майбутньому подякуєте собі!
Джесс Телфорд

3
@Jess Модуль, який непропорційно важко перевірити, не обов'язково спрощувати. Є багато областей, де тестування одиниць просто не є корисним використанням часу. Сюди входить графіка, де вихід може бути різним і може бути прийнятним; код, який навряд чи зміниться в майбутньому; або код, де вид абстрактного, роз'єднаного дизайну, який був би необхідний для полегшення тестування одиниць, є набагато більш неприємним, більш схильним до помилок, менш ефективним або менш інтуїтивним.
Кейсі Родармор

@rodarmor - погодився. Існує розсувна шкала того, що підходить, а що ні. Як і у всіх подібних видах відповідей, один розмір підходить не всім :)
Джесс Телфорд

Для UnitTest ++ перейдіть на сторінку github.com/unittest-cpp/unittest-cpp . Все інше застаріло.
Маркус


4

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

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

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

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