SHOEISHA iD

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

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

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

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

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

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

6.2. LoginPage

 ログイン画面の仕様が変更されたので、LoginPageを修正します。具体的には、ログインに成功した場合は、ホーム画面ではなくパスワード変更画面に遷移するように修正します。

LoginPage.java
// 省略
    public PasswordPage submitLoginExpectingSuccess() {
        loginButton.click();
        return new PasswordPage(driver);
    }
// 省略

 読者の多くはEclipseなどのIDEをお使いのことと思いますが、上記の修正を保存した結果、何が起こったでしょうか? ログインに成功した場合を表すメソッドのシグネチャを変更したため、下図のようにテストケースでコンパイルエラーが発生しているはずです。

図8. 画面仕様変更によるコンパイルエラー
図8. 画面仕様変更によるコンパイルエラー

 これはとても良いことです。Selenium2によるテストの実行は時間が掛かるので、テストを実行することなく、どのテストが失敗するのか分かるということは、PageObjectパターンの大きな利点です。

6.3.修正したテストケース

 最後に、仕様変更に対応するようテストケースを修正しましょう。ここでは、古いパスワードが間違っている場合、または新しいパスワードと確認用の新しいパスワードが一致しない場合はパスワード変更に失敗するものとします。

SampleTest.java
// 省略
public class SampleTest {
// 省略
    @Before
    public void setUp() throws Exception {
        driver = new FirefoxDriver();
        baseUrl = "http://se2sample3.herokuapp.com/";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test
    public void testSample() throws Exception {
// 省略
        loginPage.typeUsername("username");
        loginPage.typePassword("password");
        PasswordPage passwordPage = loginPage.submitLoginExpectingSuccess();
        assertEquals("Password", driver.getTitle());

        passwordPage.typeOldPassword("badpassword");
        passwordPage.typeNewPassword1("newpassword");
        passwordPage.typeNewPassword2("newpassword");
        passwordPage = passwordPage.submitUpdateExpectingFailure();
        assertEquals("Password", driver.getTitle());

        passwordPage.typeOldPassword("password");
        passwordPage.typeNewPassword1("newpassword");
        passwordPage.typeNewPassword2("badpassword");
        passwordPage = passwordPage.submitUpdateExpectingFailure();
        assertEquals("Password", driver.getTitle());

        passwordPage.typeOldPassword("password");
        passwordPage.typeNewPassword1("newpassword");
        passwordPage.typeNewPassword2("newpassword");
        HomePage homePage = passwordPage.submitUpdateExpectingSuccess();
        assertEquals("Home", driver.getTitle());
// 省略
    }
// 省略
}

 仕様変更対応後のサンプルアプリケーションを参照するよう、baseUrlの値を変更してあるので注意してください。

 修正が完了したら、JUnitテストケースとして実行して、引き続きテストが成功することを確認してください。

7. 終わりに

 今回はSelenium IDEが生成する冗長なテストコードを、PageObjectパターンを用いて実践的に改善する方法を紹介しました。工夫次第でテストコードの保守性が大きく向上することや、保守性の高いテストコードを書くにはそれなりの時間が掛かることをご理解いただけたのではないでしょうか。

 本連載の第1回の終わりでも述べましたが、なんでもかんでもSelenium2でテストしようとすると、とても大変です。細かい境界値チェックや業務ロジックのパターン網羅などは単体テストでしっかりと行い、画面の表示や画面遷移に関する簡易な確認をSelenium2でテストし、UI/UXに関する部分は従来どおり人の目で確認するなど、費用対効果を考慮したテスト計画を立てるように気を付けましょう。

 今後は、JavaScriptフレームワークがますます存在感を増していくと思われます。そのため、JavaScriptテスティングフレームワークとの分担についても考慮する必要があります。また、スマートフォンやタブレットなどのモバイル端末におけるテストについても考えていかなければならないでしょう。

 2013年のクリスマスにリリースが予定されているSelenium3では、モバイル端末のサポートを強化していくことがSelenium公式ブログで発表されています。これらにもついても、リリースされ次第、なんらかの形で読者の皆さんに紹介できればと思います。

 最後まで読んでいただき、ありがとうございました。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー