公式ドキュメントに書かれていないので個別に実行する方法の一部を紹介します。
Duskのインストール方法やテストファイルの新規作成方法等は割愛致します。
実行環境
公式ドキュメント
設定ファイル
env
テストを行う際に本番DBを触らないようにテスト用のDBを見るようにします。
通常DB設定は.env
ファイルに記述すると思うのですが
テスト用のDB設定としてLaravelプロジェクト直下に.env.dusk.local
ファイルを作成すると、テストの際はそちらを見るようになります。
Environment Handling
To force Dusk to use its own environment file when running tests, create a .env.dusk.{environment} file in the root of your project. For example, if you will be initiating the dusk command from your local environment, you should create a .env.dusk.local file.When running tests, Dusk will back-up your .env file and rename your Dusk environment to .env. Once the tests have completed, your .env file will be restored.
APP_ENVに関して
また、通常のHTTPテストの際は
LaravelでHTTPテスト
env.testingはphpunitがAPP_ENVをtestingにするようなので、testingにしなくても大丈夫らしいです。
と記述したのですが、Duskの方は特にAPP_ENVに関する記述がないので
APP_ENVをtestingにした方が良さそうです。
phpunit.xml
テストの対象となっているファイルの設定等はプロジェクトフォルダ直下の phpunit.xml
にて設定を行います。
テスト対象を変更・追加
対象ディレクトリを変更するには <filter></filter>
を変更します。
デフォルトでは
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./app</directory>
</whitelist>
</filter>
上記のように書かれており、app
ディレクトリ配下が全てテストの対象になっています。
なので、以下のような設定を行うことでapp内の特定のディレクトリ下だけ等変更が可能となっております。
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./app/Http/Controllers</directory>
</whitelist>
</filter>
<directory></directory>
は複数記述することが可能です
テスト対象から除外
また、テストを除外したい場合は、
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./app</directory>
</whitelist>
<exclude>
<file>./app/Http/Controllers/TestController.php</file>
</exclude>
</filter>
のように <exclude></exclude>
内に<file></file>
を使って指定が可能です。
通常のDusk実行コマンド
$ php artisan dusk
上記のコマンドを叩くとLaravelプロジェクト/tests/Broser
の配下にあるテストファイルが全て実行されます。
個別実行
Pathで指定
特定のテストファイルのみを実行したい場合、パスを指定し実行することが可能です
$ php artisan dusk tests/Browser/DuskTest1.php
groupアノテーションで指定
実行したいテスト関数の@groupにgroup名を設定し、指定してあげることで個別にテストを実行することが可能です
/**
* @group groupname1
*/
public function test1()
{
//
}
上記のようなテストだけを実行したい場合は
$ php artisan dusk --group=groupname1
クラス名やメソッド名にて指定
この指定方法がよく分かりませんでした。
ちょっとここは、最終的なコマンドになるまでの愚痴を含めて綴ります
そもそもduskはヘルプコマンドがないし、公式にもgroupアノテーションの方法しか書いていません。
いちいちgroupを記述するのも面倒なので他に何か良さそうなものがないか調べていると、
filter
オプションが存在することが分かりました
が、filter
オプションを使ってもクラス名
かメソッド名
の指定しかできない
とあるクラスの特定のメソッド
のような指定ができませんでした。
クラス名 or メソッド名
例として以下のようなテストコードがあるとします。
class DuskTest1 extends DuskTestCase
{
public function testSuccess()
{
$this->browse(function (Browser $browser) {
//
});
}
public function testError()
{
$this->browse(function (Browser $browser) {
//
});
}
}
この場合
$ php artisan dusk --filter DuskTest1
と叩くと、DuskTest1クラス
に生えてるtestSuccess
とtestError
メソッドが実行されます
また、
$ php artisan dusk --filter testSuccess
と叩くと、testSuccess
のみを実行できます
クラス名 and メソッド名(中途半端)
しかし両方を満たす方法があることを信じ、何度か色々試していると
$ php artisan dusk
を実行時、エラーになるとログとして
There was 1 error:
1) Tests\Browser\DuskTest1::testError
のようなログが吐かれていることに気がつきました
...ということで
$ php artisan dusk --filter DuskTest1::testSuccess
これでDuskTest1
クラスの中のtestSuccess
メソッドを個別指定できるようになりました
クラス名 and メソッド名(最終系)
しかし、上記のコマンドだと完璧ではありませんでした。
例えば
$ php artisan dusk --filter DuskTest1::test
のように実行すると
これでDuskTest1
クラスの中のtestSuccess
とtestError
メソッドの両方が実行されるのである
つまり、これは正規表現だったようだ
知らんがな、そんなの、何処に説明があるんじゃ
ってことで、最終的に以下のようなコマンドになりました
$ php artisan dusk --filter DuskTest1::'testSuccess$'
これで、あんまり綺麗じゃない感じですが
DuskTest1
クラスの中のtestSuccess
メソッドを個別指定することが出来ました。
[追記]
検索用のフィルターパターンは以下のサイトを参考にすれば良さそうです
フィルターパターン
他に良いやり方や、Dusk Testの実行に関して詳しく書いてある記事等がありましたら教えて下さると助かります。