その他の便利な利用法
データ駆動テスト
その他の便利な使い方として、データ駆動のテストを記述したいと思います。
例えばログイン画面のエラーメッセージの表示をチェックしたい場合が典型的ですが、テストを行う際、利用するデータだけ異なるが、テストの実施内容は同じ、というケースがあります。
そのような場合、テストする処理は共通化し、テストデータだけ変更できるようにすると便利です。
Spockでは、@Unrollという機能が用意されており、それを利用することでデータだけの変更が容易に行えます。
@Unroll def "入力内容に不備(#reason)があると、「#errorMessage」と表示する"() { given: "予約入力ページに遷移している" def 予約入力ページ = to 予約入力ページ when: "予約内容を入力して" 予約入力ページ.予約内容の入力(reserveDate, reserveTerm, 名前) and: "利用規約に同意して次へボタンを押すと" 予約入力ページ.利用規約に同意して次へ.click() then: "予約エラーページに遷移し" def 予約エラーページ = at 予約エラーページ and: "エラーメッセージが表示されている" 予約エラーページ.エラーメッセージ == errorMessage where: reason | reserveDate | reserveTerm | name || errorMessage "宿泊日が3ヶ月以上先" | LocalDate.of(2017, 12, 25) | 2 | "東京太郎" || "宿泊日には、3ヶ月以内のお日にちのみ指定できます。" "名前が空" | LocalDate.of(2017, 12, 25) | 2 | "" || "お名前が指定されていません。" }
テストケースに@Unroll
というアノテーションを付加すると、whereブロックの中でテストデータを定義できます。
データ定義にはテーブル記法が利用でき、パイプ文字(|)でデータの区切りを表します。慣習としてテストで利用するデータと、期待値の間はパイプ文字を二重にします(||)。
上記のようにデータを定義すると、テストケース内だけでなく、テストメソッドでも定義されたデータを利用することができます。
例えば、以下の記述について、
"入力内容に不備(#reason)があると、「#errorMessage」と表示する"
実際にテストが実行される際は、そのデータに応じて以下のような形に補完されテストレポートに出力されます。
"入力内容に不備(名前が空)があると、「お名前が指定されていません。」と表示する"
このようにしておくと、テストが失敗した場合に、どのテストデータの時に失敗したのかがよりわかりやすくなります。
もっと詳しく知りたければ
GebのAPIについてもっと詳しく知りたい方向けには、『The Book Of Geb』という公式ドキュメントが非常に丁寧に書かれています。英語ですがサンプルコードも豊富なので、ぜひ目を通して見てください。
日本語の情報であれば、『Selenium実践入門』にGebの章があるので、そちらをお読みください。
最近のGebのアップデート
いくつか直近でアップデートがあるので、メジャーなものを紹介します。
WebDriverのByをサポート
下記のようにWebDriverのByメソッドをサポートするようになりました。
$(By.id("some-id"))
Gebは長らくxpathを利用したエレメントの取得ができませんでしたが、このアップデートにより可能になっています。
$(By.xpath('//p[@class="xpath"]'))
reportOnTestFailureOnly
GebReportingSpecを利用した際に、「テスト失敗時のみキャプチャを取得する」という設定が追加されています。この効能については後述します。
その他の便利系メソッドの追加
Checkboxの複数アイテムの同時選択や、NavigationにisFocusedメソッドの追加、CSSセレクターのfilter()、not()、closest()といったメソッドののサポートなど、小さいですが便利な昨日追加がされています。詳しくは最近のリリース内容を確認してみてください。