您将如何对OpenGL的图形代码进行单元测试或执行最有效的自动化测试?


17

我在C ++中的OpenGL之上编写游戏和随附的图形引擎。我也是良好的编码过程和自动化测试的粉丝。图形输出+测试似乎几乎是不混溶的,因为输出通常仅是可视的,或者非常注重视觉。

例如,想象一下按字节分析渲染到屏幕上的原始图像流-您需要与之比较的测试数据,这很难创建/获取,并且通常渲染的图像在屏幕上并不相同。在不同时间运行时的字节级别-算法中的微小变化将完全破坏该方法。

我正在考虑创建一个可视化的单元测试套件,在其中基本上可以渲染不同的测试场景,显示诸如阴影贴图,动画等之类的内容。作为CI的一部分,这些场景随后将被渲染为视频。具有不同指标的文件(或可能将其保留为可执行文件)。这仍然需要对视频文件进行手动检查,但至少会实现某种程度的自动化和标准化。

你怎么看?我希望有更好的方法?


2
这是一个很好的问题,我想知道您是否会在gamedev.stackexchange.com上得到更好的答案,因为以前可能有更多的人对此进行了处理。
FrustratedWithFormsDesigner 2012年

3
由于您使用的是OpenGL,请考虑研究Khronos小组如何对此API 执行一致性测试。我在前项目中处理过此问题的同事告诉我,Khronos图形测试已接近完美
2012年

@FrustratedWithFormsDesigner谢谢,我完全忘记了gamedev.stackexchange ...我对程序员进行了彻底的搜索,但没有一个。似乎那里的单元测试的大多数答案都集中在通常测试的东西上,所以也许这不是重复的。虽然会检查更多,谢谢:)
Max

Answers:


8

opencv图像处理库通过保存图像并将其与参考图像进行比较来做到这一点-它具有大量的c ++测试功能和宏来处理近似图像匹配等。


我将尝试自己更深入地检查它,但是该页面没有说明任何近似图像匹配。您知道在比较框架的情况下是否可以用于回归测试?然后,我可以直观地检查场景的第一次渲染,将其作为参考,以此类推。OpenCV是否具有可供我使用的现成功能?:p
Max

@max通常有一个测试功能的“黄金”版本,它会生成参考框架,并在创建测试时运行一次。在发行版中,有一些“测试图像比较”宏。我不认为有任何特定的东西可以将openGL缓冲区读回图像,但这很容易
Martin Beckett 2012年

4

您的测试框架可以将其测试图像渲染到缓冲区中,检索渲染的图像,然后将其与先前为此目的生成的“黄金”参考图像进行比较。

对于预期测试结果不会保持完全相同的情况,这将无法正常工作。但是,您可以计算测试图像和参考图像的平方差,并将其与阈值进行比较。

您可能还希望提供日志记录和检查性能数据,因为性能的主要下降是另一种可能的故障模式。


4

即使您无法比较输出图像,至少也可以测试渲染是否正确完成(没有崩溃,长时间等待等)。当然,找到一种检查图像的方法更好,但是即使没有它,您也会从测试中获得一些好处。


2
确实:我将要回答类似的问题(“即使您的单元测试只是盲目地生成视频文件并进行了一些琐碎的测试(例如,长度正确,不是全黑,也不是全白),也可能就足够了以捕获许多回归错误。尤其是那些仅导致函数引发异常的错误。”),但不需要第二个类似的答案,因此在此我只作为评论。
user281377 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.