PHPUnitで単一のテストメソッドを実行する方法


334

私は名前の単一のテストメソッドを実行するために苦労していtestSaveAndDropたファイルにescalation/EscalationGroupTest.php付きをphpunit。私は次の組み合わせを試しました:

phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=escalation/EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=testSaveAndDrop

いずれの場合、ファイル内のすべてのテストメソッドescalation/EscalationGroupTest.phpが実行されます。代わりにメソッドを1つだけ選択する方法は?

クラスの名前はEscalationGroupTestで、バージョンphpunitは3.2.8です。


テストクラスのクラス名は何ですか?
sectus 14

回答:


458

次のコマンドは、単一のメソッドでテストを実行します。

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

phpunit --filter methodName ClassName path/to/file.php

新しいバージョンのphpunitの場合は、次のようになります。

phpunit --filter methodName path/to/file.php

1
EscalationGroupTestの書き込みは必要でしたか?それの用途は何ですか?
mujaffars 2016


15
testSaveAndDrop *という名前のテストメソッドも実行します(例:testSaveAndDropSomething)。testSaveAndDropを正確に実行するには、-filter '/ :: testSaveAndDrop $ /'を使用します
Farid Movsumov

1
@mujaffars疑わしいですが、 "I got it"は空白のため、phpでは有効な識別子ではありません。
Jon McClung、2018年

2
これは現在動作しません。それはただphpunit --filter methodName path/to/testing/file、いいえClassName です。
CJデニス

213

私は注釈でテストをマークすることを好む

/**
 * @group failing
 * Tests the api edit form
 */
public function testEditAction()

次にそれを実行します

phpunit --group failing

コマンドラインでフルパスを指定する必要はありませんが、コードを煩雑にするのではなく、コミットする前にこれを削除することを覚えておく必要があります。

1つのテストに複数のグループを指定することもできます

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}

4
この方法が好きですが、注釈を使用して複数のグループを割り当てることはできますか?@group failing, Integration
ディジーブライアンハイ

4
はい、もちろん。ただし、カンマ区切りではありません。これを説明するために回答を編集しました。
iamtankist 2015

私はこの方法の方が好きです...参考のために、phpunit.xmlの<groups>要素を使用してテストをフィルタリングすることもできます... <phpunit><groups> <include> <group> failing </ group > </ include> </ groups>
Nicolas Galler、

2
しかし問題は-SINGLEテストを実行することでした。また、failingという名前のグループは、使用できる最悪のグループです。一部のテストが失敗した後、phpunit --groupを実行すると、失敗したテストをグループに渡さずに実行できなくなります。ややこしい。
ラファウMnich

ベストアンサー!@depends別のテストの場合、単一のテストはないため、相互接続されたすべてのテストを正確に特定して、@group注釈を使用する必要があります。
センチュリアン

116

より一般的な答えは次のとおりです。

メソッド名が一意であることが確実な場合は、メソッド名でのみフィルタリングできます(これは私にとっては機能します)

phpunit --filter {TestMethodName}

ただし、ファイルのパス/参照も指定する方が安全です。

phpunit --filter {TestMethodName} {FilePath}

例:

phpunit --filter testSaveAndDrop reference/to/escalation/EscalationGroupTest.php

クイックノート:という名前testSaveの関数とtestSaveAndDropusingコマンドという名前の別の関数があり、で始まる他の関数phpunit --filter testSaveも実行されるtestSaveAndDropと、testSave*奇妙なことに気づきました!!


4
それはまったく変ではありません、それは基本的に部分文字列の一致です。:トークン文字列のあなたがその行動をしたい場合は、使用終了/testSave$/
キリスト教の

ファイルパスのみを指定して、そのファイル内のすべてのテストが実行されるようにするにはどうすればよいですか?
still_dreaming_1 2016

48

次のコマンドは正確に testSaveAndDropテストを実行ます。

phpunit --filter '/::testSaveAndDrop$/' escalation/EscalationGroupTest.php

4
うまくいきませんでした。最後にでは\bなくを使用$してトリックを行いました:--filter '/::testSaveAndDrop\b/'
ジョー

1
メソッド名の語尾の両方'/::testSaveAndDrop\b/'とは'/::testSaveAndDrop$/'、このように私のために働いたphpunit --filter ClassName::methodName$phpunit --filter ClassName::methodName\bする(Linux上)
バレンタイン市

22

多くの方法でlaravelでphpunit testを実行します。

vendor/bin/phpunit --filter methodName className pathTofile.php

vendor/bin/phpunit --filter 'namespace\\directoryName\\className::methodName'

テスト単一クラスの場合:

vendor/bin/phpunit --filter  tests/Feature/UserTest.php
vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest'
vendor/bin/phpunit --filter 'UserTest' 

テスト単一メソッドの場合:

 vendor/bin/phpunit --filter testExample 
 vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest::testExample'
 vendor/bin/phpunit --filter testExample UserTest tests/Feature/UserTest.php

名前空間内のすべてのクラスからテストを実行する場合:

vendor/bin/phpunit --filter 'Tests\\Feature'

より多くの方法でテスト実行するには、もっと見る


21

だから、このようなもの

phpunit --filter 'EscalationGroupTest::testSaveAndDrop' EscalationGroupTest escalation/EscalationGroupTest.php 

なし=とあり'

https://phpunit.de/manual/3.7/en/textui.h​​tml


いいえ、これは機能しません。クラス内のすべてのテストEscalationGroupTestが処理されています。
Alex

それでも、9つのテストすべてが実行されています。phpunitバージョン3.2.8
Alex

2
--filterファイル名の前にを移動すると、物事は正しく機能します。
Schleis、2015年

PHPUnit 4.8.10で私のために働いた
Asaph

これによりNo tests executed!、PHPUnit 4.8.35 @Schleisが表示されます。コマンドはどのように変更しましたか?
Andru 2017

13
  • これを、laravelルートディレクトリで使用しているプロジェクトルートディレクトリ内で実行します。

vendor/bin/phpunit --filter 'Your method name'

カスタムメソッド名の例。

 /** @test //Initilize this for custom method name, without test keyword
  *  
  * Test case For Dashboard When User Not logged In it will redirect To login page
  */
  public function only_logged_in_user_see_dashboard()
  {
    $response = $this->get('/dashboard')
                   ->assertRedirect('/login');
  }

テストキーワードの例

/**
* A basic test example.
*
* @return void
*/
 public function testBasicTest()
 {
  $this->assertTrue(true);
 }

1
あなたのコードが何をしているかについてより具体的にしてください。
dpapadopoulos

1
確かに私は初心者ですが、今後の応答でより具体的なコードを試してみます
Connectify_user

7

netbeansを使用している場合は、テストメソッドを右クリックして[フォーカステストメソッドの実行]をクリックします。

[フォーカステストメソッドの実行]メニュー


7

あなたはこれを試すことができます私は単一のテストケースを実行することができます

phpunit tests/{testfilename}

例えば:

phpunit tests/StackoverflowTest.php

Laravel 5.5で単一のテストケースを実行する場合

vendor/bin/phpunit tests/Feature/{testfilename} 

vendor/bin/phpunit tests/Unit/{testfilename} 

例えば:

vendor/bin/phpunit tests/Feature/ContactpageTest.php 

vendor/bin/phpunit tests/Unit/ContactpageTest.php

問題は、単一のテスト方法(クラスではない)を実行する方法でした
アレクセイアキレイキン

4

テストがすべて実行されている理由は--filter、ファイル名の後にフラグがあるためです。PHPUnitはオプションをまったく読み取っていないため、すべてのテストケースを実行しています。

ヘルプ画面から:

 Usage: phpunit [options] UnitTest [UnitTest.php]
        phpunit [options] <directory>

したがって--filter、@ Alexおよび@FeridMövsümovの回答で述べたように、必要なテストファイルの前に引数を移動します。そして、実行したいテストだけが必要です。


これは元の質問に対応しているとは思いません...多くの単体テストが含まれているファイルでテストの1つだけを実行する必要があるという同じ問題があり、フィルターを使用した他の2つの回答が機能しました
jfoo

@jfoo OPのコマンドの問題の1つは、--filterオプションがファイル名の後にあることでした。他の2つの答えは正解でしたが、フィルターが適用されている理由を指摘していませんでした。
Schleis、2015年


1

パーティーには遅れるけど。でも個人的には全行を書きたくないです。

代わりに、.bash_profileファイルで次のショートカットを使用します。新しいエイリアスを追加した後は、必ず.bash_profileソースにしてください。そうしないと機能しません。

alias pa="php artisan"
alias pu="vendor/bin/phpunit" 
alias puf="vendor/bin/phpunit --filter"

使用法:

puf function_name

puf filename

あなたが使用している場合はVisual Studioのコードを、あなたのテストがそよ風にするために、次のパッケージを使用することができます。

Package Name: Better PHPUnit
Link: https://marketplace.visualstudio.com/items?itemName=calebporzio.better-phpunit

その後、設定でキーバインドを設定できます。MACでCommand + Tバインディングを使用しています。

これで、カーソルを任意の関数に置き、キーバインディングを使用すると、その単一のテストが自動的に実行されます。

クラス全体を実行する必要がある場合、カーソルをに置き、キーバインディングを使用します。

他に何かがある場合は、常にターミナルを使用してください。

ハッピーコーディング!


0

単一のテストメソッドを実行するには、-filterを使用する必要があります php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

上記のフィルターはtestMethodのみを実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.