10

状況

私たちはプロジェクトでPHPUnitを使用しており、などがオフになっているphpunit.xmlことを確認するためにを使用しています。backupGlobals

インクルードパスが設定され、自動ロードがアクティブであることをさらに確認するために、テストブートストラップもカスケード接続します。つまり、すべてのtestとalltests-suiterequire_once(__DIR__ . '/../bootstrap.php');の上部には、明らかに読み取りが行われるベースフォルダーレベルまでの上部がrequire_once(__DIR__ . '/bootstrap.php');あり、実際のブートストラップファイルが存在します。

基本的に、私たちのテストは自律的です。AllTests.php任意のフォルダ内の任意のファイルを単独で呼び出すことができ*Test.php、適切な構成で実行されます。

いいえを除いて。'ちょっと待ってください。'

これは、開発者に使用を強制するか、開発者が(PHPUnitが実行されたときに現在の作業ディレクトリからプルするように)phpunit --configuration=path/to/phpunit.xmlのあるフォルダーにいる場合にのみ当てはまります。phpunit.xml

場合によっては、これにより、ある開発者のマシンでのテストが失敗している理由と、別の開発者のマシンで実行されている理由を特定することが非常に困難になります。同じテスト環境が必要なのはブートストラップだけではないことを忘れるだけです。試してみるとブートストラップを忘れることができなかったので、それはテスト自体にあるため、他の設定、特に通常はオプションの設定を忘れていることに注意してください(のようなフォルダにいる場合は、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">

...おそらく、「色」を除いて、テスト自体が何らかのレベルで決定できるはずの何かとして私を襲います。

慰め賞...

backupGlobals="false"確かに、誰かが方法を知っていれば、今のところ、ブートストラップファイルからPHPUnitを教えることができるかどうかを知って幸せです。

(役に立たない場合、私が追求する実際的な答えは、おそらくphpunit.xmlすべてのサブフォルダーにコピーすることです。冗長なコピーが作成されるため、その解決策は避けたいと思います。設定を変更することを選択した場合は...ええ、痛いです。 !)

4

3 に答える 3

10

直接の答え:いいえ、それはできません。

長い話-この種の問題は、開発者の習慣を変えることでよりよく解決されます。

これが私たちのやり方です:

  • すべての開発者は、常にテストルートディレクトリからテストを実行します。このディレクトリには、クラスオートローダーを設定するブートストラップを含む、必要なすべての構成を備えた唯一のphpunit.xmlがあります。
  • テストスイート自体はありません。テストはディレクトリを使用してグループ化され、AllTests.phpは必要ないため、どこにもありません。PHPUnitはディレクトリの名前を取り、その中のすべてのテストを実行できます。
  • それでも、単一のテストまたはテストスイート全体へのパスを指定することで(ディレクトリへのパスを指定することで)、任意の単一のテストを実行できます。常にテストルートディレクトリから実行する必要があります。そうしないと機能しません。

このようにすることは、どのディレクトリからでもPHPUnitを起動する自由を放棄することを意味しますが、正直に言うと、それがまったく損失になるとは感じません。

メリットははるかに大きくなります。ハウスキーピングコードの量が減り、開発者は何も忘れることができないため、結果は一貫しています。

于 2010-10-20T21:34:10.340 に答える
4

私の解決策はbash関数を追加することです

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

次に、これをすべてのdev .bashrcファイルに追加すると、使用に切り替えることができます。

私たちはそれらをから呼び出すのが好きなvimので、これをに追加する必要がありました.vimrcset shellcmdflag=-ic

nmap ;t :! phpu %次に、現在使用しているテストファイルを実行するために追加します。

于 2012-10-30T14:33:35.750 に答える
0

開始スクリプト(Windows batファイル、または* nixのシェル)を更新し、そこにphpunit.xmlの場所に構成するロジックを含めることができます。現在のディレクトリにある場合はそれを使用し、そうでない場合はメインディレクトリをポイントします。

また、Antiにも同意します。ただし、ディレクトリブランチであっても、変更が他のコードに影響を与えないようにするために、すべてのテストを常に実行する必要があります。したがって、常にツリーの先頭から実行してください。これには、テストを迅速に実行することも必要ですが、PHPUnitで実際に問題が発生したことはありません。

PHPUnit.xmlを各ディレクトリに維持することは、実際のファイルが1つしかないことを確認するために他のパスからシンボリックにリンクされていない限り、メンテナンスの悪夢になります。

于 2012-10-31T20:57:38.373 に答える