Laravel5.4よりDusk(だーすく?)というブラウザテストツールが加わったので使ってみます。
Seleniumが王道かもしれませんがLaravelで完結できて、使いやすいとなると、それに越したことはございません。
なお、私の利用は「Laravelサイト自身はもちろん、他のサイトのテストツールとして使いたい」というところです。
準備
Laravelのインストール
まずはLaravelのインストール。まあ、Composerで提供されるのでなくても使えるのかな・・・。別途調べます。
composer create-project laravel/laravel dusktest
duskのインストール
dusk自体のインストール。追加でインストールする必要があるようですが、別に問題ありません。
cd dusktest
composer require --dev laravel/dusk
php artisan dusk:install
日本語対応
テスト先のサイトが日本語を含む場合、以下の対応が必要とのことです。
dusk:installするとtest以下にテストの起点となるDuskTestCase.phpが追加されるので下記のように追加します。
..
protected function driver()
{
$options = (new ChromeOptions)->addArguments([
'--disable-gpu',
'--headless',
+ '--lang=ja_JP'
]);
return RemoteWebDriver::create(
'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(
ChromeOptions::CAPABILITY, $options
)
);
}
...
テストを行う
では、実際にテストを行ってみます。
テストファイルの作成
まずは、dusk makeでテストファイルを作成。
php artisan dusk:make AccessTest
テストファイルの編集
テストファイルを下記のように編集します。今回のテストでは、
- そもそもサイト全体にBasic認証がかかっている
- Basic認証後にログインページがある
- ログインする
- ログイン後のページに含まれる文字を検証
- スクリーンショットもとっておく
という流れ。リリース前の管理画面などではよくあるケースかと思います。
<?php
namespace Tests\Browser;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class AccessTest extends DuskTestCase
{
/**
* A Dusk test example.
*
* @return void
*/
public function testExample()
{
$this->browse(function (Browser $browser) {
$browser->visit('https://username:password@testsite.hoge/login') //Basic認証
->value('input[name="email"]','hoge@hoge.com') //nameで指定
->value('input[name="password"]','hogehoge') //nameで指定
->press('LOGIN') //submitなら文字で指定可能
->assertSee('Sccess') //ログイン後のページに文字が含まれるか
->screenshot("logined"); //screenshotを取得
});
}
}
Basic認証は https://username:password@hostname/ とするようです。
テストの実行
完了したらテストを実行します。
php artisan dusk
テストの結果
OKならグリーン画面がでます。なお、assertが一個も無いと警告みたいなオレンジ画面になるようです。
PHPUnit 7.1.5 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 2.49 seconds, Memory: 12.00MB
OK (1 test, 1 assertion)
個別リクエストの指定方法
php artisan dusk tests/Browser/AccessTest.php
本家ページ
後は、本家ページを見て、いろいろAssertionを追加するだけ。うーん。便利。
参考ページ
以下のページを参考にさせていただきました。ありがとうございます。