Laravel DuskのBrowser Testを個別実行


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

#実行環境
[Laravel Homestead](https://laravel.com/docs/5.5/homestead)


#公式ドキュメント
[Browser Tests (Laravel Dusk)](https://laravel.com/docs/5.5/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)](https://laravel.com/docs/5.5/dusk#environment-handling)

###APP_ENVに関して
また、通常のHTTPテストの際は
[LaravelでHTTPテスト](https://qiita.com/Frog_woman/items/6a143af0a042dc853e88#app_envに関して)
>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`メソッドを個別指定することが出来ました。

`[追記]`
検索用のフィルターパターンは以下のサイトを参考にすれば良さそうです
[フィルターパターン](https://phpunit.de/manual/current/ja/textui.html#textui.examples.filter-patterns)

---




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