Подтвердить что ты не робот

Передача параметров в PHPUnit

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

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

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

phpunit.bat -X johns_laptop unittest.php

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

phpunit -X alpha unittest.php

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

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

4b9b3361

Ответ 1

Один из способов - проверить параметры $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

Ответ 2

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

--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

Ответ 3

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

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

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

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

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

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

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

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

Мне не нравятся все вышеупомянутые ответы.

И у меня тоже нет хорошей идеи. Но, возможно, то, что я сделал, может дать вам вдохновение. Я разветкил проект 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. эта статья является аналогичным решением.

Ответ 5

Все решения здесь верны для вопроса, но есть еще один способ, который может быть проще для некоторых ситуаций. 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" />

Ответ 6

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

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

Вместо прямого вызова phpunit или paratest у меня есть оболочка script для запуска тестов. Этот вызов вызывает 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'

Ответ 7

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

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

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

phpunit -c /path/to/phpunit.xml

Ответ 8

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

[email protected]:/path/to/your/project$ phpunit
[email protected]:/var/www/project$ phpunit

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

Ответ 9

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

В Linux:

X=alpha phpunit unittest.php

В Windows возможно:

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

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

getenv('X')

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