1

假设这是我的代码:

public void render(){
    GL11.glClearColor(0, 0, 1, 1);
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    GL11.glColor3f(.5f, .5f, 1.0f);
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex3f(0,0,0);
        GL11.glVertex3f(50,0,0);
        GL11.glVertex3f(50,50,0);
        GL11.glVertex3f(0,50,0);
    GL11.glEnd();
}

如何编写单元测试以确保将正方形绘制在应在的位置并以正确的颜色绘制?我是否也应该测试诸如屏幕在每一帧上被清除的东西?我在想我会把openGL代码从我的方形代码中抽象出来。换句话说,我将创建一个创建“向量”的类,然后它的渲染函数将绘制到屏幕上,我不会对此进行测试。但是,您应该测试每个公共函数。Sooo 我想它又回到了:我怎么知道在 openGL 屏幕上绘制了什么?

另外,现在我想一想,我不应该每次运行测试时都运行我的应用程序,这可能会带来另一个层次的复杂性......

4

2 回答 2

1

测试渲染行为非常困难。单元/集成测试在检查屏幕以查看是否正确时非常糟糕。

我认为你最好的选择是使用 Powermock 之类的东西来拦截静态 OpenGL 调用(我不会在这里费心介绍如何做到这一点,因为他们的网站有大量此类信息)。

但是您可以检查调用并确定是否调用了正确的内容。

于 2012-08-20T02:37:39.037 回答
1

当然,您需要将 GL11 库包装在另一个适配器中,然后模拟该适配器。然后你可以证明你的班级传递了正确的坐标和正确的颜色。(或者你可以使用 PowerMock,但老实说,我更喜欢 Mockito 和模拟接口)。

如果你使用向量抽象,你也可以做同样的事情来测试它。GL11 的包装器应该足够小且足够简单,您可以通过检查来验证它是否正确,因为如果没有实际在屏幕上绘图,您将无法对其进行单元测试。如果您在其他地方使用它,我只会创建那个额外的抽象。

至于显示类是“正确的”,并在“正确”的位置绘制正方形,Matt 的正确之处在于测试渲染行为很困难,并且测试美学 IMO 应该只能手动完成。考虑到这一点,如果您不创建矢量抽象,您可以检查坐标之间的距离是否相同,因此它是一个“正方形”,然后收工,因为这有助于您保持测试的灵活性和如果需要,可以轻松更改正方形的大小和颜色。

这些只是选项。自动化测试不能替代至少一次手动测试。如果您正在查看的行为是您每次更改它时总是手动检查的东西,并且它已从任何可能影响行为的事物中抽象出来(因此没有什么可以产生回归错误),请不要太担心为它创建一个单元测试并手动验证它。

于 2012-08-20T13:25:43.433 回答