PHPunitでテストをスキップする方法は?


88

jenkinsに関連してphpunitを使用していますが、XMLファイルで構成を設定して特定のテストをスキップしたい phpunit.xml

コマンドラインで使用できることはわかっています。

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

<filters>タグはコードカバレッジ専用であるため、これをXMLファイルに変換するにはどうすればよいですか?

以外のすべてのテストを実行したい testStuffThatAlwaysBreaks


1
KO:テストを修正するのはどうですか?ところで、wellyからこんにちは;-)
zerkms 2012

私はテストを書きませんでした、それは無関係なものであり、コアファイルも変更したくありません
Filype 2012

間違いなくそうすることができます。これは非常に奇妙な要件です
zerkms 2012

PS:フィルターについておっしゃいましたが、すべてのパスが除外されているため、役に立ちませんでした。そうでなければ<exclude>-あなたのための仕事をするだろう
zerkms

提案されたphpunit.xml.distファイルを投稿できますか?
filype 2012

回答:


167

壊れているテストや後で作業を続ける必要があるテストをスキップする最も速くて簡単な方法は、個々の単体テストの先頭に以下を追加することです。

$this->markTestSkipped('must be revisited.');

xml構成ファイルにはいつでもディレクトリまたはテストを追加できますが、これがコントローラーなどの場合、そのファイルには他にも数十のテストがあるため、あまり実用的ではありません。ユニットテストにアクセスできない場合、理由がわからない場合は、除外する以外に選択肢はありません。
jsteinmann 2012年

5
これは静的メソッド(少なくともPHPUnit 3では)であり、一部のクラスは後期静的バインディングafaikを使用するため、のstatic::markTestSkipped('');代わりに使用する必要があります$this->。新しいPHPバージョンでは警告が生成されます。署名: public static function markTestSkipped($message = '')
ダニエルW.

完全な単体テストファイルのより良い例が必要です。スニペットだけではありません。
Ligemer 2017年

@DanielW。公式PHPUnitのマニュアルが示す例がある$this->markTestSkipped()
nulll

6.5のソースコードで見ることができる@nulllはmarkTestSkipped()まだ静的メソッドです。
ダニエルW.

30

ファイル全体を無視することに対処できる場合は、

<?xml version="1.0" encoding="UTF-8"?>

<phpunit>

    <testsuites>
        <testsuite name="foo">
            <directory>./tests/</directory>
            <exclude>./tests/path/to/excluded/test.php</exclude>
                ^-------------
        </testsuite>
    </testsuites>

</phpunit>

これは私が試したものですが、それでも893テストなし<exclude>と893テストあり<exclude>
Filype 2012

1
テストの実行には約20分かかりますが、実行されるテストの数を確認する簡単な方法はありますか?現在、最初の行が完了するまで待たなければなりません....... 63 / 893 ( 7%)
Filype 2012

5
@Filype:おそらく間違ったパスを指定しました。それは私にとってうまくいきます。テスト数を取得できるかどうかわからない。PS:ユニットテストはそれほど長く実行されるべきではありません。@group本質的にアノテーションと分割テストを使用することをお勧めします
zerkms 2012

20

phpコードとして定義されたカスタム条件に基づいて、特定のファイルからすべてのテストをスキップすると便利な場合があります。makeTestSkippedも機能するsetUp関数を使用して簡単に行うことができます。

protected function setUp()
{
    if (your_custom_condition) {
        $this->markTestSkipped('all tests in this file are invactive for this server configuration!');
    }
}

your_custom_conditionは、静的クラスのメソッド/プロパティ、phpunitブートストラップファイルで定義された定数、またはグローバル変数を介して渡すことができます。


Configクラスとは何ですか?どこに置きますか?
cronfy 2016年

@cronfyは、任意のグローバルスコープアクセス可能なクラス(シングルトン/レジスタデザインパターン)、またはphpunitのブートストラップファイルに設定されたグローバル変数にすることができます。基本的に、ロジックは次のとおりです。if($ testsFromThisFileShouldBeSkipped){$ this-> markTestSkipped(...); }
コンラッドGałęzowski

条件を削除し、あなたの答えは簡単だろう...「ファイル全体をスキップする設定内markTestSkipped」
SPARK

1
@SparKあなたの主張はわかりますが、テストクラス全体を条件付きでスキップする方法を提供していました。私はそれを少し変更し、一般的なルールを支持してそれを行う私のカスタムの方法を削除しました。
コンラートGałęzowski
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.