代码之家  ›  专栏  ›  技术社区  ›  hhafez

OpenGL应用程序的自动测试

  •  12
  • hhafez  · 技术社区  · 15 年前

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

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

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

    3 回复  |  直到 12 年前
        1
  •  10
  •   timday    15 年前

    我以前编写过C++的单元测试(Linux上的Qt)和OpenGL。我不知道任何理由它也不适用于Java。

    对我有用的是:

    • 抽象OpenGL上下文提供程序,使其余代码独立于它。在我的例子中,主应用程序使用了qt的qglwidget,但是unittests使用了一个基于pbuffer的buffer,我可以在没有窗口基础设施的情况下创建它(除了指定的x11显示)。后来我添加了一个“屏幕外的mesa”(纯软件OpenGL实现),这样他们甚至可以在一个没有GPU的无头构建机器上工作。

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

    • 在unittests中,使用glreadpixels从framebuffer中读取内容,或者使用一些关于哪些像素应该是特定值的断言来攻击它们,或者沿着回归测试路径,将framebuffer捕获与存储的图像进行比较,您知道这是好的(通过手动验证,或者因为它是由so生成的)。其他参考模型)。

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

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

        2
  •  3
  •   gb96    12 年前

    您可以使用 Sikuli 它通过屏幕截图上的图像识别技术实现用户界面自动化。

    我现在使用Sikuli来测试一个Java应用程序,它主要基于 NASA Worldwind Java SDK (基于点动)。使用 Sikuli Java API 我的测试套件可以识别OpenGL画布中的图标,单击它们并拖动它们。Sikuli还可以通过OCR识别和提取画布上的文本,但这一功能的表现似乎有点失手(取决于文本背后的语言、字体、大小和背景色)。

    我使用其他工具做了很多自动化的用户界面测试,这些工具通过内省窗口工具(例如Swing、SWT、原生窗口)来工作,并且发现Sikuli的运行速度比这些工具慢得多,但是考虑到它需要在幕后进行大量的图像处理,这是可以理解的。还要注意,Sikuli当前要求应用程序在窗口中运行(而不是在全屏模式下)。

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

        3
  •  2
  •   Macke    15 年前

    我一直在考虑使用图片差异工具,例如 PDiff 要测试OpenGL代码,请获取快照,将其保存到磁盘,并与以前的回归输出进行比较。这样,真正糟糕的东西(缺少纹理)就会出现,但人类无法察觉的事情(如上面提到的实现之间的小差异)会很好地进行。

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