Я установил в моем 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
<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?
Очевидно, что методы, не вызываемые явно тестами, не выполняются — с или без 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>
Других решений пока нет …