Покрытие кода с помощью PHPUnit

Я столкнулся с проблемой при попытке определить покрытие кода на нашем сайте. У меня есть PHPUnit, генерирующий отчет о покрытии HTML-кода при выполнении наших модульных тестов в наших трех приложениях. У нас есть общедоступное приложение, приложение администратора и приложение для составления отчетов. Я хотел бы как-то объединить их в один отчет о покрытии кода, так как приложения делятся кодом.

Кажется, что покрытие кода только вычисляет покрытие для файлов, к которым тесты "прикасаются", поэтому полностью не проверенные файлы не используются в вычислениях. Кто-нибудь знает, как вытащить эти неиспользуемые файлы в расчет? Есть ли способ указать генератору покрытия вычислять, используя определенные каталоги, чтобы он извлекал файлы, которые не были затронуты? У меня есть белый список, настроенный в файле конфигурации для phpunit, установленный в корне нашего проекта. Все комментарии, ответы и советы приветствуются.

5 ответов

Решение

Если вы создали <whitelist> в вашем phpunit.xml В файле конфигурации вы должны увидеть все непокрытые файлы. Это может быть проблемой с путями, попробуйте абсолютные, чтобы увидеть, что это создает 0% -ое покрытие для некоторых файлов, а затем заставьте относительные пути работать.

Для того, чтобы объединить покрытие, вы не так много можете сделать с phpunit, о котором я знаю. Вы можете объединить результаты покрытия (пакет PHPUnit_Coverage) вручную, а затем выяснить, как их визуализировать, но вам нужно будет сделать это вручную. По крайней мере, я не знаю ни одного проекта / инструмента / способа, который сделал бы это для вас.

Самый простой способ - запустить все 3 набора тестов за один прогон phpunit и сгенерировать покрытие кода для частей, о которых вы говорите.

Использование <whitelist processUncoveredFilesFromWhitelist="true"> вот так:

<filter>
  <whitelist processUncoveredFilesFromWhitelist="true">
    <directory suffix=".php">../folder/</directory>
  </whitelist>
</filter>

Я столкнулся с той же проблемой, и я просто добавил поколение тестовых заглушек (для каждого класса и общедоступного метода) перед запуском тестовых наборов. У вас есть даже вариант для этого в phpUnit:

http://www.phpunit.de/manual/current/en/skeleton-generator.html

Это может показаться странным, но почему бы просто не создать контрольный пример, который рекурсивно проходит по папке вашего проекта и запускает require_once для каждого найденного файла? Это должно позволить XDebug создать новый HTML-файл покрытия кода для каждого требуемого файла.

Я думаю, что PHPUnit использует XDebug, который предоставляет буквально данные покрытия для фактически выполненных файлов. Он не может предоставить данные для файлов, которые никогда не выполнялись, потому что отладчик их никогда не видит. Вы можете вручную исправить механизм PHPUnit, чтобы добавить список всех файлов, которые, по вашему мнению, находятся в вашем приложении, к результату, возвращенному из XDebug.

Наш инструмент PHP Test Coverage работает по-другому. Вы даете ему список всех файлов, которые вы считаете частью вашего приложения; это поможет вам построить этот список. (Это тот же список, который вы должны будете исправить в первом решении). Он обрабатывает все упомянутые файлы и собирает данные о тестовом покрытии. Данные покрытия, которые вы получаете сейчас, включают в себя все правильно. Это должно нормально работать с PHPUnit.

Вы можете пойти дальше. Вы можете создать тестовое покрытие для каждого из ваших "отдельных" приложений и запускать их отдельно. Затем вы можете объединить данные покрытия для всех них, чтобы увидеть покрытие для всего набора.

Другие вопросы по тегам