如果 PHPUnit 断言失败则写入文件

Write file if PHPUnit assert failed

我正在使用 PHPUnit 测试使用 Imagick 生成的图像。

目前我将每个生成的图像写入一个文件,因此当断言失败时我可以看到它。断言后文件再次被删除。

这有效,但所有文件访问都在减慢测试速度 运行。如果断言失败,是否可以只将文件写入磁盘?

基于@Jakub Zalassuggestion to look at creating a Listener, I found out about theonNotSuccessfulTest`,它允许您在测试失败时向测试添加要执行的操作。

class MyPHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase
{
    private $failureFiles = [];

    protected function writeFileOnFailure($filename, $content)
    {
        @unlink($filename);
        $this->failureFiles[$filename] = $content;
    }

    /**
     * @before
     */
    public function forgetFailureFiles()
    {
        $this->failureFiles = [];
    }

    public function onNotSuccessfulTest(\Exception $e)
    {
        foreach ($this->failureFiles as $filename => $content) {
            file_put_contents($filename, $content);
        }
        $this->failureFiles = [];

        parent::onNotSuccessfulTest($e);
    }

}

就继承这个,在assert语句之前调用$this->writeFileOnFailure($path, $content)。其余的自动处理。如果您的测试方法中有更多断言但不再关心文件,您可以调用 $this->forgetFailureFiles(),否则它会在每个新测试方法之前自动调用。

可能有更好的方法来处理这个问题(比如使用 Listener 或 Decorator),但这很容易实现并根据特定需求进行更改。