2017-01-22 18 views
0

Я установил в моей phpunit.xml сделать следующее:Как исключить метод из обработки покрытия кода в PHP единицу, если вы установите processUncoveredFilesFromWhitelist = «истинный»

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

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

Однако в одном файле есть один метод, который я бы никогда не оценил для покрытия, поскольку он выводит кучу мусора в мой отчет о покрытии текста. Давайте предположим, что класс/метод называется 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

Это также может помочь, в ситуациях, когда тестовый код вызывает метод, который выводит в браузер: http://stackoverflow.com/questions/ 41163822/phpunit-pick-up-on-syslog-messages/41164122 # 41164122 Это «ловит» выход и отбрасывает его. –

+0

@JohnJoseph Полезный совет. В этом случае, однако, тест не вызывал метод, именно тогда, когда в полях кода загружались файлы openoverd. – Ray

ответ

0

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

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

Это имеет смысл.

В моем случае один из файлов, найденных где-то в каталоге /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>