Передача параметров в PHPUnit - PullRequest
41 голосов
/ 19 января 2010

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

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

Я представляю что-то вроде:

phpunit.bat -X johns_laptop unittest.php

или на альфа-сервере:

phpunit -X alpha unittest.php

В тесте я смогу получить значение, если указан параметр 'X' (или что бы то ни было), и знать, например, каков путь к корню приложения для этой машины.

Не похоже, что командная строка допускает это - или я что-то пропустил?

Ответы [ 9 ]

38 голосов
/ 27 октября 2010

Для этого вы можете использовать ключ --bootstrap PHPUnit.

--bootstrap <file>       A "bootstrap" PHP file that is run before the tests.

Затем создайте файл bootstrap.php, содержащий переменные:

$port = 4445;

В ваших тестах вы можетевозьмите эти значения:

global $port;
$this->setPort($port);

Затем запустите:

phpunit --bootstrap boot.php MyTest.php
32 голосов
/ 19 января 2010

Один из способов - проверить $ argv и $ argc. Что-то вроде:

<?php

require_once 'PHPUnit/Framework/TestCase.php';

class EnvironmentTest extends PHPUnit_Framework_TestCase {
    public function testHasParam() {
            global $argv, $argc;
            $this->assertGreaterThan(2, $argc, 'No environment name passed');
            $environment = $argv[2];
    }
}

Тогда вы можете назвать свой phpunittest следующим образом:

phpunit EnvironmentTest.php my-computer
14 голосов
/ 24 мая 2012

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

export MY_ENV_VAR="some value"

phpunit all

Затем в ваших PHP-файлах вы можете получить к нему следующий доступ:

getenv('MY_ENV_VAR')

Источник: http://blog.lysender.com/2010/10/phpunit-passing-environment-variable-to-your-application/

4 голосов
/ 07 августа 2014

Я не думаю, что ответы выше решают мою проблему.

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

Решение переменных среды хорошее, но не естественное. Выглядит странно

VAR1=aaa VAR2=bbb VAR3=ccc ./phpunit-custom-option CustomOptionTest.php

Сценарий оболочки плюс решение setUp () имеют тот же недостаток, что и принятый. Возможно, вам придется много кода для разбора файла и обработки непредсказуемого количества пользовательских опций.

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

Мне не нравятся все приведенные выше ответы.

И у меня тоже нет хорошей идеи. Но, возможно, то, что я сделал, могло вдохновить тебя. Я разбудил проект phpunit на GitHub, немного изменил код и сделал так, чтобы он поддерживал функцию пользовательских опций.

enter image description here

Модифицированная версия phpunit, может принимать пользовательские опции, такие как:

./phpuint-custom-option --custom var1=value1 --custom var2=value2 CustomOptionTest.php

И в тесте вы можете посетить пользовательские опции, обратившись к суперглобальным переменным $ _SERVER

<?php

class CustomOptionTest extends PHPUnit_Framework_TestCase {

    public function testCustomOption() {
        $this->assertEquals('value1', $_SERVER['var1']);
        $this->assertEquals('value2', $_SERVER['var2']);
    }
}

и вы можете найти мой код здесь и загрузить модифицированную версию здесь (нажав ссылку «просмотреть полный файл» на странице).

FYI. эта статья является аналогичным решением.

3 голосов
/ 23 марта 2017

Как уже упоминал Jasir, однострочным решением было бы установить переменную окружения перед вызовом phpunit.

В Linux:

X=alpha phpunit unittest.php

В Windows, вероятно:

set X=johns_laptop && phpunit.bat unittest.php

А внутри вашего скрипта используйте

getenv('X')

чтобы прочитать значение

2 голосов
/ 25 августа 2014

Все решения здесь верны для вопроса, но есть еще один способ, который может быть проще для некоторых ситуаций. Phing будет принимать аргументы, переданные в виде -Dargument=value

Итак, используя phing -Dtest=MyTest.class.php

Затем вы можете использовать условные выражения phing для обработки этих аргументов:

<if>
    <isset property="test" />
    <then>
        <property name="testFile" value="${test}" />
    </then>
    <else>
        <property name="testFile" value="AllTests.php" />
    </else>
</if>
<exec command="phpunit --bootstrap myTestFile/bootstrap.php- myTestFolder/${testFile}"
      passthru="true" returnproperty="phpunitreturn" />
2 голосов
/ 16 сентября 2013

Я боролся с этой конкретной проблемой и нашел своеобразное, но удобное решение: я записываю параметры в файл на диске и получаю их методом setUp():

public function setUp() {
    $this->setBrowser('firefox');
    $this->base_url = file_get_contents("selenium_host");
    $this->setBrowserUrl($this->base_url);
}

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

run_all_tests.sh

if [ $1 ] 
then
    threads=$1
else
    threads=5
fi
if [ $2 ]
then
    echo $2 > selenium_host
else
    echo 'http://defaulthost.com' > selenium_host
fi

vendor/bin/paratest -p$threads -f --colors TestSuite.php

Затем запустить с 7 потоками против http://adifferenthost.com:

./run_all_tests.sh 7 'http://adifferenthost.com'

1 голос
/ 03 марта 2016

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

Для этого файл конфигурации PHPUnit может оказаться более подходящим. Он дает вам контроль над переменными, специфичными для хоста и даже запроса, включая манипулирование настройками php.ini, а также определение констант, глобальных переменных, $_ENV, $_SERVER и даже $_GET, $_POST и т. Д. Это все сделано в узле <php> файла конфигурации, см. Настройка параметров PHP INI, констант и глобальных переменных

Symfony2 использует этот подход и предоставляет phpunit.xml.dist (конфигурация по умолчанию) и phpunit.xml для ваших модульных тестов. Последний имеет gitignored, чтобы позволить вам настроить его для каждой машины, не влияя на репо. Затем вы должны запустить свои тесты с:

phpunit -c /path/to/phpunit.xml
0 голосов
/ 19 января 2010

Если вы хотите запустить тесты на удаленной машине, используйте ssh, затем запустите его. На локальном компьютере вам нужно только перейти к корневому каталогу и запустить phpunit.

user@local:/path/to/your/project$ phpunit
user@remote:/var/www/project$ phpunit

Редактировать : Вы говорите о конфигурации, зависящей от машины. (Что за conf btw?) Мое решение состоит в том, чтобы поместить эти конфигурации в то же самое место, не контролируемое версиями, а затем прочитать / проанализировать их во время выполнения, в необходимых настройках, например,.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...