当我激活Xdebug并运行PHPUnit单元测试时,会发生此错误:❌
Warning: assert(): assert($iterator instanceof FilterIterator) failed in [...]/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php on line 57
[... some stack trace information ...]
Return value of PHPUnitRunnerFilterFactory::factory() must be an instance of FilterIterator, instance of PHPUnitFrameworkTestSuiteIterator returned
我正在使用
PHPUnit 9.5.6 by Sebastian Bergmann and contributors.
Runtime: PHP 7.4.21 with Xdebug 2.8.0
PHPUnit执行调用(与PhpStorm结合在一起(看起来像:
/usr/bin/php74.bin.cli
-dzend_extension=/usr/local/php74/lib/php/extensions/xdebug.so
-dxdebug.collect_params=5
-dxdebug.profiler_enable=on
-dxdebug.auto_trace=1 -dxdebug.trace_format=1
-dxdebug.collect_return=1 -ddisplay_errors=1
-ddisplay_startup_errors=1 -derror_reporting=E_ALL
-dmemory_limit=512M
[...]/vendor/phpunit/phpunit/phpunit
--coverage-filter [...]/src/
--bootstrap [...]/utils/unittest/bootstrap.php
--configuration [...]/utils/unittest/phpunit.xml
--filter "/(BasicsTest::testReturnBytes)( .*)?$/"
--test-suffix BasicsTest.php [...]/utils/unittest/basics --teamcity
在Xdebug激活的情况下调用一个简单的php脚本效果很好。✔️
/usr/bin/php74.bin.cli
-dzend_extension=/usr/local/php74/lib/php/extensions/xdebug.so
-dxdebug.collect_params=5
-dxdebug.profiler_enable=on -dxdebug.auto_trace=1
-dxdebug.trace_format=1 -dxdebug.collect_return=1
-ddisplay_errors=1 -ddisplay_startup_errors=1
-derror_reporting=E_ALL -dmemory_limit=512M ./test.php
在未激活Xdebug的情况下调用单元测试效果良好。✔️
/usr/bin/php74.bin.cli
-dallow_url_fopen=1
[...]/vendor/phpunit/phpunit/phpunit
--no-coverage
--bootstrap [...]/utils/unittest/bootstrap.php
--configuration [...]/utils/unittest/phpunit.xml
--filter "/(BasicsTest::testReturnBytes)( .*)?$/"
--test-suffix BasicsTest.php [...]/utils/unittest/basics --teamcity
我的phpunit.xml
<?xml version="1.0"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
bootstrap="bootstrap.php"
colors="true"
verbose="true">
<coverage>
<include>
<directory suffix=".php">../../../src/*</directory>
<directory suffix=".php">../../../some other dirs/*</directory>
</include>
<exclude>
<directory suffix=".php">../../../some other dirs/*</directory>
</exclude>
<report>
<html outputDirectory="./x_testresults" lowUpperBound="35" highLowerBound="70"/>
</report>
</coverage>
<php>
<ini name="allow_url_fopen" value="On"/>
<ini name="memory_limit" value="5G"/>
<ini name="include_path" value="."/>
</php>
</phpunit>
单元测试
<?php
declare(strict_types = 1);
class BasicsTest extends PHPUnitFrameworkTestCase
{
function testReturnBytes(): void {
$this->assertSame(1, 1);
}
}
医生说https://phpunit.readthedocs.io/en/9.5/code-coverage-analysis.html#including-的文件
必须配置一个过滤器,用于告诉PHPUnit哪些源代码文件要包括在代码覆盖率报告中。这可以使用--coverage filter命令行选项或通过配置文件(请参阅元素(来完成。
这就是我所做的,见上文。同样,在没有设置--coverage-filter
参数的情况下,PHPUnit抱怨缺少过滤器信息,所以我添加了它
对我来说,这个问题似乎与--coverage-filter
参数有关。错误消息(见第一段代码(说FilterIterator
应该是PHPUnitFrameworkTestSuiteIterator
的实例,但我不知道在哪里调整。
我在设置中发现了一些错误,并找到了一种变通方法,使测试能够使用Xdebug运行。
错误:
- phpunit.xml中的includes和excludes标记有错误的相对路径
- 设置"-auto_trace=1";对于命令行上的xdebug命令已过时,请参阅文档。实际上奇怪的是test.php运行得很好
解决方法:
- 将测试套件设置为""在phpunit.xml中,并通过--testsuite-default调用它
- 设置一个"@组虚设";到我想要测试的特定类,并通过--group dummy调用它来调用该测试
phpunit.xml中的测试套件设置详细信息:
<testsuites>
<testsuite name="default">
<directory>./</directory>
</testsuite>
</testsuites>
现在命令行调用:
/usr/bin/php74.bin.cli
-dzend_extension=/usr/local/php74/lib/php/extensions/xdebug.so
-dxdebug.collect_params=5
-dxdebug.profiler_enable=on
-dxdebug.trace_format=1
-dxdebug.collect_return=1
../../vendor/bin/phpunit
--group no-db
--verbose
--debug
--testsuite default
--group dummy