强制从PHPUnit代码覆盖率中排除文件

26

如何在PHPUnit的代码覆盖率中强制性地排除一个文件夹?

我的问题是,我有一个Symfony 1.4项目,其中有位于./lib/vendor/symfony/*的文件夹。我想要递归地排除./lib/vendor/*内的所有内容。

现在,无论是否被我的测试隐含地覆盖,我都想将它们排除,即我永远不想看到这些文件夹。所以,我向我的phpunit.xml配置文件添加了这一部分,但似乎无论我如何操作,都不能排除这些文件夹:

<filter>
    <whitelist>
        <exclude>
            <directory>./lib/vendor/*</directory>
            <directory>./lib/vendor/symfony/lib/*</directory>
        </exclude>
    </whitelist>
</filter>

在我的理解中,一旦代码被执行并且XDebug注意到了它,PHPUnit就会无论如何将其包含在代码覆盖范围内。对我来说,这样做的缺点是,这段代码已经由Symfony开发人员进行了测试,因此不需要将其包含在我的覆盖范围报告中,这会影响我的统计数字 :P


你尝试过从路径中移除 * 吗? - j0k
@j0k 是的,我尝试过了,几乎什么都试过了,vendor、vendor/、vendor/、vendor// 和 vendor/*/*。 - Sarel
1
我之前遇到了类似的问题,我理解上述结构的方式是将<directory>白名单排除。与<blacklist><exclude>相反,它会将<directory>黑名单排除 - lucifurious
5个回答

34
在PHPUnit的较新版本中,从测试覆盖率报告中排除某些文件的正确方法是使用<exclude>指令,而不是<blacklist>。例如:
  <filter>
    <whitelist>
      <directory suffix=".php">src/</directory>
        <exclude>
           <directory suffix=".php">src/Legacy/</directory>
           <file>src/example.php</file>
        </exclude>
    </whitelist>
  </filter>

对于使用最新模式的 PHPUnit,这将是:

  <coverage>
    <include>
      <directory suffix=".php">src/</directory>
    </include>
    <exclude>
      <directory suffix=".php">src/Legacy/</directory>
      <file>src/example.php</file>
    </exclude>
  </coverage>

2
这个答案上的后缀过滤器对我的覆盖率报告生成性能产生了巨大的影响,非常感谢! - Seb

27

好的,所以我认为您可以拥有黑名单部分或白名单部分,结果发现您两者都可以拥有,因此我将那些文件夹列入黑名单并且它起作用了:

    <filter>
        <blacklist>
              <directory>./lib/vendor</directory>
              <directory>./lib/helper</directory>
        </blacklist>
    </filter>

1
注意事项。这需要放在<filter>...</filter>内部。 - wormhit
9
Php_Code_Coverage库不再支持黑名单功能。 - Spears

2
观察:白名单(您想要包含在代码覆盖范围内的目录)使得PHPUnit执行整个测试套件比黑名单更快。
<filter>
    <whitelist>
          <directory>/my/project/directory/to/be/covered</directory>
          ....
    </whitelist>
</filter>

测试环境:PHPUnit 4.5.0 和 PHP 5.5.9


1

所有这些答案似乎都适用于旧版本的PHPUnit

我正在运行PHPUnit 5.7.23,并且在为phpunit包含和排除文件方面遇到了问题。 syntax似乎已经发生了重大变化,并且只有部分向后兼容。 我有一个复杂的要求,需要为代码覆盖率同时包含和排除不同的目录(它是一个遗留系统)。

这是我在phpunit.xml中所需的内容:

<testsuites>
    <testsuite name="Unit Tests">
        <directory suffix="Test.php">./tests</directory>

        <exclude>./tests/blah/excluded_file_from_tests1.php</exclude>
        <exclude>./tests/blah/excluded_file_from_tests2.php</exclude>
        <exclude>./tests/blah/excluded_file_from_tests3.php</exclude>
    </testsuite>
</testsuites>
<filter>
    <whitelist processUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">./common/lib/included_directory</directory>
        <exclude>
            <directory suffix=".php">./common/lib/included_directory/core/blah/excluded_directory</directory>
        </exclude>
    </whitelist>
</filter>

因此:

  • <testsuites>下,我包含了./tests目录
  • 但是,在.tests目录下,我想要排除一组文件excluded_file_from_testsX.php
  • 然后,我想要白名单一个目录./common/lib/included_directory
  • 但是,在该包含的目录下几个级别之下,有一个目录我也想要排除(./common/lib/included_directory/core/blah/excluded_directory)。

因此,当通过phpunit --coverage-html build/coverage运行时,这似乎很好用。


0

适用于PHPUnit 9.0.1

<filter>
    <whitelist addUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">DIRECTORY_TO_ADD</directory>
        <directory suffix=".php">ANOTHER_DIR_TO_ADD</directory>
        <exclude>
            <file>ANOTHER_DIR_TO_ADD/file1_to_not_include.php</file>
            <file>ANOTHER_DIR_TO_ADD/file2_to_not_include.php</file>
        </exclude>
    </whitelist>
</filter>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接