SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

WebDriverの採用で生まれ変わったOSSのブラウザテストツール「Selenium 2」入門

実践! PageObjectパターンによる「Selenium2」テストケース改善チュートリアル

WebDriverの採用で生まれ変わったOSSのブラウザテストツール「Selenium2」入門 第4回

4. Selenium IDEでテストケースを生成する

 まずはSelenium IDEを使って以下の操作を記録しましょう。ここでは、メールアドレスに「xxx@yyy.zzz」、パスワードに「password」を入力するとログインできるものとします。

  1. ログインに失敗するとログイン画面に遷移する
  2. タイトルが「Login」であることを確認する
  3. ログインに成功するとホーム画面に遷移する
  4. タイトルが「Home」であることを確認する
  5. ログアウトアンカーをクリックするとログイン画面に遷移する
  6. タイトルが「Login」であることを確認する

 手順の詳細については、本連載の第2回を参照してください。タイトルの確認は、下図のように操作記録中にコンテキストメニューから選択することができます。

図4. 検証コードの追加
図4. 検証コードの追加

 操作が記録できたら、Java/JUnit4/WebDriver形式のテストコードをエクスポートしましょう。以下のようなテストコードが生成されます。

SampleTest.java
// 省略
public class SampleTest {
// 省略
  @Test
  public void testSample() throws Exception {
    driver.get(baseUrl + "/login/index");
    driver.findElement(By.name("email")).clear();
    driver.findElement(By.name("email")).sendKeys("xxx@yyy.zzz");
    driver.findElement(By.name("password")).clear();
    driver.findElement(By.name("password")).sendKeys("badpassword");
    driver.findElement(By.xpath("//button[@type='submit']")).click();
    assertEquals("Login", driver.getTitle());
    driver.findElement(By.name("email")).clear();
    driver.findElement(By.name("email")).sendKeys("xxx@yyy.zzz");
    driver.findElement(By.name("password")).clear();
    driver.findElement(By.name("password")).sendKeys("password");
    driver.findElement(By.xpath("//button[@type='submit']")).click();
    assertEquals("Home", driver.getTitle());
    driver.findElement(By.linkText("Logout")).click();
    assertEquals("Login", driver.getTitle());
  }
// 省略
}

 JUnitテストケースとして実行して、テストが成功することを確認してください。

5. PageObjectパターンを使ってテストケースを改善する

 ここで、サンプルアプリケーションに対して「認証に必要な情報を、メールアドレスではなくユーザー名にしたい」という仕様変更が発生したとします。

  • ログイン画面
    • タイトルは「Login」
    • ユーザー名とパスワードを入力してログインする
    • ログインに失敗するとログイン画面に遷移する
    • ログインに成功するとホーム画面に遷移する
図5. ログイン画面
図5. ログイン画面

 仕様変更対応後のアプリケーションは、こちらにデプロイしてあります。

 対応するinputフィールド名が「email」のままでは明らかに不適切なので、これを「username」に変更しましたが、Selenium IDEが生成したテストケースにはinputフィールド名が複数か所にハードコーディングされているので、これらをすべて修正しなければなりません。

 今回のように4か所程度であれば手作業や一括置換でも対応できますが、ここではPageObjectパターンという手法を用いてテストケースを改善してみましょう。

5.1. PageObjectパターンとは

 PageObjectパターンとは、その名のとおりテスト対象のページをオブジェクトとしてテストから切り離し、その内部構造をカプセル化するデザインパターンです。

 詳細についてはGoogle Code上のWikiを参照してください。英語が苦手な方は筆者のブログで日本語訳を公開しておりますので、そちらを参照してください。

 要約すると、ポイントは以下の6点です。

  • ページの内部構造をカプセル化する
  • ページが提供する機能をメソッドとして公開する
  • ある機能が異なる結果を返す場合は、別のメソッドとして公開する
  • メソッドはPageObjectを返す
  • ページの状態を検証するメソッドは実装しない
  • ページの状態や機能をすべて表現する必要はない

 さらに、Selenium2にはPageObjectパターンをサポートするPageFactoryという機能も用意されています。詳細については、こちらもGoogle Code上のWikiまたは筆者のブログを参照してください。

 それでは、PageObjectとPageFactoryを使ってテストケースを具体的に改善してみましょう。

次のページ
5.2. LoginPage

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

WebDriverの採用で生まれ変わったOSSのブラウザテストツール「Selenium 2」入門連載記事一覧

もっと読む

この記事の著者

梅澤 雄一郎(株式会社DTS)(ウメザワ ユウイチロウ)

株式会社DTS 産業事業部所属。playframeworkドキュメント翻訳サイト 管理人。主にJavaによるWebアプリケーション開発に従事。酒好き。 はてなブログ ...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7527 2013/12/13 14:00

イベント

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

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

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

メールバックナンバー