我有一个跨平台移动应用程序:
- 90% 使用跨平台 C++ 编写
- 其中 8% 与平台相关(GUI 代码)。对于 iOS,我们使用 Objective C。对于 Android,我们使用 Java。
- 其中 2% 是嵌入式 Webview(WebKit + Webhooks)。
寻找合适的测试框架一直是一项挑战。
我们可以使用 C++ Google 测试框架进行大量测试。然而,我们想要进行端到端测试(如 Selenium),即在 OpenGL View 和 Web View 周围拖动/双击。
我查看了 Appium 和 Selenium,它们可以测试除 OpenGL 接口(interface)(WebvView 触发)以外的所有内容,但我找不到任何 OpenGL 测试示例。
是否有用于测试 OpenGL 应用程序的良好框架?
最佳答案
我之前为 C++(Linux 上的 Qt)和 OpenGL 编写过单元测试。我不知道为什么它也不适用于 Java。
对我有用的是:
抽象化您的 OpenGL 上下文提供程序,以便您的其余代码独立于它。在我的例子中,主应用程序使用了 Qt 的 QGLWidget,但是单元测试使用了一个基于 pbuffer 的应用程序,我可以在完全没有窗口基础设施的情况下创建它(除了指定的 X11 显示)。后来我添加了一个“屏幕外 Mesa”(纯软件 OpenGL 实现),这样他们甚至可以在完全没有 GPU 的 headless 构建机器上工作。
让您的 OpenGL 代码独立于您的 GUI 代码。在我的例子中,OpenGL“渲染引擎”对 Qt 类(例如鼠标事件)一无所知。定义与任何特定 GUI 概念无关的您自己的可测试 API,并为其编写测试。
在单元测试中,使用 glReadPixels 从帧缓冲区中读回内容,或者用一些关于哪些像素应该是特定值的断言来打击它们,或者沿着回归测试路线进行比较帧缓冲区捕获与存储的您知道的图像是好的(来自手动验证,或者因为它是从其他引用模型生成的)。
在任何图像回归测试中允许有一点模糊;大多数 OpenGL 实现产生的输出略有不同。
(我没有这样做,但是...)理想情况下,您希望能够测试 GUI 层,方法是断言它对渲染引擎做出预期的调用顺序以响应 GUI Activity 。如果它这样做了,并且由于上述测试,您对渲染层充满信心……好吧,不需要实际进行渲染。因此,为您的渲染层创建一个合适的模拟对象,以便在 GUI 测试时使用(我想象像“鼠标从这里拖动到那里会导致调用渲染层以设置特定变换矩阵”这样的测试......类似的东西).
希望对您有所帮助!我发现它在.. 引用。 Automated testing for OpenGL application
关于android - 使用 OpenGL 和嵌入式 Webviews 的原生移动应用程序 (iOS/Android) 测试框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21618630/