自动化测试OpenGL应用程序

13

我有一个Java应用程序,使用JOGL提供了大部分的GUI。

您知道是否有任何工具可以自动化测试OpenGL应用程序(或更具体地说,使用JOGL的应用程序)?

更新一下:该工具可以在Linux或Windows上运行。


请原谅我这个新手的问题,但是OpenGL应用程序测试与其他任何应用程序测试有什么不同呢? - Bahbar
1
我真正想测试的是OpenGL视图本身。 点击,拖动,旋转缩放等... 有工具可以允许您记录与Swing应用程序的GUI交互并重放它们。 您可以为所有核心交互执行此操作,并将其作为回归测试重放。 我希望能够找到类似于OpenGL的解决方案,但我不知道是否存在这样的工具。 - hhafez
3个回答

11

我之前已经为 C++(在 Linux 上使用 Qt 和 OpenGL)编写了单元测试,我不知道为什么不能为 Java 编写单元测试。

以下是对我有用的内容:

  • 将你的 OpenGL 上下文提供程序抽象出来,以便你的其余代码独立于它。在我的情况下,主应用程序使用 Qt 的 QGLWidget,但单元测试使用基于 pbuffer 的 QGLWidget,我可以在没有任何窗口基础结构的情况下创建它(除了指定的 X11 DISPLAY)。后来,我添加了一个“离屏 Mesa”(纯软件 OpenGL 实现),所以它们甚至可以在没有 GPU 的无头构建机上工作。

  • 保持你的 OpenGL 代码独立于你的 GUI 代码。在我的情况下,OpenGL“渲染引擎”不知道任何关于 Qt 类(例如鼠标事件)的信息。定义自己可测试的 API,它不与任何特定的 GUI 概念相关,并为其编写测试。

  • 在单元测试中,使用 glReadPixels 从帧缓冲区中读取内容,并使用一些关于哪些像素应该是特定值的断言,或者走回归测试的路线并将帧缓冲捕获与您知道良好的存储图像进行比较(要么是手动验证,要么是因为它由某个其他参考模型生成)。

  • 在任何图像回归测试中允许一些模糊度;大多数 OpenGL 实现产生略有不同的输出。

  • (我没有这样做,但是)理想情况下,您希望通过断言 GUI 层以响应 GUI 活动会使预期的渲染引擎调用序列。如果它这样做,并且你对你的渲染层有信心,因为上述测试......那么实际上不需要进行渲染。因此,为 GUI 测试创建适当的渲染层模拟对象(我想象这样的测试是“从这里拖动鼠标到那里导致调用渲染层来设置特定的变换矩阵”之类的东西)。


1
对于帧缓冲比较,我们编写了一个小应用程序,对图像进行模糊差异处理,考虑到感知差异而非绝对像素值。所有好的建议+1。 - Greg Whitfield
问题在于GUI是使用JOGL构建的自定义框架。这就是为什么第二个无法运行。例如,我们使用JOGL创建屏幕上的图形元素,用户可以与之交互。我需要一种自动化用户交互的方法... - hhafez
2
使用任何特定的库来实现GUI都不应该有影响。创建一个GraphicsContext类,它抽象了OpenGL画布/框架,以及一个GUI类,它抽象了你需要的任何GUI功能。然后,GUI类的实现可以渲染到显示上下文实现中,但是您的应用程序不需要关注它们如何协同工作。 - Lee B
你有基于JOGL的应用程序的Webstarts /演示吗?我也对JOGL测试框架感兴趣。 - whatnick

3
您可以使用Sikuli来测试基于JOGL的应用程序,它通过对屏幕截图进行图像识别技术来执行UI自动化。我目前正在使用Sikuli来功能测试一个主要基于NASA Worldwind Java SDK(基于JOGL)的Java应用程序。使用Sikuli Java API,我的测试套件可以识别OpenGL画布中的图标,并单击它们以及将它们拖动。Sikuli还可以通过OCR识别并提取画布中的文本,但其性能似乎有点不稳定(取决于文本的语言、字体、大小和背景颜色等因素)。
我已经使用过其他工具进行了大量自动化UI测试,这些工具通过内省窗口工具包(如Swing、SWT、本机Windows)工作,并发现Sikuli运行速度比这些工具慢得多,但这是可以理解的,因为它需要在幕后进行大量图像处理。此外,请注意,Sikuli目前需要您的应用程序在窗口中运行(而不是全屏模式)。
Sikuli可在Windows和Linux上运行。我建议您尝试一下。我找不到任何其他工具能够对基于OpenGL的应用程序进行这种级别的功能测试。

2
我一直在考虑使用图片对比工具,例如PDiff来测试OpenGL代码,通过拍摄快照,保存到磁盘并与先前的回归输出进行比较。这样,真正糟糕的东西(缺少纹理)就会浮现出来,但是人类无法注意到的东西(例如上述实现之间的微小差异)可以很好地实现。
此外,为了自动化用户交互,GUI类应该足够开放,以便您发送事件或在按钮上调用“clicked”,或者您必须手动注入操作系统事件到您的应用程序中。这是可能的,但更麻烦。如果它是开源的,打开GUI层可能更容易。

SSIM(“结构相似性指数”)- http://en.wikipedia.org/wiki/Structural_similarity -是另一种基于感知考虑的图像比较器。 - timday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接