Laravel Dusk で簡単に自動ブラウザテストをやってみる

2019-12-18

Laravel5.5 自動ブラウザテスト Dusk

Laravel/Duskで結構簡単にブラウザテストができたのでブログ書きます。
laravel5.5インストール済み、artisanコマンド使用できる環境の前提で進めます。

インストール

composerから設定

composer require --dev laravel/dusk:"^2.0"

※最新版はlaravel5.5と合わないので注意

インストール

php artisan dusk:install

特にエラーなく、tests/配下にBrowserができていれば成功

ServiceProviderに登録する

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Laravel\Dusk\DuskServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        if ($this->app->environment('local', 'testing')) {
            $this->app->register(DuskServiceProvider::class);
        }
    }
}

テストケースを作成

artisanコマンドから作成します

$ php artisan dusk:make ExampleTest

するとテストのひな型(tests/Browser/ExampleTest.php)ができます 。

テストを書く (サンプル)

コマンドから生成したひな型(tests/Browser/ExampleTest.php)にテストを書いていきます。
利用可能なアサーションはこちらを参照してください。

?php

namespace Tests\Browser;

use App\User;
use Tests\DuskTestCase;
use Laravel\Dusk\Chrome;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends DuskTestCase
{
    use DatabaseMigrations;

    /**
     * A basic browser test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $user = factory(User::class)->create([
            'email' => '[email protected]',
        ]);

        $this->browse(function ($browser) use ($user) {
            $browser->visit('/login')
                    ->type('email', $user->email)
                    ->type('password', 'secret')
                    ->press('Login')
                    ->assertPathIs('/home')
                    ->assertTtile('Laravel')
                    ->assertSee('Laravel');
        });
    }
}

テスト実行する

php artisan serve

WEBサーバー立てれればxammpとかでもok。今回はaritsanコマンドから
テストにDBデータが必要ならDBも起動させる

以下コマンドでテスト実行

php artisan dusk

テストが通ればOK出してくれます。

# php artisan dusk
PHPUnit 6.5.13 by Sebastian Bergmann and contributors.

[17108:13428:1116/151145.185:ERROR:gpu_process_transport_factory.cc(980)] Lost UI shared context.

DevTools listening on ws://127.0.0.1:12097/devtools/browser/43d31ebf-0eaf-4c69-a7de-8856ea4f468b
.                                                                   1 / 1 (100%)

Time: 13.47 seconds, Memory: 10.00MB

OK (1 test, 3 assertions)

自動でブラウザを起動させる場合

※Chromeが必要です

デフォルトではCUIのみですが、テスト実行と共にブラウザを自動で起動させてテストしたい場合は、

tests/DuskTestCase.php 内の

DuskTestCase->driver()内で設定されている
option “–headless” をコメントアウトするとブラウザが自動で起動し、テストが実行されます。

<?php

/**
 * Create the RemoteWebDriver instance.
 *
 * @return \Facebook\WebDriver\Remote\RemoteWebDriver
 */
protected function driver()
{
    $options = (new ChromeOptions)->addArguments([
        '--disable-gpu',
        //'--headless'
    ]);

    return RemoteWebDriver::create(
        'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(
            ChromeOptions::CAPABILITY, $options
        )
    );
}

本家Doc