BackEnd

Laravelのブラウザテスト「Dusk」をシンプルなCRUDで始めてみよう

投稿日:

はじめに

Laravelでは標準で単体テストを実行できますが、公式パッケージ Laravel Duskを使用すると、ブラウザテスト作成・実行ができるようになります。今回は、CRUDを例に、セットアップと基本的なアクション・アサーションを紹介します。

Laravel Duskのセットアップ

まずは、composerでインストールします。

次に、artisanコマンドで必要なファイルを配置します。

tests/Browswerディレクトリが作成され、ブラウザテストに必要なファイルが配置されます。構造は次のようになっています。

今回は触れませんが、ページやコンポーネントを使用すると、テストをより構造的に実装することができ、同じUIパーツやページをテストする際に、コードを使いまわせるようになります。
また、consoleはブラウザコンソールの内容、screenshotsにはテスト失敗時や、任意のタイミングでスクリーンショットを撮影したときの画像が入ります。

新規登録のテスト

テスト対象となるコード

前提となる機能を実装します。今回は、書籍を登録・更新・削除できるサンプルコードになります。まずは、一覧と新規登録を作成します。

web.php

BookController

BookRequest

index.blade

edit.blade

form.blade

Duskのテストコード

まずは、テスト用のクラスを作成します。

すると、 tests/Browser/BookCreateTest.phpが生成されます。ここに、テストコードを書いていきます。

PHPUnitを使用しているので、メソッド名のプレフィックスに testを付けるか、アノテーションを設定します。
基本的には、 $browserに続けて、動作とアサーションを記述していきます。最初の例では、新規作成画面に遷移し、必要なパラメータを入力します。
2つめの例では、入力せずに送信し、バリデーションエラーの文言をチェックしています。
ここで使用しているメソッドを紹介します。

  • type(テキストボックスのname, 入力内容文字列)
    テキストボックスに入力します。
  • click(セレクタ)
    ボタンをクリックします。セレクタにはCSSセレクタが使用できるので、例えばid等でclick('#register') と指定することもできます。
  • clickLink(テキスト)
    テキストリンクをクリックします。
  • assertPathIs(パス)
    表示されているページのパスが、指定のものと一致するか検証します。読み込みに時間のかかるページの場合は、waitする必要はありませんでした。一方で、JavaScriptで重い処理の直後にこの関数を実行すると、アサーションに失敗しました。(JavaScriptに絡むものは次回以降紹介したいと思います。)
  • assertSee(文字列)
    表示されているページに指定の文字列があるか確認します。

テストの実行

テストを実行するには $ php artisan duskコマンドを使用します。実際にテストを動作させると、次のように出力されます。

失敗すると、エラー内容が表示されます。また、 tests/Browser/screenshots配下に、エラー時のスクリーンショットが保存されます。

更新のテスト

更新のテストでは、更新前の値が正しく入っていること、正しく更新できることをテストします。

テスト対象となるコード

新規作成のテストで作ったコードに追記します。

BookController

index.blade.php

edit.blade.php (新規追加)

Duskのテストコード

新規作成のテストの応用で実装していきます。先ほどの BookCreateTest.phpに追記します。

ここで使用しているメソッドを紹介します。

  • assertValue(セレクタ)
    セレクタの inputタグに、値を指定します。 click()と同じように、CSSセレクタで指定します。
  • click('detail-link:first-of-type')
    先ほども紹介したメソッドですが、CSSセレクタの使い方が異なるので紹介します。一覧画面では複数の詳細リンクがあります。そこで、CSS擬似クラス :first-of-typeを使用して、1つ目の詳細リンクをクリックするようにしています。

JavaScriptを組み合わせた例

ブラウザテストなので、JavaScriptの動作も検証することができます。削除のテストを例にとって、説明します。

テスト対象となるコード

新規作成のテストで作ったコードに追記します。

BookController

index.blade.php

Duskのテストコード

このサンプルでは、削除ボタンを押すと「本当に削除しますか?」というダイアログが表示されてから、削除を行います。その動作をLaravel Duskで実装します。
それでは、先ほどの BookCreateTest.phpに追記します。

ここで使用しているメソッドを紹介します。

  • assertDialogOpened(テキスト)
    ダイアログ(JSのalert/confirm/prompt)のメッセージが、指定のものになっているか検証します。
  • acceptDialog()
    ダイアログのOKボタンを押下します。
  • dismissDialog()
    ダイアログを閉じます。(confirm, promptではキャンセルボタン押下と同じになります。)
  • assertDontSee(テキスト)
    指定したテキストが表示されていないことを検証します。

さいごに

今回のテストコードの全体をここに載せておきます。

今回紹介した以外にも、様々なアクション・アサーションがあります。詳しくは公式ドキュメントを参照してください。
Laravel Dusk: https://laravel.com/docs/master/dusk

おすすめ書籍

PHPフレームワークLaravel入門 第2版 PHPフレームワーク Laravel実践開発 PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 よくわかるPHPの教科書 【PHP7対応版】

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

laravel logo

LaravelでのDB操作の基礎

1 はじめに2 Eloquent2.1 モデルの定義2.2 モデルの取得2.3 モデルの追加2.4 モデルの更新2.5 モデルの削除2.6 クエリスコープ3 マイグレーション3.1 マイグレーションフ ...

aws

ALB+EC2な環境でhttpをhttpsにリダイレクトする

1 はじめに1.1 前提条件2 ALBの設定3 Nginxの設定3.1 注意点4 さいごに はじめに httpsに対応済みのWebサイトの場合、httpでアクセスされた時にhttpsでリダイレクトする ...

rails

deviseを使ってユーザ登録フォームを作る

1 はじめに1.1 前提条件2 deviseについて2.1 deviseとは2.2 deviseでできること3 登録処理の実装3.1 Gemのインストール3.2 deviseのインストール3.3 デフ ...

rails

Railsのバリデーション

1 はじめに2 基本的なバリデーション3 EachValidatorクラス4 Validatorクラス5 autoload_pathsの編集6 さいごに はじめに 今回はRailsのActiveRec ...

js

GoogleAppsScriptを使ってmBaaSの定期実行処理を実装する

1 はじめに1.1 簡単な状況説明1.2 定期実行を行う方法2 実装2.1 実装の流れ2.2 JavaScriptの実装2.3 スクリプトをアップロードする2.4 Google Apps Script ...

フォロー

follow us in feedly

blog-page_side_responsive

2020年9月
 12345
6789101112
13141516171819
20212223242526
27282930 

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。