Laravel 5.5 & Laradock(https://github.com/laradock/laradock)環境です。
Laradockについては少し古いかもしれません(活発に更新されているのですぐに古くなる)。
Laravel Dusk はブラウザテストをお手軽に!というパッケージです。
https://readouble.com/laravel/5.5/ja/dusk.html
Laradockでのセットアップと使い始めてすぐのログインテストで何回かつまづいたのでメモを残しておきます。
まず、Laradockのドキュメント通りにセットアップしても正常動作しませんでした(2017/12/13現在)
LaradockでLaravel Duskを動かすメモ(https://qiita.com/uenoryo/items/bdded2dc6f8e5f2075cc)
こちらを参考に動かすことができました。ただし、seleniumコンテナへフォントを入れなければ失敗時などのscreenshotで日本語が表示されないため laradock/selenium/Dockerfile を以下のように編集しました。
FROM selenium/standalone-chrome
MAINTAINER Edmund Luong <edmundvmluong@gmail.com>
RUN sudo apt-get update && sudo apt-get install fonts-ipafont -y
EXPOSE 4444
そしてビルド
$ docker-compose up -d --build selenium
これで豆腐たち(□□□□的な文字化け)とはおさらばです。
午前中、Laravelへのブラウザでのログインテストが動かないと悩んでた原因はセッションドライバにarrayを設定してたというオチだったアカウントがこちら。単体テスト用の設定流用してたのが原因(調整漏れ)。
— murave (@murave) 2017年12月13日
.env.dusk.local でDusk用の設定が行えるのですが単体テスト用のものをコピーして修正していたためセッションにarrayドライバを設定してたのでした。
https://readouble.com/laravel/5.5/ja/session.html
array – セッションはPHPの配列として保存されるだけで、リクエスト間で継続しません。
ですよね〜。
他環境への影響を抑えるためにCookieドライバを使用することにしました。
SESSION_DRIVER=cookie
テスト開始時にデータベースクリアしてマイグレーションしてマスター用のSeederでマスター準備してFakerでユーザー作って、みたいにやるじゃないですか。
Laravel 5.5 にはRefreshDatabaseという便利トレイトがあります。
https://readouble.com/laravel/5.5/ja/database-testing.html
前のテストがその後のテストデータに影響しないように、各テストの後にデータベースをリセットできると便利です。インメモリデータベースを使っていても、トラディショナルなデータベースを使用していても、RefreshDatabaseトレイトにより、マイグレーションに最適なアプローチが取れます。テストクラスてこのトレイトを使うだけで、全てが処理されます。
そう、全てが処理されるのです。影響が残らないようにTransaction中に処理してRollbackまでしてくれる。便利。
だが思い出そう。ブラウザテストだということを。
ページ遷移したらデータ消えるわけで、うっかりRefreshDatabaseトレイトを使うと想定通りに動作しません。
そんなわけで、リセットしてマイグレーションまでだけしてくれるDatabaseMigrationsトレイトのほうを使いましょう。
例
<?php
namespace Tests\Browser;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use App\User;
class LoginTest extends DuskTestCase
{
use DatabaseMigrations; //実行時DB内容は消える
public function testLogin()
{
\Artisan::call('db:seed', ['--class' => 'MasterSeeder']);
$user = factory(User::class)->create();
$this->browse(function (Browser $browser) use ($user) {
$browser->visit('/login')
->type('email', $user->email)
->type('password', 'secret')
->press('ログイン')
->assertPathIs('/home');
});
}
}
この例ではDatabaseMigrationsで再構築されたまっさらな状態のデータベースにマスター系投入用のMasterSeederを実行した後にテスト用のユーザーを作成してログイン処理のテストを行っています。