Java 用JUnit测试图像文件

Java 用JUnit测试图像文件,java,unit-testing,junit,Java,Unit Testing,Junit,我正在寻找如何使用JUnit测试动态生成的图像是否是预期的图像的方向。一点背景: 我有生成java.awt.image.buffereImage的缩略图的代码,并将这些BuffereImage存储到java.io.File对象中 我编写了一个简单的单元测试来检查几个关键项目,以获得生成图像正确性的信心: @Test public void testGenerateDefaultThumbnail() { File file = // someGeneratedFile.jpg

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

我有生成java.awt.image.buffereImage的缩略图的代码,并将这些BuffereImage存储到java.io.File对象中

我编写了一个简单的单元测试来检查几个关键项目,以获得生成图像正确性的信心:

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

    assertNotNull(file);
    assertEquals(10211l, file.length());
}
基本上,我只是确认文件大小是我所期望的

这在我的机器(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)
java.lang.AssertionError:应为:但为:
位于org.junit.Assert.fail(Assert.java:88)
位于org.junit.Assert.failNotEquals(Assert.java:743)
位于org.junit.Assert.assertEquals(Assert.java:118)
位于org.junit.Assert.assertEquals(Assert.java:555)
位于org.junit.Assert.assertEquals(Assert.java:542)
在c.v.t.ThumbnailTest.testGenerateDefaultThumbnailTest(ThumbnailTest.java:53)中
问题三部分:

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

谢谢

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

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

如果您已经将图像作为
缓冲区图像
使用,则只需在
预期
实际
变量上执行此操作即可

//this gets the actual Raster data as a byte array
byte[] byteArray = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData();
然后比较字节数组是否相等

assertArrayEqual(expectedArray, actualArray);
如果您还没有将数据作为缓冲区映像,那么很容易从文件中获取数据

BufferedImage originalImage = 
                          ImageIO.read(new File("path/to/my.jpg"));
InputStream

  try{
  BufferedImage originalImage = 
                          ImageIO.read(inputStream));
  }finally{
      //close inputstream
      inputStream.close();
  }

试着比较这两个文件,看看它们之间的区别。看看这个问题:【图像比较】[1][1]:这实际上是我选择的,效果很好。根据图像的大小,这不是一个最佳的解决方案,但这是一个单元测试,我的图像相对较小(500 x 500),因此它很适合我的需要。谢谢