Подтвердить что ты не робот

Автоматическое тестирование приложения OpenGL

У меня есть приложение Java, которое использует JOGL для обеспечения большей части графического интерфейса.

Есть ли какой-нибудь инструмент, который вы знаете или использовали, который может автоматизировать тестирование приложений OpenGL (или, более конкретно, тех, кто использует JOGL)

Просто обновить: инструмент может работать как в Linux, так и в окнах.

4b9b3361

Ответ 1

Я уже писал блок-тесты для С++ (Qt в Linux) и OpenGL. Я не знаю, почему он тоже не должен работать на Java.

То, что сработало для меня, это:

  • Сообщите поставщику контекста OpenGL, чтобы остальная часть вашего кода не зависела от него. В моем случае основное приложение использовало Qt QGLWidget, но unittests использовали pbuffer-based, который я мог бы создать без инфраструктуры оконной обработки (кроме назначенного X11 DISPLAY). Позже я добавил "вне экрана Mesa" (чистая программная реализация OpenGL), чтобы они даже работали на безголовой машине сборки без GPU вообще.

  • Сохраняйте код OpenGL независимо от вашего графического интерфейса. В моем случае OpenGL "движок рендеринга" ничего не знал о Qt-классах (например, событиях мыши). Определите свой собственный тестируемый API, который не привязан к каким-либо конкретным концепциям GUI, и напишите тесты для него.

  • В unittests прочитайте содержимое обратно из фреймбуфера с помощью glReadPixels и либо удалите их некоторыми утверждениями о том, какие пиксели должны быть конкретными значениями, либо сходите по маршруту тестирования регрессии и сравните захват фреймбуфера с сохраненным образ, который вы знаете, хорош (либо от ручной проверки, либо из-за того, что он получен из какой-либо другой эталонной модели).

  • Разрешить немного нечеткости при любом тестировании регрессии изображения; большинство реализаций OpenGL дают немного другой результат.

  • (Я этого не делал, но...) В идеале вы хотите проверить уровень GUI, заявив, что он делает ожидаемую последовательность вызовов вашего механизма рендеринга в ответ на активность графического интерфейса. Если это так, и вы уверены в своем уровне рендеринга из-за вышеуказанных тестов... ну, не нужно делать рендеринг. Поэтому создайте подходящий макет объекта вашего слоя рендеринга для использования при тестировании графического интерфейса (я бы предположил, что такие тесты, как "перетаскивание мышью" сюда, приводит к вызову слоя рендеринга, чтобы установить определенную матрицу преобразования "... такие вещи).

Ответ 2

Вы можете протестировать приложение на основе JOGL, используя Sikuli, который выполняет автоматизацию пользовательского интерфейса с помощью технологии распознавания изображений на снимках экрана.

В настоящее время я использую Sikuli для функционального тестирования Java-приложения, которое преимущественно основано на NASA Worldwind Java SDK (который основан на JOGL). Используя Sikuli Java API, мой тестовый набор может распознавать значки в холсте OpenGL, нажимать на них, а также перетаскивать их. Sikuli также может распознавать и извлекать текст с холста с помощью OCR, однако производительность этого, кажется, немного хита и промаха (в зависимости от языка, шрифта, размера и цветов фона за текстом).

Я провел много автоматизированного пользовательского тестирования с использованием других инструментов, которые работают, исследуя инструментарий для оконных инструментов (например, Swing, SWT, родные Windows) и обнаружил, что Sikuli работает намного медленнее, чем это, однако это понятно, учитывая количество обработки изображений, которые необходимо выполнить за кулисами. Также обратите внимание, что Sikuli в настоящее время требует, чтобы ваше приложение запускалось в окне (не в полноэкранном режиме).

Sikuli работает как в Windows, так и в Linux. Я бы порекомендовал вам попробовать. Я не мог найти другого инструмента, способного выполнять этот уровень функционального тестирования приложения на основе OpenGL.

Ответ 3

Я подумывал использовать инструмент picture-diff, например PDiff, чтобы проверить код OpenGL, сделав снимки, сохраняя их на диск и сравнивая с предыдущим выходом регрессии. Таким образом, действительно плохие вещи (отсутствующие текстуры) появляются, но по-человечески незаметные вещи (например, вышеупомянутые небольшие различия между реализацией) проходят через штраф.

Кроме того, для автоматизации взаимодействия с пользователем классы GUI должны быть достаточно открыты для отправки событий или вызова "нажата" на кнопке, или вам нужно вручную вводить события ОС в свои приложения. Это возможно, но гораздо более хлопотно. Может быть проще открыть слой GUI, если он открыт с открытым исходным кодом.