Як я можу підключити вихідний тестовий показ?


19

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

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

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

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

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


3
Вся проблема тут полягає в тому, що ваш тестовий випадок визначається хорошим результатом; але що станеться, якщо цей висновок баггі (хибнопозитивний)? У будь-якому випадку я б розпочав з першої перевірки каркасів; потім перейдіть до випередженої сцени і, нарешті, відкладіть (якщо ви використовуєте це). Ви можете XOR всього зображення, щоб зробити швидке порівняння (повністю чорний прохід). GPU - це справді погана область застосування TDD; але якщо ви придумаєте щось розумне, я хотів би знати.
Джонатан Дікінсон

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


@Адам дякую, що поділився цим. На жаль, для інді, як я, що працює над мобільними іграми , це далеко не можливо :) Це також не відповідає більшості моїх основних вимог.
Нотлеш

@Адам вам обов'язково слід "відповісти" на це посилання. Досить роман.
Джонатан Дікінсон

Відповіді:


8

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

Як зазначено в коментарях, у вас все ще виникне проблема з помилковими позитивами, якщо ви випадково затвердите поганий вихід, але це ОСТАННЯ повідомить вам, коли вихід значно змінився.

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


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

Тест затвердження не є автоматизованим тестом.
zwcloud

@zwcloud: Що ти маєш на увазі? Він автоматично автоматизований після його створення, як і будь-який тест. Просто перше схвалення є частиною авторського процесу.
Джон Гітцен

@JohnGietzen Я не зрозумів це з вашої відповіді. Я думаю, ви повинні чіткіше пояснити ідею тестів на затвердження . Я видаляю голосову заяву, коли відповідь буде оновлена.
zwcloud

6

Я не займаюся ігровим бізнесом, тому, будь ласка, будьте будь-які потенційні дурні та наївні сприйняття

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

А як з проміжним шаром, де ви можете перевірити, чи все добре? Мені спадають дві речі:

  1. Не малюйте безпосередньо, а видайте командний потік, який перетворюється на надання викликів вниз. Командний потік можна перевірити на правильність. Це не кінцевий тест, але ви хочете одиничні тести, а не повні інтеграційні тести.

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


3

Проблема полягає в тому, що 3d-двигунам не потрібно виводити точне зображення біт-за-бітом. Деяка свобода переноситься до тих пір, поки артефакти, викликані нею, не видно глядачеві. Текстура на 1% темніше очікуваного зазвичай не є серйозною проблемою ... зазвичай. За певних умов це може бути візуальний артефакт. І ось у чому проблема: важко судити за автоматизованим тестом, які артефакти помітили б у глядача людини, а які - ні. Тим не менш, автоматичні тести можуть бути використані для простих перевірок правильності, коли вони використовуються на дуже простій геометрії.

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

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

Інша річ, яку ви могли автоматично перевірити, - це вимоги до продуктивності. Однією з таких вимог може бути те, що під час самостійного запуску демо (імітації реальної послідовності з гри) частота кадрів не повинна опускатися нижче 40 Fps на тестовій системі. Це те, що ви можете перевірити автоматично. Що ви не можете перевірити, це те, що візуалізація задовольняє. Але ви можете використовувати такі тести, щоб запобігти розробникам гри, яка виглядає чудово, але не працює належним чином на будь-якій доступній системі до років після запуску (привіт Crytek).

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