20

是否可以从 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

4

5 回答 5

27

好的,所以我认为您可以拥有黑名单部分或白名单部分,结果您可以同时拥有两者,所以我将这些文件夹列入黑名单并且它有效:

    <filter>
        <blacklist>
              <directory>./lib/vendor</directory>
              <directory>./lib/helper</directory>
        </blacklist>
    </filter>
于 2013-01-17T13:51:10.537 回答
23

在 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>
于 2018-08-27T09:38:11.820 回答
2

观察:与黑名单相比,白名单(您希望包含在代码覆盖范围内的目录)使整个测试套件的 phpunit 执行更快。

<filter>
    <whitelist>
          <directory>/my/project/directory/to/be/covered</directory>
          ....
    </whitelist>
</filter>

测试:PHPUnit 4.5.0 和 PHP 5.5.9

于 2015-06-20T09:04:36.210 回答
1

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

我正在运行PHPUnit 5.7.23并且在获取包含和排除phpunit. 语法似乎发生了很大变化,只是部分向后兼容。我有一个复杂的要求,我还需要包含和排除用于代码覆盖的单独目录(它是一个遗留系统)。

这是我需要的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

于 2018-02-27T03:07:46.567 回答
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>
于 2020-08-12T22:32:01.230 回答