PHPUnit:assertFileEquals() 失败
PHPUnit: assertFileEquals() fails
我正在开发一个 PHP 软件,可以从图像创建缩略图。
现在我需要确保缩略图创建成功,换句话说,初始图像已经 resized/cropped 正确。
我认为只有一种方法可以做到这一点:我手动创建缩略图以与软件创建的缩略图进行比较。
但是如何测试呢?
如果我用assertFileEquals()
比较我创建的缩略图和软件创建的缩略图,当然测试失败,即使两个图像相同。
我想如果只是因为两个文件的创建日期不同,或者出于类似的原因,就会发生这种情况。
那么,怎么办?
如果 assertFileEquals
失败,则说明这两个文件存在差异。内部代码对两个文件调用 file_get_contents
并在差异为零时断言为真(因此创建日期不是断言的一部分)。
由于您是手动创建缩略图,因此肯定存在细微差异。相反,您需要进行 "mostly the same" 比较,有两个与编码相关的问题:
- Compare 2 images in php
- Similar images - how to compare them
然后决定差多少算合格。所以你会做 "mostly the same comparison",然后使用断言来确定 "mostly the same" 比较的答案是否在你可以接受的 运行ge 范围内。
更新
我运行 快速测试以确保 assertFileEquals 在二进制文件上正常工作:
class FileEqualsTest 扩展 PHPUnit_Framework_TestCase
{
public function test_yes_no_answer() {
file_put_contents("a.txt","\e[0m");
file_put_contents("b.txt","\e[0m");
file_put_contents("c.txt","\e[30m");
// straight get contents and comparisons
$contentsA = file_get_contents("a.txt");
$contentsB = file_get_contents("b.txt");
$this->assertEquals($contentsA, $contentsB);
$contentsC = file_get_contents("c.txt");
$this->assertNotEquals($contentsA, $contentsC);
// using file equals has same answer
$this->assertFileEquals("a.txt","b.txt");
$this->assertFileNotEquals("a.txt","c.txt");
}
..它在非常小的范围内按预期工作。所以看起来在某种程度上存在一些微小的差异。您可以尝试上面其他问题中显示的选项,看看是否存在微小差异,如果这对您的测试很重要。
存储一对source.png
和expected_result.png
(由软件生成一次,验证良好并存储为参考图像)就足够了。实现比较功能似乎是一项开销。
单元测试的主要目的是在系统行为发生变化时发出信号,如果新创建的缩略图与参考缩略图不匹配,这就是此类测试要做的事情。
但是,如果出于某种原因软件每次生成的图像都略有不同,那么如果不是错误,请使用建议的比较相似图像方法。
如果图像内容不同怎么办
对于此示例中使用的 PNG 文件,其内容 might contain some auxiliary info such as EXIF。
因此,您可能不得不尝试在没有此附加信息的情况下创建副本图像。请验证以下代码是否适合您:
public function testThumbnails()
{
$this->assertPngImageContentsEquals(__DIR__ . '/test1.png', __DIR__ . '/test2.png');
}
public static function assertPngImageContentsEquals(
$expected,
$actual,
$message = 'Contents of PNG files differ'
)
{
self::assertFileExists($expected, $message);
self::assertFileExists($actual, $message);
$copy_expected = self::_makePngCopy($expected, __DIR__ . '/expected.png');
$copy_actual = self::_makePngCopy($actual, __DIR__ . '/actual.png');
var_dump($copy_expected);
var_dump($copy_actual);
self::assertFileEquals($copy_expected, $copy_actual, 'Thumbnails differ');
unlink($copy_expected);
unlink($copy_actual);
}
private static function _makePngCopy($sourceFile, $resultFile)
{
$image = imagecreatefrompng($sourceFile);
imagepng($image, $resultFile);
imagedestroy($image);
return $resultFile;
}
我正在开发一个 PHP 软件,可以从图像创建缩略图。
现在我需要确保缩略图创建成功,换句话说,初始图像已经 resized/cropped 正确。
我认为只有一种方法可以做到这一点:我手动创建缩略图以与软件创建的缩略图进行比较。
但是如何测试呢?
如果我用assertFileEquals()
比较我创建的缩略图和软件创建的缩略图,当然测试失败,即使两个图像相同。
我想如果只是因为两个文件的创建日期不同,或者出于类似的原因,就会发生这种情况。
那么,怎么办?
如果 assertFileEquals
失败,则说明这两个文件存在差异。内部代码对两个文件调用 file_get_contents
并在差异为零时断言为真(因此创建日期不是断言的一部分)。
由于您是手动创建缩略图,因此肯定存在细微差异。相反,您需要进行 "mostly the same" 比较,有两个与编码相关的问题:
- Compare 2 images in php
- Similar images - how to compare them
然后决定差多少算合格。所以你会做 "mostly the same comparison",然后使用断言来确定 "mostly the same" 比较的答案是否在你可以接受的 运行ge 范围内。
更新
我运行 快速测试以确保 assertFileEquals 在二进制文件上正常工作:
class FileEqualsTest 扩展 PHPUnit_Framework_TestCase {
public function test_yes_no_answer() {
file_put_contents("a.txt","\e[0m");
file_put_contents("b.txt","\e[0m");
file_put_contents("c.txt","\e[30m");
// straight get contents and comparisons
$contentsA = file_get_contents("a.txt");
$contentsB = file_get_contents("b.txt");
$this->assertEquals($contentsA, $contentsB);
$contentsC = file_get_contents("c.txt");
$this->assertNotEquals($contentsA, $contentsC);
// using file equals has same answer
$this->assertFileEquals("a.txt","b.txt");
$this->assertFileNotEquals("a.txt","c.txt");
}
..它在非常小的范围内按预期工作。所以看起来在某种程度上存在一些微小的差异。您可以尝试上面其他问题中显示的选项,看看是否存在微小差异,如果这对您的测试很重要。
存储一对source.png
和expected_result.png
(由软件生成一次,验证良好并存储为参考图像)就足够了。实现比较功能似乎是一项开销。
单元测试的主要目的是在系统行为发生变化时发出信号,如果新创建的缩略图与参考缩略图不匹配,这就是此类测试要做的事情。
但是,如果出于某种原因软件每次生成的图像都略有不同,那么如果不是错误,请使用建议的比较相似图像方法。
如果图像内容不同怎么办
对于此示例中使用的 PNG 文件,其内容 might contain some auxiliary info such as EXIF。
因此,您可能不得不尝试在没有此附加信息的情况下创建副本图像。请验证以下代码是否适合您:
public function testThumbnails()
{
$this->assertPngImageContentsEquals(__DIR__ . '/test1.png', __DIR__ . '/test2.png');
}
public static function assertPngImageContentsEquals(
$expected,
$actual,
$message = 'Contents of PNG files differ'
)
{
self::assertFileExists($expected, $message);
self::assertFileExists($actual, $message);
$copy_expected = self::_makePngCopy($expected, __DIR__ . '/expected.png');
$copy_actual = self::_makePngCopy($actual, __DIR__ . '/actual.png');
var_dump($copy_expected);
var_dump($copy_actual);
self::assertFileEquals($copy_expected, $copy_actual, 'Thumbnails differ');
unlink($copy_expected);
unlink($copy_actual);
}
private static function _makePngCopy($sourceFile, $resultFile)
{
$image = imagecreatefrompng($sourceFile);
imagepng($image, $resultFile);
imagedestroy($image);
return $resultFile;
}