Как бы вы провели юнит-тестирование или выполнили наиболее эффективный автоматический тест графического кода для OpenGL?

17

Я пишу игру и сопутствующий графический движок поверх OpenGL на C ++. Я также фанат хороших процессов кодирования и автоматического тестирования. Тестирование графического кода + кажется довольно несмешивающимся, так как вывод часто только визуальный или очень сильно визуально ориентированный.

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

Я подумываю о создании набора визуальных юнит-тестов, в котором я могу в основном воспроизводить различные тестовые сцены, показывая такие вещи, как отображение теней, анимация и т. Д. И т. Д. Как часть CI, эти сцены будут затем отображаться в видео. файл (или, возможно, оставить его как исполняемый файл) с другими метриками. Это по-прежнему требует ручной проверки видеофайла, но по крайней мере это будет несколько автоматизировано и стандартизировано.

Как вы думаете? Я надеюсь, что есть лучшие способы?

Максимум
источник
2
Это хороший вопрос, мне интересно, если вы получите лучшие ответы на gamedev.stackexchange.com, так как там может быть больше людей, которые занимались этим раньше.
FrustratedWithFormsDesigner
3
Поскольку вы используете OpenGL, подумайте о том, как группа Khronos выполняет тестирование соответствия для этого API. Коллеги из моего бывшего проекта, которые имели дело с ним, сказали мне, что тестирование графики Khronos настолько близко к совершенству, насколько это возможно
gnat
@FrustratedWithFormsDesigner Спасибо, я полностью забыл про gamedev.stackexchange ... Я довольно тщательно искал программистов, но не этого. Кажется, что большинство ответов о модульном тестировании сосредоточены на обычно проверенных материалах, так что, возможно, это не дубликат. Проверю еще, хотя, спасибо :)
Макс

Ответы:

8

Библиотека обработки изображений opencv делает это, сохраняя изображение и сравнивая его с эталонным изображением - она ​​имеет набор тестовых функций c ++ и макросов для обработки приблизительного соответствия изображений и т. Д.

Мартин Беккет
источник
Я постараюсь проверить это подробнее, но на этой странице ничего не говорится о приблизительном сопоставлении изображений. Знаете ли вы, будет ли это работать для регрессионного тестирования в случае сравнения кадров? Тогда я мог бы визуально осмотреть первый раз, когда визуализировали сцену, отметить это как ссылку и так далее. Есть ли у OpenCV готовые функции для этого, которые я мог бы использовать? : p
Макс
@max обычно есть «золотая» версия тестовой функции, которая генерирует систему отсчета и запускается один раз при создании теста. В дистрибутиве есть несколько макросов для сравнения тестовых изображений. Я не думаю, что есть что-то конкретное для чтения буферов openGL для изображения, но это достаточно просто
Мартин Беккет
4

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

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

Возможно, вы также захотите предоставить для регистрации и проверки данных о производительности, так как основной регресс в производительности является еще одним возможным режимом сбоя.

comingstorm
источник
4

Даже если вы не можете сравнить выходные изображения, по крайней мере, вы сможете проверить, что ваши рендеринг завершен надлежащим образом (без сбоев, длительного ожидания и т. Д. И т. Д.). Конечно, лучше найти способ проверки изображений, но даже без него вы получите что-то от тестов.

Майкл Кон
источник
2
Точно: я собирался ответить на что-то подобное («Даже если у вас есть модульный тест, который просто слепо генерирует видеофайл и выполняет несколько тривиальных тестов (например, имеет правильную длину, не совсем черный, не полностью белый), этого может быть достаточно». чтобы поймать много ошибок регрессии. Особенно те, которые просто приводят к тому, что ваши функции генерируют исключение. "), но нет необходимости во втором аналогичном ответе, поэтому я оставляю его просто как комментарий здесь.
user281377