SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

「日本Seleniumユーザーコミュニティ」のエキスパートが教えるSelenium最新事情

Javaで簡単にUIテストを書けるSelenideを使おう~Selenideの概要とテストの保守性を上げるPage Objectパターンの紹介

  • X ポスト
  • このエントリーをはてなブックマークに追加

わかりやすく強力なAssertion

 WebDriverはブラウザをプログラムで動かす仕組みを提供していますが、テストフレームワークではありません。なので、Assertionは各言語、各xUnitなどのUnitTestフレームワークに依存します。Javaで書く場合はメジャーなところでJUnitかTestNGですが、どちらにしてもWebDriverを考慮しているわけではありません。

 Selenideはテストフレームワークであり、便利なAssertionも提供されています。最初のサンプルコードであった

$(".loading_progress").should(disappear);

に現れるshould(Condition)がまさしくそうです。これは、セレクタで取得した要素が引数Conditionで指定した状態であることを検査するメソッドです。要素から状態をとってそれを比較することなく、シンプルかつ可読性高く記述できます。

 このshould(Condtion)に代表されるAssertionは全て単一要素を表すSelenideElement、複数の要素を表すElementsCollectionで定義されています。

 これらは$などのSelenide固有のセレクタの戻り値なので、自然に記述することができます。

IDEとの親和性

 公式サイトのドキュメントページに説明がありますが、API設計がIDEによるコード補完を前提に設計されています。SelenideのAPI戻り値はほぼ全てSelenideのObjectで、それらには適切な名称でメソッドが定義されているため、IDEを使ってコードを書く際Selenideの戻り値に「.」を打つことで、ドキュメントをほとんど見ずに書くことができます。

柔軟な「待ち」とAjax対応

 ブラウザベースの自動テストを記述しているとどうしても避けられないのが、テストで行いたい操作内容そのものと直接関係のない「待ち」処理です。Ajaxなどの非同期処理やその他JavaScriptを用いたイベント処理で、処理が完了した後に何か操作をしたくても、テストコード上では明示的に待ち処理が必要になります。また、待ち処理は時間指定をしてもその時の実行環境(テストを実行しているPCの性能やネットワーク環境)に依存するため、なかなかテストが安定せず、成功したり失敗したりということがあります。

 Selenideではこれらの問題を緩和するために全ての処理に待ち処理が入るようになっています。デフォルトの待ち時間は4秒と設定されていて、0.1秒毎にポーリングされます。この時間は変更可能です。

 また全体での待ち処理とは別に、時間だけでなく状態による待ち処理も指定することができます。

$("#submit").waitUntil(enable, 1000).click()

 上記のように記述できる以下のメソッドが提供されます。

  • waitUntil
  • waitWhile

 いずれも、第一引数はConditon、第二引数は待ち時間です。waitUntilでは待ち時間を超えて指定した状態にならない場合、waitWhileでは待ち時間を超えて指定した状態から変化した場合に、それぞれ例外が発生する仕組みです。このメソッドの戻り値もSelenideElementなので、引き続き要素に対する操作を記述できます。

 メソッド名と合わせて可読性の良さがお分かりいただけるのではないでしょうか。

テスト向けの便利な機能

 ブラウザを用いたテストを実装するうえで便利な機能を提供しています。その一例として、自動テスト中に失敗した場合に自動的にブラウザ画面をPNG形式でキャプチャし、またその際のHTMLも保存する仕組みが備わっています。

 これはSelenideがデフォルトで行うもので、利用者は特別な設定やAPI呼び出しなどは一切必要としません。もちろん、自分でキャプチャを取りたい場合は任意でAPI呼び出しを行うことでも可能です。

継承不要

 同じJava向けWebDriverラッパーであるFluentLeniumとの比較で、個人的に一番大きく異なる点だと思うのは、この継承不要であるということです。

 Selenideは一切継承を必要とせず、必要な時にSelenideが提供しているstatic methodを呼び出すことでその機能を利用できます。そのため、自分たちのテスト実装(基盤やフレームワークを含む)について継承関係を自由に作ることができます。

 自動テスト基盤で継承はさほど使うものではないかもしれませんが、私はPageObjectの親クラスを作成させるなどしているので、この点は大きなメリットを感じています。

 もっとも、この制限はJava 8から導入されたinterfaceのdefault methodで大部分緩和されています。

中締め

 ざっとSelenideの特徴的な部分について説明してきましたが、いかがだったでしょうか。E2Eの自動テストはやりたいけれど準備が大変そう、覚えるAPIが多そうと感じていた人が多いかもしれませんが、Selenideを使うことでかなりの部分を緩和できるのではないでしょうか。

 私は仕事でSelenideを使ってE2Eテストの基盤(PageObjectおよび共通部分)を作りましたが、それまで聞きかじりでWebDriverを知っていた状態から一週間で、大体困ることなくSelenideでテストを書けるようになりました。

 ぜひみなさんもSelenideを使って、楽しくブラウザベースのE2Eテストを書いていきましょう。

次のページ
SelenideによるWebアプリケーションテスト

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
「日本Seleniumユーザーコミュニティ」のエキスパートが教えるSelenium最新事情連載記事一覧

もっと読む

この記事の著者

島根 義和(シマネ ヨシカズ)

 肌年齢17歳、外見年齢37歳のごくごく普通のプログラマ。 25歳の頃、デスマーチを経験したことでソフトウェア工学に目覚め、開発プロセス、品質管理等を独学で勉強し続ける。がなかなか実践できない。 好きな技術書はスティーブ・マコネルの「ラピッドデベロップメント」。 2012年よりJaSST Tokyo実行委員。 スラド: id:shimashima Twitter: @shimashima35 GitHub: https://github.com/shimashima35/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10335 2017/08/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング