PHPUnitテストの作成を開始し、テストを開発者のマシンとサーバーの両方から実行したいと考えています。開発者のマシンは、サーバーとは異なる方法で、さらには互いに異なる方法でセットアップされます。
これらのさまざまな場所で実行するには、テストを実行する人がそれが実行されている場所を示す必要があるようです。テストは、それが実行されているマシンの適切な構成を検索できます。
私は次のようなものを想像しています:
phpunit.bat -X johns_laptop unittest.php
またはアルファサーバー上:
phpunit -X alpha unittest.php
テストでは、 'X'(またはそれが何であれ)パラメータの値を取得し、たとえば、このマシンのアプリルートへのパスが何であるかを知ることができます。
コマンドラインがそれを可能にするように見えません-または何かを見逃しましたか?
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
これには、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
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/
上記の答えが私の同じ問題を解決するとは思いません。
受け入れられた答えは完璧ではありません。このように、カスタムオプションは常にパラメーターリストの最後に配置する必要があり、カスタムオプションであることを示すインジケーターはありません。必要なカスタムオプションの数が固定されていない場合は、正規表現などでカスタムオプションを解析するために多くのコードを記述する必要があります。
環境変数のソリューションは優れていますが、自然ではありません。奇妙に見えます。
VAR1=aaa VAR2=bbb VAR3=ccc ./phpunit-custom-option CustomOptionTest.php
シェルスクリプトとsetUp()ソリューションは、受け入れられているものと同じ弱点を共有しています。ファイルを解析し、予測できない数のカスタムオプションを処理するには、多くのコードを記述しなければならない場合があります。
bootstrapスクリプトは正しい解決策だとは思いません。汚い作業を自動的に処理するために使用できます。毎回同じことを行いますが、変更部分は適切に処理しません。
上記のすべての答えが好きではありません。
そして私自身も良い考えがありません。しかし、多分私がやったことがあなたにインスピレーションを与えるかもしれません。 GitHubのphpunitプロジェクトを分岐し、コードを少し変更して、カスタムオプション機能をサポートするようにしました。
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']);
}
}
そして、あなたは私のコードを見つけることができます ここ 、そして修正されたバージョンをダウンロード ここ (ページ上の「ファイル全体を見る」リンクをクリックすることによって)。
ご参考までに。 この記事 は同様のソリューションです。
Jasirがすでに述べたように、1行の解決策は、phpunit呼び出しの前に環境変数を設定することです。
Linuxの場合:
X=alpha phpunit unittest.php
Windowsではおそらく:
set X=johns_laptop && phpunit.bat unittest.php
そしてあなたのスクリプトの中で
getenv('X')
値を読み取る
私はこの正確な問題に苦労し、ちょっとした便利な解決策を思いつきました。ディスク上のファイルにパラメーターを書き込み、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'
ここでのすべての解決策は質問に対して有効ですが、状況によってはより簡単な別の方法もあります。 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" />
コマンドラインで引数を渡すことは、テスト実行ごとにテストパラメーターを変更する場合に意味があります。異なるマシンでホスト固有のテストを実行することは、このソリューションの正当な理由ではありません。
そのためには、 PHPUnit設定ファイル の方が適している場合があります。 php.ini
設定の操作や、定数、グローバル変数、$_ENV
、$_SERVER
、および$_GET
の定義など、ホスト固有およびリクエスト固有の変数を制御できます。 $_POST
など。これはすべて、構成ファイルの<php>
ノードの下で行われます。 Setting PHP INI =設定、定数、グローバル変数
Symfony2はこのアプローチを使用し、phpunit.xml.dist
(デフォルト設定)とphpunit.xml
の両方をユニットテストで提供します。後者はgitignoredで、リポジトリに影響を与えずにマシンごとにカスタマイズできます。次に、以下を使用してテストを実行します。
phpunit -c /path/to/phpunit.xml
リモートマシンでテストを実行する場合は、sshを使用して実行します。ロケールマシンでは、ルートディレクトリにcdし、phpunitを実行するだけです。
user@local:/path/to/your/project$ phpunit
user@remote:/var/www/project$ phpunit
編集:マシン依存の構成について話している。 (どのような種類のconf btw?)私の解決策は、これらの構成をバージョン管理されていない同じ場所に配置し、必要なセットアップメソッドなどで実行時に読み取り/解析することです。