1

如何测试应用程序是否正确呈现了某些内容?

例如(2D 示例):

微软 Word 2007 http://img32.imageshack.us/img32/6197/37841144.png

如何知道阴影放置正确或渲染了正确的颜色/轮廓?或者,当一个方向旋转时,3D 效果是否正确渲染?其他事情可能是,如果重新调整了艺术这个词的大小,如何衡量它的“正确性”?

4

2 回答 2

3

有几种方法:

  1. 如果它实际上非常精确地指定了应该渲染的内容以及确切的方式,那么您可以将像素与参考渲染进行比较。
  2. 对于像 SVG 这样的东西,它并没有那么明确地指定。这里通常的方法是使用参考渲染并手动比较它们。您可以轻松地叠加两者,从另一个中减去一个,并以这种方式发现明显的差异。不过,这不是一个自动过程。
  3. 您可以查看代表绘制图像的数据,而不是直接查看屏幕上的图像。绘制的是(在您的示例中)矢量图形。这意味着有几种形状应该具有明确定义的属性、形状和颜色,您可以简单地将您的形状数据与参考进行比较。这类事情可以自动完成。我认为 Google 使用类似的方法来比较 Chrome 的渲染与网页的参考渲染;他们不比较像素数据,他们比较更高级别的数据,浏览器呈现什么以及如何呈现。
于 2009-11-16T13:02:17.190 回答
2

有两种方法:基于图像和基于渲染的一种。

图像方式:您必须找到一种将图像渲染到内部像素缓冲区的方法(这样您就可以“无头”运行测试,即不会弹出实际的 UI)。

然后选择几个像素并确保它们的颜色正确。在您的示例中,选择文本周围的几个白色像素以确保渲染不会泄漏。像这样的辅助方法assertThatRectangleIs(area, color)将有助于覆盖一些基础。这个想法是选择特定区域(如H的左侧垂直条)并且不要太挑剔。

基于渲染的方式假设您的 gfx 库有效。所以你要做的是用类似这样的东西来模拟实际的渲染代码:

public class MockGC extends GC {
    List<Op> ops = new ArrayList<Op> ();
    void drawLine (int x1, int y1, int x2, int y2) {
        ops.add(new Line(x1, y1, x2, y2, copyGC (gc)));
    }
}

因此,您只需将命令和所有相关选项保存在易于比较的数据结构中。甚至:

public class MockGC extends GC {
    StringBuilder buffer = new StringBuilder ();

    void drawLine (int x1, int y1, int x2, int y2) {
        buffer.append("line "+x1+","+y1+" - "+x2+","+y2+", color="+foreground()+"\n");
    }
}

稍后,您可以验证是否已发出正确的渲染命令以及是否使用了 GC(颜色、字体、渲染提示)。

后一种方式更快且 100% 精确,但编码工作量更大。

于 2009-11-16T13:17:16.557 回答