12

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

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

只是为了更新:该工具可以在 linux 或 windows 上运行。

4

3 回答 3

10

我之前已经为 C++(Linux 上的 Qt)和 OpenGL 编写了单元测试。我不知道它也不应该适用于 Java 的任何原因。

对我有用的是:

  • 抽象您的 OpenGL 上下文提供程序,以便您的其余代码独立于它。在我的例子中,主应用程序使用了 Qt 的 QGLWidget,但是单元测试使用了一个基于 pbuffer 的应用程序,我可以在没有窗口基础设施的情况下创建它(除了指定的 X11 DISPLAY)。后来我添加了一个“屏幕外 Mesa”(纯软件 OpenGL 实现),因此他们甚至可以在完全没有 GPU 的无头构建机器上工作。

  • 保持您的 OpenGL 代码独立于您的 GUI 代码。在我的例子中,OpenGL“渲染引擎”对 Qt 类(例如鼠标事件)一无所知。定义您自己的可测试 API,它不依赖于任何特定的 GUI 概念,并为其编写测试。

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

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

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

于 2009-10-21T21:52:27.653 回答
3

您可以使用Sikuli测试基于 JOGL 的应用程序,该应用程序通过屏幕截图上的图像识别技术执行 UI 自动化。

我目前正在使用 Sikuli 对主要基于NASA Worldwind Java SDK(基于 JOGL)的 Java 应用程序进行功能测试。使用Sikuli Java API ,我的测试套件可以识别 OpenGL 画布中的图标,单击它们并拖动它们。Sikuli 还可以通过 OCR 识别和提取画布中的文本,但其性能似乎有点失败(取决于文本背后的语言、字体、大小和背景颜色)。

我已经使用其他工具通过内省窗口工具包(例如 Swing、SWT、本机 Windows)进行了很多自动化 UI 测试,发现 Sikuli 运行速度比那些慢得多,但是考虑到图像处理的数量,这是可以理解的它需要在幕后进行。另请注意,Sikuli 当前要求您的应用程序在窗口中运行(而不是全屏模式)。

Sikuli 可在 Windows 和 Linux 上运行。我建议你试试看。我找不到任何其他工具能够对基于 OpenGL 的应用程序进行这种级别的功能测试。

于 2013-03-21T02:38:26.507 回答
2

我一直在考虑使用 PDiff之类的图片差异工具来测试 OpenGL 代码,方法是拍摄快照,将它们保存到磁盘并与之前的回归输出进行比较。这样一来,确实会出现非常糟糕的东西(缺少纹理),但人类不明显的东西(例如上面提到的实现之间的小差异)会很好地处理。

此外,为了自动化用户交互,GUI 类应该足够开放,以便您发送事件或在按钮上调用“单击”,或者您必须手动将操作系统事件注入您的应用程序。这是可能的,但更麻烦。如果它是开源的,可能更容易打开 GUI 层。

于 2009-10-25T10:14:56.637 回答