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
以上内容是否对您有帮助:
更多建议: