使用 JUnit 测试图像文件
Testing image files with JUnit
我正在寻找有关如何使用 JUnit 测试动态生成的图像是否为预期图像的方向。一些背景知识:
我有代码可以生成 java.awt.image.BufferedImage 的缩略图并将这些 BufferedImages 存储到 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)
三部分问题:
- 为什么 OS 的图像的文件大小可能不同?
- 是否有单元测试图像生成的标准方法?
- 我是否应该更改比较两个文件对象的方法(其中预先生成的文件作为项目中的资源存在)?
谢谢!
我猜想写出的元数据有区别吗?图像数据可能是相同的。如果您只关心图像数据而不关心图像文件的元数据,您可以将像素数据作为字节数组提取出来。
无论如何,这可能是个好主意,因为比较整个文件会有问题,因为元数据可能具有文件生成的时间戳,这会破坏测试。
如果您已经将图像作为 BufferedImage
,您可以在 expected
和 actual
变量上执行此操作。
//this gets the actual Raster data as a byte array
byte[] byteArray = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData();
然后比较字节数组是否相等
assertArrayEqual(expectedArray, actualArray);
如果您没有数据作为 bufferedImage 但很容易从文件中获取它
BufferedImage originalImage =
ImageIO.read(new File("path/to/my.jpg"));
或InputStream
try{
BufferedImage originalImage =
ImageIO.read(inputStream));
}finally{
//close inputstream
inputStream.close();
}
我正在寻找有关如何使用 JUnit 测试动态生成的图像是否为预期图像的方向。一些背景知识:
我有代码可以生成 java.awt.image.BufferedImage 的缩略图并将这些 BufferedImages 存储到 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)
三部分问题:
- 为什么 OS 的图像的文件大小可能不同?
- 是否有单元测试图像生成的标准方法?
- 我是否应该更改比较两个文件对象的方法(其中预先生成的文件作为项目中的资源存在)?
谢谢!
我猜想写出的元数据有区别吗?图像数据可能是相同的。如果您只关心图像数据而不关心图像文件的元数据,您可以将像素数据作为字节数组提取出来。
无论如何,这可能是个好主意,因为比较整个文件会有问题,因为元数据可能具有文件生成的时间戳,这会破坏测试。
如果您已经将图像作为 BufferedImage
,您可以在 expected
和 actual
变量上执行此操作。
//this gets the actual Raster data as a byte array
byte[] byteArray = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData();
然后比较字节数组是否相等
assertArrayEqual(expectedArray, actualArray);
如果您没有数据作为 bufferedImage 但很容易从文件中获取它
BufferedImage originalImage =
ImageIO.read(new File("path/to/my.jpg"));
或InputStream
try{
BufferedImage originalImage =
ImageIO.read(inputStream));
}finally{
//close inputstream
inputStream.close();
}