使用 phpunit 9.5 捕获警告、通知和弃用

catching warnings, notices and deprecations with phpunit 9.5

引用 https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html#testing-php-errors-warnings-and-notices , "默认情况下,PHP单元将测试执行期间触发的 PHP 错误、警告和通知转换为异常”。牢记这一点,这是我的单元测试:

<?php

class DemoTest extends PHPUnit\Framework\TestCase
{
    public function testDemo()
    {
        try {
            trigger_error('zzz', E_USER_DEPRECATED);
        } catch (\Throwable $e) {}
    }
}

当我 运行 vendor/bin/phpunit 使用 PHPUnit 9.5.10 时(在 PHP 8.0.9 或 PHP 8.1.0 上)我得到以下信息:

PHPUnit 9.5.10 by Sebastian Bergmann and contributors.

R                                                                   1 / 1 (100%)
Deprecated: zzz in C:\path\to\code\tests\DemoTest.php on line 8


Time: 00:00.007, Memory: 6.00 MB

There was 1 risky test:

1) DemoTest::testDemo
This test did not perform any assertions

C:\path\to\code\tests\DemoTest.php:5

OK, but incomplete, skipped, or risky tests!
Tests: 1, Assertions: 0, Risky: 1.

我不想在输出中看到错误,如果没有抛出异常,那么 $this->expectException('PHPUnit\Framework\Error\Deprecated') 对我不起作用。

有什么想法吗?

好像本意是抛出并捕获异常,但是用trigger_error就不一样了(不是抛出异常)。有 a great answer 解释差异。 如果您打算处理弃用错误,那么我建议在可以自定义处理 E_DEPRECATED 消息的地方使用 set_error_handler

changelog of 9.5.10 中指出:

PHPUnit no longer converts PHP deprecations to exceptions by default (configure convertDeprecationsToExceptions="true" to enable this)

所以这是预料之中的。从技术上讲,人们甚至可以争辩说关于“错误、警告和通知”的说法是正确的,因为弃用是它们自己的类别。

您通常在 XML configuration file 中配置它,提供 -c

还要注意文档页面上关于 error_reporting ini/runtime 设置的注释:它也不能排除弃用(E_ALL 很好)。