Синтаксис Исключить файлы из PHPUnit Code Coverage

Можно ли принудительно исключить папку из покрытия кода 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

Ответ 1

Хорошо, поэтому я подумал, что у вас может быть либо черный список, либо секция "белый список", оказывается, вы можете иметь оба, поэтому я занесен в черный список этих папок, и это сработало:

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

Ответ 2

Наблюдение: белый список (каталоги, которые вы хотите включить в покрытие кода) делает выполнение phpunit всего набора тестов более быстрым, по сравнению с черным списком.

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

Протестировано с помощью PHPUnit 4.5.0 и PHP 5.5.9

Ответ 3

Все эти ответы, похоже, применимы к более старым версиям 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
  • Но в .tests я хотел исключить набор файлов excluded_file_from_testsX.php
  • Затем я хотел, чтобы белый список каталогов ./common/lib/included_directory
  • Но под этим каталогом ниже нескольких уровней находится каталог, который я также хотел исключить (./common/lib/included_directory/core/blah/excluded_directory).

Таким образом, это, казалось, хорошо работало при запуске через phpunit --coverage-html build/coverage