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

Posted

技术标签:

【中文标题】使用 phpunit 9.5 捕获警告、通知和弃用【英文标题】:catching warnings, notices and deprecations with phpunit 9.5 【发布时间】:2022-01-16 03:37:57 【问题描述】:

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

<?php

class DemoTest extends PHPUnit\Framework\TestCase

    public function testDemo()
    
        try 
            trigger_error('zzz', E_USER_DEPRECATED);
         catch (\Throwable $e) 
    

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

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-&gt;expectException('PHPUnit\\Framework\\Error\\Deprecated') 对我不起作用。

有什么想法吗?

【问题讨论】:

这个问题和***.com/q/70321515/569976 的区别在于另一个问题是关于 PHPUnit 9.4 和 PHPUnit 9.5 的。 PHPUnit 9.4 中的问题仅在 PHP 8.1 上表现出来,而这个问题至少在 PHP 8.0 和 8.1 中具有一致的行为。 【参考方案1】:

在changelog of 9.5.10 中声明:

默认情况下,PHPUnit 不再将 PHP 弃用转换为异常(配置 convertDeprecationsToExceptions="true" 以启用此功能)

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

您通常在XML configuration file 中配置此设置,-c 提供。

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

【讨论】:

【参考方案2】:

似乎意图是抛出并捕获异常,但使用trigger_error 是不一样的(它不是抛出异常)。有a great answer 解释差异。 如果您的意图是处理弃用错误,那么我建议在可以自定义处理 E_DEPRECATED 消息的情况下使用set_error_handler。

【讨论】:

引用phpunit.readthedocs.io/en/9.5/…,“默认情况下,PHPUnit 将测试执行期间触发的 PHP 错误、警告和通知转换为异常”。 PHPUnit 无疑是通过使用它自己的自定义错误处理程序来做到这一点的。请记住,我并没有尝试在常规 PHP 脚本中执行此操作 - 我尝试在 PHPUnit 单元测试的上下文中执行此操作。

以上是关于使用 phpunit 9.5 捕获警告、通知和弃用的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 中运行任务的 Rails 2.3 样式插件和弃用警告

尝试通过 Makefile 运行 phpunit 测试而没有弃用警告时出现“错误的变量名”

为啥我在通知中收到弃用警告..?

.Net 7 团队把国内的龙芯确实当做一等公民和弃用的项目

在 Symfony 2(.7) 中禁用已弃用的警告

9.5 异常处理规则