PHPUnit9.0 编写PHPUnit测试-对PHP错误、警告和通知进行测试

2022-03-22 11:09 更新

默认情况下,PHPUnit 将测试在执行中触发的 PHP 错误、警告、通知都转换为异常。先不说其他好处,这样就可以预期在测试中会触发 PHP 错误、警告或通知,如示例 2.12 所示。

注解:

PHP 的error_reporting ​运行时配置会对 PHPUnit 将哪些错误转换为异常有所限制。如果在这个特性上碰到问题,请确认 PHP 的配置中没有抑制你所关注的错误类型。

示例 2.12 预期会出现 PHP 错误、警告和通知

<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;

final class ErrorTest extends TestCase
{
    public function testDeprecationCanBeExpected(): void
    {
        $this->expectDeprecation();

        // (可选)测试讯息和某个字符串相等
        $this->expectDeprecationMessage('foo');

        // 或者(可选)测试讯息和某个正则表达式匹配
        $this->expectDeprecationMessageMatches('/foo/');

        \trigger_error('foo', \E_USER_DEPRECATED);
    }

    public function testNoticeCanBeExpected(): void
    {
        $this->expectNotice();

        // (可选)测试讯息和某个字符串相等
        $this->expectNoticeMessage('foo');

        // 或者(可选)测试讯息和某个正则表达式匹配
        $this->expectNoticeMessageMatches('/foo/');

        \trigger_error('foo', \E_USER_NOTICE);
    }

    public function testWarningCanBeExpected(): void
    {
        $this->expectWarning();

        // (可选)测试讯息和某个字符串相等
        $this->expectWarningMessage('foo');

        // 或者(可选)测试讯息和某个正则表达式匹配
        $this->expectWarningMessageMatches('/foo/');

        \trigger_error('foo', \E_USER_WARNING);
    }

    public function testErrorCanBeExpected(): void
    {
        $this->expectError();

        // (可选)测试讯息和某个字符串相等
        $this->expectErrorMessage('foo');

        // 或者(可选)测试讯息和某个正则表达式匹配
        $this->expectErrorMessageMatches('/foo/');

        \trigger_error('foo', \E_USER_ERROR);
    }
}

如果测试代码使用了会触发错误的 PHP 内建函数,比如 ​fopen​,有时候在测试中使用错误抑制符会很有用。通过抑制住错误通知,就能对返回值进行检查,否则错误通知将会导致 PHPUnit 的错误处理程序抛出异常。
示例 2.13 对会引发PHP 错误的代码的返回值进行测试

<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;

final class ErrorSuppressionTest extends TestCase
{
    public function testFileWriting(): void
    {
        $writer = new FileWriter;

        $this->assertFalse(@$writer->write('/is-not-writeable/file', 'stuff'));
    }
}

final class FileWriter
{
    public function write($file, $content)
    {
        $file = fopen($file, 'w');

        if ($file === false) {
            return false;
        }

        // ...
    }
}
$ phpunit ErrorSuppressionTest
PHPUnit latest.0 by Sebastian Bergmann and contributors.

.

Time: 1 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)

如果不使用错误抑制符,此测试将会失败,并报告 ​fopen(/is-not-writeable/file): failed to open stream: No such file or directory


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号