FilterIterator应为PHPUnit\Framework\TestSuiteTerator的实例



当我激活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

最新更新