2009-10-18 83 views
12

我有一个Java应用程序,它使用JOGL来提供大部分的GUI。OpenGL应用程序的自动测试

有哪些你知道的,或已经使用它可以自动的OpenGL应用程序测试(或更多specificly使用JOGL那些)

只是为了更新任何工具:该工具可以在Linux或Windows上运行。

+0

赦免noob问题,但是什么使OpenGL应用程序测试与其他任何应用程序测试不同? – Bahbar 2009-10-20 09:56:26

+1

我的意思是测试OpenGL视图本身。点击,拖动,旋转缩放等....有一些工具可以让你记录你的GUI交互并说一个Swing App并重播它们。您可以为所有核心交互执行此操作,并将其重放为回归测试。我想要一个OpenGL的类似解决方案,但我不知道存在一个。 – hhafez 2009-10-20 21:15:42

回答

10

我已经编写了C++(Linux上的Qt)&之前的单元测试。我不知道任何理由也不应该为Java工作。

这为我工作的事情是:

  • 摘要你的OpenGL上下文提供让你的代码的其余部分是独立的。在我的情况下,主要应用程序使用Qt的QGLWidget,但是unittests使用了一个基于pbuffer的应用程序,我可以在没有窗口基础设施的情况下创建(除了指定的X11 DISPLAY)。后来,我添加了一个“屏幕外Mesa”(纯软件OpenGL实现),所以他们甚至可以在无GPU的无头构建器上工作。

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

  • 在unittests中,使用glReadPixels从帧缓冲区中读取内容,并用某些关于哪些像素应该是特定值的断言命中它们,或者沿着回归测试路线并将帧缓冲区捕获与存储的图像进行比较你知道是好的(无论是从手动验证,还是由其他参考模型生成)。

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

  • (我不这样做,但是......),理想情况下,希望能够通过声明来测试GUI层,它使呼叫的预期序列的渲染引擎响应GUI活动。如果是这样,并且由于上述测试你对渲染层有信心......呃,不需要真正做渲染。因此,创建使用你的渲染层的合适的模拟对象时,GUI测试(我“从这里鼠标拖动到那里的通话效果来渲染层设置一个特定的变换矩阵”想像这样的测试......这样的东西)。

+1

+1对于所有的好建议。对于帧缓冲区比较,我们写了一个小应用程序,它在图像上进行模糊差异,看看感知增量值,而不是绝对像素值。 – 2009-10-21 22:00:39

+0

问题是GUI是一个使用JOGL构建的定制框架。这就是为什么2号不能工作。 例如,我们使用在屏幕上创建图形元素,用户可以使用JOGL与所有人交互。我需要一种方法来自动化用户交互.... – hhafez 2009-10-22 00:55:09

+2

使用任何特定的库来实现GUI应该没有关系。创建一个抽象OpenGL Canvas /框架的GraphicsContext类,以及一个抽象任何GUI功能的GUI类。然后,GUI类实现可以呈现给显示上下文实现,但是您的应用程序不需要关心他们如何一起工作。 – 2009-10-25 11:41:46

2

我一直在想使用的图片,比较工具,如PDiff测试OpenGL的代码,通过拍摄快照,将它们保存到磁盘,并与前回归输出进行比较。那样的话,真正糟糕的东西(缺少纹理)会弹出,但人为的不可感知的东西(例如上面提到的在实现之间的小差异)会很好。上的一个按钮

此外,对于自动化的用户交互,无论是GUI类应具有足够的开放为您发送的事件或拨打“点击”,你必须手动注入OS事件添加到您的应用程序。这是可能的,但更麻烦。如果它是开放源代码,可能更容易打开GUI层。

+0

SSIM(“结构相似性索引”) - http://en.wikipedia.org/wiki/Structural_similarity - 是基于感知考虑的另一种图像比较器。 – timday 2009-10-30 20:24:25

3

您可以测试使用Sikuli它通过在屏幕截图图像识别techonolgy进行UI自动化您的JOGL基础的应用。

我目前正在使用Sikuli功能测试主要基于NASA Worldwind Java SDK(基于JOGL)的Java应用程序。使用Sikuli Java API我的测试套件可以识别OpenGL画布中的图标,点击它们并拖动它们。 Sikuli也可以通过OCR从画布上识别和提取文本,但是这种表现似乎有点碰巧(取决于文本背后的语言,字体,大小和背景颜色)。

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

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