使用JUnit测试图像文件

adc*_*lds 7 java junit unit-testing

我正在寻找有关如何使用JUnit测试动态生成的图像是预期图像的方向.一点背景:

我有代码生成缩略图像为java.awt.image.BufferedImage并将这些BufferedImages存储到java.io.File对象中.

我写了一个简单的单元测试来检查一些关键项目,以确保生成的图像是正确的:

@Test
public void testGenerateDefaultThumbnail() {
    File file = // someGeneratedFile.jpg

    assertNotNull(file);
    assertEquals(10211l, file.length());
}
Run Code Online (Sandbox Code Playgroud)

基本上,我只是确认文件大小是我所期望的.

这在我的机器(Mac OSX)上本地工作正常,但是只要我们的测试在我们的构建服务器(Ubuntu)上运行,其中一个测试就会失败并出现以下情况:

java.lang.AssertionError: expected:<10211> but was:<10158>
  at org.junit.Assert.fail(Assert.java:88)
  at org.junit.Assert.failNotEquals(Assert.java:743)
  at org.junit.Assert.assertEquals(Assert.java:118)
  at org.junit.Assert.assertEquals(Assert.java:555)
  at org.junit.Assert.assertEquals(Assert.java:542)
  at c.v.t.ThumbnailTest.testGenerateDefaultThumbnail(ThumbnailTest.java:53)
Run Code Online (Sandbox Code Playgroud)

三部分问题:

  • 为什么跨操作系统的图像的文件大小不同?
  • 单元测试图像生成是否有标准方法?
  • 我是否应该更改我的方法来比较两个File对象(预生成的文件作为项目中的资源存在)?

谢谢!

dka*_*zel 9

我猜想要写出的元数据有什么不同?图像数据可能是相同的.如果您只关心图像数据而不关心图像文件的元数据,则可以将像素数据作为字节数组拉出.

这可能是个好主意,因为比较整个文件会有问题,因为元数据可能有文件生成的时间戳会破坏测试.

如果您已经拥有图像,则BufferedImage可以在expectedactual变量上执行此操作.

//this gets the actual Raster data as a byte array
byte[] byteArray = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData();
Run Code Online (Sandbox Code Playgroud)

然后只比较字节数组是否相等

assertArrayEqual(expectedArray, actualArray);
Run Code Online (Sandbox Code Playgroud)

如果您没有将数据作为bufferedImage,那么很容易从文件中获取数据

BufferedImage originalImage = 
                          ImageIO.read(new File("path/to/my.jpg"));
Run Code Online (Sandbox Code Playgroud)

要么 InputStream

  try{
  BufferedImage originalImage = 
                          ImageIO.read(inputStream));
  }finally{
      //close inputstream
      inputStream.close();
  }
Run Code Online (Sandbox Code Playgroud)