我正在使用 Java 的 Graphics2D 生成图形的图形表示。我还在使用 ImageIO 编写 PNG 文件。(ImageIO.write(image, "png", out);
)
我想知道我应该如何编写 JUnit 测试来测试生成的图形是否是预期的。我可以预先生成 PNG 文件,但是如果字体在不同的机器上有点不同呢?
对我来说,这个具体的实现似乎工作:
private void compareRasterImages(BufferedImage expectedPngIo, BufferedImage actualPngIo) throws AssertionError {
int minX = expectedPngIo.getMinX();
int minY = expectedPngIo.getMinY();
int maxX = expectedPngIo.getMinX() + expectedPngIo.getWidth();
int maxY = expectedPngIo.getMinY()+ expectedPngIo.getHeight();
ertEquals(minX, actualPngIo.getMinX());
ertEquals(minY, actualPngIo.getMinY());
ertEquals(expectedPngIo.getHeight(), actualPngIo.getHeight());
ertEquals(expectedPngIo.getWidth(), actualPngIo.getWidth());
for (int x_i = minX; x_i < maxX; x_i++){
for (int y_i = minY; y_i < maxY; y_i++) {
ertEquals(expectedPngIo.getRGB(x_i, y_i), actualPngIo.getRGB(x_i, y_i));
}
}
}
我从我的 PNG 检索 BufferedImage(作为字节 [])使用 ImageIO:
BufferedImage expectedPngIo = ImageIO.read(new ByteArrayInputStream(expectedPng));
enter code here
您可以尝试测试输出的特定已知功能,例如:
它有一个白色像素(100,100)?
它的边界完全是黑色的?
图像是预期的大小吗?
和 / 或你可以写一些“聚合属性”的测试,允许一些模糊的结果:
图像是否至少 90 % 匹配参考图像?(以允许不同的字体,抗锯齿差异等)
图像中最常见的颜色等于背景颜色吗?
您可以将生成的图像的所有 RGB 值读取到一个数组中,并将该 2D 数组与表示预生成图像的一个进行比较,如果您对完整图像非常具体。
如果您希望忽略字体,则可以对不包含任何可变数据的图像区域执行相同的操作,具体取决于生成图像的环境。构建用于单元测试的校正和归一化例程将浪费时间,除非期望应用程序生成具有保证的高精度的图像。
我发现这在使渲染字体相同的跨平台像素完美图形单元测试简单的东西,如文本覆盖在静态图像上是有效的。
将Font
和FontRenderContext
注入渲染字体的类中,以便可以在测试下对其进行控制。
向单元测试提供.ttf 文件,并使用Font.createFont()
从文件生成字体。
在单元测试中,禁用使用的FontRenderContext
中的抗锯齿。
我很好奇,如果其他人认为这是脆弱的或容易失败的任何原因,但我有很好的结果到目前为止。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(30条)