テスト
laravel
laravel5.5

Laravel DuskのBrowser Testを個別実行

More than 1 year has passed since last update.

公式ドキュメントに書かれていないので個別に実行する方法の一部を紹介します。
Duskのインストール方法やテストファイルの新規作成方法等は割愛致します。

実行環境

Laravel Homestead

公式ドキュメント

Browser Tests (Laravel 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.

Browser Tests (Laravel Dusk)

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クラスに生えてるtestSuccesstestErrorメソッドが実行されます

また、

$ 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クラスの中のtestSuccesstestErrorメソッドの両方が実行されるのである

つまり、これは正規表現だったようだ

知らんがな、そんなの、何処に説明があるんじゃ

ってことで、最終的に以下のようなコマンドになりました

$ php artisan dusk --filter DuskTest1::'testSuccess$'

これで、あんまり綺麗じゃない感じですが
DuskTest1クラスの中のtestSuccessメソッドを個別指定することが出来ました。

[追記]
検索用のフィルターパターンは以下のサイトを参考にすれば良さそうです
フィルターパターン


他に良いやり方や、Dusk Testの実行に関して詳しく書いてある記事等がありましたら教えて下さると助かります。