4. Selenium IDEでテストケースを生成する
まずはSelenium IDEを使って以下の操作を記録しましょう。ここでは、メールアドレスに「xxx@yyy.zzz」、パスワードに「password」を入力するとログインできるものとします。
- ログインに失敗するとログイン画面に遷移する
- タイトルが「Login」であることを確認する
- ログインに成功するとホーム画面に遷移する
- タイトルが「Home」であることを確認する
- ログアウトアンカーをクリックするとログイン画面に遷移する
- タイトルが「Login」であることを確認する
手順の詳細については、本連載の第2回を参照してください。タイトルの確認は、下図のように操作記録中にコンテキストメニューから選択することができます。
操作が記録できたら、Java/JUnit4/WebDriver形式のテストコードをエクスポートしましょう。以下のようなテストコードが生成されます。
// 省略
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」
- ユーザー名とパスワードを入力してログインする
- ログインに失敗するとログイン画面に遷移する
- ログインに成功するとホーム画面に遷移する
仕様変更対応後のアプリケーションは、こちらにデプロイしてあります。
対応する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を使ってテストケースを具体的に改善してみましょう。


