【问题标题】:Automated testing for OpenGL applicationOpenGL 应用程序的自动化测试
【发布时间】:2009-10-18 22:35:09
【问题描述】:

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

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

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

【问题讨论】:

  • 请原谅这个菜鸟问题,但是是什么让 OpenGL 应用程序测试与任何其他应用程序测试不同?
  • 我真正的意思是测试 OpenGL 视图本身。单击、拖动、旋转缩放等....有一些工具可让您记录与 Swing 应用程序的 GUI 交互并重播它们。您可以对所有核心交互执行此操作,并将其作为回归测试进行重放。我想要一个针对 OpenGL 的类似解决方案,但我不知道是否存在。

标签: user-interface opengl jogl automated-tests


【解决方案1】:

我以前为 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 测试时使用(我想像“鼠标从这里拖动到那里会导致调用渲染层以设置特定的变换矩阵”之类的测试......像这样的东西)。

【讨论】:

  • +1 以获得所有好的建议。对于帧缓冲区比较,我们编写了一个小应用程序,该应用程序对查看感知增量而不是绝对像素值的图像进行模糊差异。
  • 问题是 GUI 是使用 JOGL 构建的自定义构建框架。这就是为什么2号不能工作。例如,我们用来在屏幕上创建图形元素,用户可以使用 JOGL 与之交互。我需要一种自动化用户交互的方法......
  • 使用任何特定的库来实现 GUI 应该无关紧要。创建一个抽象 OpenGL 画布/框架的 GraphicsContext 类,以及一个抽象您需要的任何 GUI 功能的 GUI 类。然后,GUI 类实现可以渲染到显示上下文实现,但您的应用不需要关心它们是如何协同工作的。
  • 您有基于 JOGL 的应用程序的 webstarts/演示吗?我也会对 JOGL 测试框架感兴趣。
【解决方案2】:

您可以使用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 的应用程序进行这种级别的功能测试。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    最近更新 更多