web-dev-qa-db-ja.com

PHPUnitにパラメーターを渡す

PHPUnitテストの作成を開始し、テストを開発者のマシンとサーバーの両方から実行したいと考えています。開発者のマシンは、サーバーとは異なる方法で、さらには互いに異なる方法でセットアップされます。

これらのさまざまな場所で実行するには、テストを実行する人がそれが実行されている場所を示す必要があるようです。テストは、それが実行されているマシンの適切な構成を検索できます。

私は次のようなものを想像しています:

phpunit.bat -X johns_laptop unittest.php

またはアルファサーバー上:

phpunit -X alpha unittest.php

テストでは、 'X'(またはそれが何であれ)パラメータの値を取得し、たとえば、このマシンのアプリルートへのパスが何であるかを知ることができます。

コマンドラインがそれを可能にするように見えません-または何かを見逃しましたか?

44
dl__

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

これには、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
40
Mark Theunissen

bootstrapファイルとテストファイルの両方に変数を渡すための洗練された方法は、環境変数を使用することです。

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/

15
scribu

上記の答えが私の同じ問題を解決するとは思いません。

受け入れられた答えは完璧ではありません。このように、カスタムオプションは常にパラメーターリストの最後に配置する必要があり、カスタムオプションであることを示すインジケーターはありません。必要なカスタムオプションの数が固定されていない場合は、正規表現などでカスタムオプションを解析するために多くのコードを記述する必要があります。

環境変数のソリューションは優れていますが、自然ではありません。奇妙に見えます。

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

シェルスクリプトとsetUp()ソリューションは、受け入れられているものと同じ弱点を共有しています。ファイルを解析し、予測できない数のカスタムオプションを処理するには、多くのコードを記述しなければならない場合があります。

bootstrapスクリプトは正しい解決策だとは思いません。汚い作業を自動的に処理するために使用できます。毎回同じことを行いますが、変更部分は適切に処理しません。

上記のすべての答えが好きではありません。

そして私自身も良い考えがありません。しかし、多分私がやったことがあなたにインスピレーションを与えるかもしれません。 GitHubのphpunitプロジェクトを分岐し、コードを少し変更して、カスタムオプション機能をサポートするようにしました。

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']);
    }
}

そして、あなたは私のコードを見つけることができます ここ 、そして修正されたバージョンをダウンロード ここ (ページ上の「ファイル全体を見る」リンクをクリックすることによって)。

ご参考までに。 この記事 は同様のソリューションです。

4
Charles

Jasirがすでに述べたように、1行の解決策は、phpunit呼び出しの前に環境変数を設定することです。

Linuxの場合:

X=alpha phpunit unittest.php

Windowsではおそらく:

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

そしてあなたのスクリプトの中で

getenv('X')

値を読み取る

3
Victor

私はこの正確な問題に苦労し、ちょっとした便利な解決策を思いつきました。ディスク上のファイルにパラメーターを書き込み、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

次に、 http://adifferenthost.com に対して7つのスレッドで実行するには:

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

2
ehed

ここでのすべての解決策は質問に対して有効ですが、状況によってはより簡単な別の方法もあります。 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
Frug

コマンドラインで引数を渡すことは、テスト実行ごとにテストパラメーターを変更する場合に意味があります。異なるマシンでホスト固有のテストを実行することは、このソリューションの正当な理由ではありません。

そのためには、 PHPUnit設定ファイル の方が適している場合があります。 php.ini設定の操作や、定数、グローバル変数、$_ENV$_SERVER、および$_GETの定義など、ホスト固有およびリクエスト固有の変数を制御できます。 $_POSTなど。これはすべて、構成ファイルの<php>ノードの下で行われます。 Setting PHP INI =設定、定数、グローバル変数

Symfony2はこのアプローチを使用し、phpunit.xml.dist(デフォルト設定)とphpunit.xmlの両方をユニットテストで提供します。後者はgitignoredで、リポジトリに影響を与えずにマシンごとにカスタマイズできます。次に、以下を使用してテストを実行します。

phpunit -c /path/to/phpunit.xml
1
gopherIT

リモートマシンでテストを実行する場合は、sshを使用して実行します。ロケールマシンでは、ルートディレクトリにcdし、phpunitを実行するだけです。

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

編集:マシン依存の構成について話している。 (どのような種類のconf btw?)私の解決策は、これらの構成をバージョン管理されていない同じ場所に配置し、必要なセットアップメソッドなどで実行時に読み取り/解析することです。

0
erenon