Конфигурация PHPUnit (phpunit.xml) - загрузка в начальной загрузке? - PullRequest
10 голосов
/ 20 октября 2010

Положение

Мы используем PHPUnit в нашем проекте и используем phpunit.xml, чтобы обеспечить отключение таких вещей, как backupGlobals.

Чтобы дополнительно убедиться, что путь включения задан и автозагрузка активна, мы также каскадируем наши тестовые загрузчики. То есть каждый тест и все тесты-комплекты имеют require_once(__DIR__ . '/../bootstrap.php'); вверху, вплоть до уровня базовой папки, где он, очевидно, читает require_once(__DIR__ . '/bootstrap.php');, и фактический файл начальной загрузки находится.

По сути, наши тесты автономны. Вы можете вызвать любой AllTests.php в любой папке и любой *Test.php самостоятельно, и они будут работать с правильной конфигурацией.

За исключением № ' Подожди минутку. '

Это верно только в том случае, если мы либо заставим наших разработчиков использовать phpunit --configuration=path/to/phpunit.xml, либо они находятся в папке с phpunit.xml (так что PHPUnit извлекает его из текущего рабочего каталога, когда он выполняется).

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

На самом деле - это случалось несколько раз.

Вопрос

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

Беглый взгляд на код говорит о том, что ответ отрицательный - конфигурация исправна и, похоже, действительно загружается до того, как тестовые файлы даже извлекаются:

[PHPUnit/TextUI/Command.php]
...
if (isset($this->arguments['configuration'])) {
    $configuration = PHPUnit_Util_Configuration::getInstance(
        $this->arguments['configuration']
    );
    $phpunit = $configuration->getPHPUnitConfiguration();
    ...

Это имеет некоторый смысл, учитывая, что конфигурация может содержать тестовые белые или черные списки.

Действительно, не имеет смысла загружать тестовые фильтры в сам тестовый загрузчик, так что это половина потенциальной конфигурации из окна, но фактические поведенческие флаги PHPUnit ...

[sample of part of our phpunit.xml]
<phpunit
    backupGlobals="false" 
    backupStaticAttributes="false" 
    convertErrorsToExceptions="true"  
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    syntaxCheck="false"
    processIsolation="false"
    colors="true">

... возможно, за исключением «цветов», мне кажется, что сам тест должен определиться на каком-то уровне.

Утешительный приз за ...

По общему признанию, сейчас я был бы счастлив, зная, могу ли я преподавать PHPUnit backupGlobals="false" из файла начальной загрузки, если кто-то знает способ.

(Если бесполезный, практический ответ, который я буду преследовать, вероятно, будет копировать phpunit.xml во все подпапки. Я хотел бы избежать этого решения, так как оно создает избыточные копии, и если мы когда-либо решим изменить настройку ... да, ай!)

Ответы [ 3 ]

10 голосов
/ 21 октября 2010

Прямой ответ: Нет, вы не можете этого сделать.

Более длинная история - проблему такого рода лучше решить, изменив привычки разработчиков.

Вот что мы делаем:

  • Все разработчики всегда запускают тесты из корневого каталога tests, в котором есть единственный файл phpunit.xml со всей необходимой конфигурацией, включая начальный загрузчик, который устанавливает автозагрузчик классов.
  • У нас нет тестовых наборов как таковых, тесты сгруппированы с использованием каталогов, нигде нет AllTests.php, потому что в этом нет необходимости.PHPUnit может взять имя каталога и запустить все тесты внутри него.
  • По-прежнему возможно выполнить любой отдельный тест, указав путь к нему или весь набор тестов (указав путь к каталогу).Это просто нужно делать из корневого каталога tests все время, иначе это не сработает.

Выполнение этого означает отказ от возможности запуска PHPUnit из любого каталога, но, честно говоря, яне чувствую, что это потеря вообще.

Выигрыш намного больше: объем служебного кода уменьшен, разработчики не могут ничего забыть, и поэтому результаты последовательны.

4 голосов
/ 30 октября 2012

Мое решение состоит в том, чтобы добавить функцию bash

function phpu ()
{
  phpunit --colors --bootstrap ~/path/to/bootstrap.php "$@";
}

Затем добавьте это во все файлы dev .bashrc, и они смогут перейти на использование этого.

Нам нравится называть их с vim, поэтому мне пришлось добавить это к .vimrc: set shellcmdflag=-ic

Затем вы добавляете nmap ;t :! phpu %, чтобы запустить тестовый файл, который вы сейчас используете.дюймы

0 голосов
/ 01 ноября 2012

Вы можете обновить стартовый скрипт (файл Windows bat или оболочку на * nix) и использовать там логику для настройки на местоположение phpunit.xml. Если он находится в текущем каталоге, используйте его, в противном случае укажите основной.

Я также согласен с Anti, что все тесты должны выполняться всегда, так как вы хотите, чтобы изменения, даже в ветви каталога, не влияли на другой код. Поэтому всегда бегите с вершины дерева. Это также требует, чтобы тест выполнялся быстро, но у меня не было проблемы с PHPUnit на этом.

Поддержание PHPUnit.xml в каждом каталоге было бы кошмаром обслуживания, если только оно не было символически связано с другими путями, чтобы гарантировать, что был только один фактический файл.

...