Как исключить метод из обработки покрытия кода в модуле PHP, если вы установили processUncoveredFilesFromWhitelist = & quot; true & quot;

Я установил в моем phpunit.xml сделать следующее:

<filter>
<whitelist  addUncoveredFilesFromWhitelist="true" processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">/my/app</directory>
</whielist>
</filter>

Я запускаю тесты с:

 phpunit -c /path/to/phpunit.xml --coverage-text

Тем не менее, есть один метод в одном файле, который я бы никогда не оценил на предмет покрытия, так как он выводит кучу мусора в мой текстовый отчет об охвате тестами. Давайте предположим, что класс / метод назван my\app\Response::render()

Упрощенная версия этого метода:

public function render($response) {
header($response['status']);
echo $response['body'];
echo "\n";
}

это render() метод выдает header() команда, а также ряд echo() команды, которые вызывают появление большого количества текста и ошибок при выполнении отчетов о покрытии с --coverage-text,

Я попытался следующее:

  • Добавлена ​​аннотация @codeCoverageIgnore
  • В моем блоке белого списка в xml попытался исключить весь файл: <exclude><file>/my/app/Response.php</file></exclude>

Также не препятствуйте выполнению метода (в некотором роде).

Я рассмотрел хак, как добавление некоторого кода в этот метод проверки, чтобы увидеть, выполняемся ли мы через phpunit, как завершение кода в:

 if(strpos($GLOBALS['argv'][0], 'phpunit') !==false){
// ... do stuff
}

Или как использовать старый добрый $do_debug метод переменной, передавая переменную окружения через phpunit, указанный в phpunit.xml, чтобы отключить этот код (таким образом, если позже я захочу запустить phpunit и выполнить метод, который я могу выполнить, просто переключив переменную окружения).

Ни один из этих вариантов не кажется элегантным. Мне не нравится модифицировать мой код, чтобы обойти проблемы тестирования (я даже немного недоволен, добавляя аннотации к тестовым подсказкам к моим методам, я скорее обращаюсь с каким-то белым / черным списком).

Однако, когда в хорошо проверенном наборе библиотек появляется какое-то воспринимаемое ограничение, требующее не слишком элегантного решения, я хотел бы проверить свою голову перед сообществом и посмотреть, не было ли что-то упущено.

Кто-нибудь знает, как я могу добиться предотвращения этого метода от обработки только в рамках функциональности Phpunit?

0

Решение

Очевидно, что методы, не вызываемые явно тестами, не выполняются — с или без processUncoveredFilesFromWhitelist="true", Только глобальный & статические функции, вызываемые из теста; методы экземпляра класса, вызываемого в тесте; или что-то похожее на предыдущие два элемента в стеке зависимостей, которые каскадируются из действий теста (насколько я могу судить).

Если вы не используете какую-либо форму насмешки, test-double и т. Д. … для замены или обхода рассматриваемого метода, не существует ничего, что могло бы помешать выполнению метода, вызываемого при выполнении ваших модульных тестов и проверке покрытия.

Это имеет полный смысл.

Оказывается, в моем случае один из файлов, найденных где-то в /my/app каталог был ванильным файлом PHP (не файлом класса).

Когда вы указываете processUncoveredFilesFromWhitelist="true"Если у этого файла есть глобально исполняемый php, он запустится. Любые классы, которые он создает, или методы / функции, которые он вызывает, аналогичны любому другому выполнению кода.

Я использую пользовательский веб-фреймворк MVC, который следует общей парадигме PHP. внутри

  /my/app/public

есть равнина index.php это создаст экземпляр нового приложения и выполнит его.
Что-то вроде:

<?php

$app = new app\MyApp();
$app->handleRequest();

При включении processUncoveredFilesFromWhitelist="true" index.php реагировал так же, как если бы он был вызван запросом Fast CGI от nginx в php-fpm настроил использовать файл — запустил приложение.

Я добавил файл /my/app/public/index.php в мой блок белого списка:

<filter>
<whitelist  addUncoveredFilesFromWhitelist="true" processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">/my/app</directory>
<exclude>
<file>/my/app/public/index.php</file>
</exclude>
</whitelist>
</filter>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]