手順[3]
シナリオ実装
これで本来行いたいテストを記述するための下準備ができました。ここからテストコードを記述していきます。
画面要素の取得や振る舞いなどはすべてPage Objectに押し込めたので、テストコードは純粋にシナリオに注力することが可能となります。
今回書くテストシナリオとしては、いわゆる正常系の、すべての画面を通って登録完了まで行うものを作っていきます。シナリオは以下のようなものになります。
- ブラウザを起動し入力画面を開く。
- 入力画面で予約登録内容を入力し「次へ」ボタンを押下し確認画面へ遷移する。
- 確認画面で入力した内容通りかを確認、「確定」ボタンを押下し完了画面へ遷移する。
- 完了画面でエラーが表示されていないことを確認する。
それでは順にシナリオを実装していきましょう。
Selenideの初期化
Selenideを使う際、Selenideに対してどのブラウザを使うか、またブラウザ毎に必要となるWebDriver実装の場所を知らせる必要があります。今回はブラウザとしてFirefoxを使うので、以下のように記述します。
Configuration.browser = WebDriverRunner.GECKO; System.setProperty("webdriver.gecko.driver","C:/PATH/TO/geckodriver.exe")
1行目でWebDriver実装(ここではFirefoxなのですが、WebDriverの名前はGecko)を選択し、2行目でその実装の場所を指定します。2行目の部分は実際にgeckodriver.exeをおいたパスを記述します。
この設定はマルチブラウザテストなどでない限り通常は変更しないものなので、以下のようにテストクラスの初期化時に一度だけ実行されるようにします。
@Before public void before(){ Configuration.browser = WebDriverRunner.GECKO; System.setProperty("webdriver.gecko.driver","C:/PATH/TO/geckodriver.exe"); }
ブラウザを起動して入力画面を開く
シナリオの最初にブラウザを起動し、最初の入力画面を開きます。
手動で行う場合はブラウザアプリケーションを起動し、ナビゲーションバーにURLを入力して遷移しますが、ここではSelenideにブラウザを起動させURL入力をさせます。
ブラウザを開きURLを入力するにはcom.codeborne.selenide.Selenide#open(String, Class<T>)
を呼び出します。第一引数にURL、第二引数にそのURLに対応したPageObjectのClassを指定します。
URLはhttp://example.selenium.jp/reserveApp/
、入力画面に対応するPage ObjectはInputPageなので以下のようになります。
Java InputPage inputPage = open("http://example.selenium.jp/reserveApp/", InputPage.class);
入力画面で予約登録内容を入力し「次へ」ボタンを押下し確認画面へ遷移する。
入力画面での予約登録内容の入力と「次へ」ボタンの押下処理ですが、これらはPage Objectで振る舞いを定義済みなので、単純に呼び出すだけですみます。
ここではいったん以下の内容で入力するものとします。
- 2017年10月1日から2泊
- 朝食あり
- プランは選択しない
- 名前は「東京太郎」
入力とボタン押下処理を実際にコードとして書くと、以下のようになります。
Java inputPage.setReserveYear("2017"); inputPage.setReserveMonth("10"); inputPage.setReserveDay("1"); inputPage.setReserveTerm("2"); inputPage.setBreakfastOn(); inputPage.setGuestName("東京太郎"); inputPage.setPlanA(false); inputPage.setPlanA(false); CheckInfoPage checkPage = inputPage.clickGotoNext();
確認画面で入力した内容通りかを確認、「確定」ボタンを押下し完了画面へ遷移する。
確認画面では先の入力画面で入力した値と料金の計算結果の検証を行います。
入力した値はそのまま出てくるようにし、料金は以下の計算金額でなければなりません。
- 1泊7000円で2泊なので14000円
- 2017/10/01 は日曜なので、休日料金の割り増しで +1750円
- 朝食二回分で2000円
- 合計で 14000 + 1750 + 2000 = 17750
検証後は「確定」ボタンを押下して完了画面へ遷移します。
これをコードで表現すると以下のようになります。
assertThat(checkPage.getErrorCheckResult(), is("")); assertThat(checkPage.getDateFrom(), is("2017年10月1日")); assertThat(checkPage.getDateTo(), is("2017年10月3日")); assertThat(checkPage.getDaysCount(), is("2")); assertThat(checkPage.getHeadcount(), is("1")); assertThat(checkPage.getBfOrder(), is("あり")); assertThat(checkPage.getGuestName(), is("東京太郎")); assertThat(checkPage.getPrice(), is("17750")); FinalConfirmPage finalPage = checkPage.doCommit();
完了画面でエラーが表示されていないことを確認する。
最後に完了画面でエラーがないことを確認します。
エラーの有無はエラーメッセージが表示されるエリアに文字列が何もないこととします。
コードで表現すると以下のようになります。
assertThat(finalPage.getErrorCheckResult(), is(""));
これでテストシナリオは完成です。
テストシナリオ全体では以下のようなコードになります。
package com.example.selenide; import com.codeborne.selenide.Configuration; import com.codeborne.selenide.WebDriverRunner; import com.example.selenide.page.CheckInfoPage; import com.example.selenide.page.FinalConfirmPage; import com.example.selenide.page.InputPage; import org.junit.Before; import org.junit.Test; import static com.codeborne.selenide.Selenide.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.*; /** -Unit test for simple App. */ public class SampleTest { @Before public void before(){ Configuration.browser = WebDriverRunner.GECKO; System.setProperty("webdriver.gecko.driver","C:/PATH/TO/geckodriver.exe"); } @Test public void 正常系確認() { InputPage inputPage = open("http://example.selenium.jp/reserveApp/", InputPage.class); inputPage.setReserveYear("2017"); inputPage.setReserveMonth("10"); inputPage.setReserveDay("1"); inputPage.setReserveTerm("2"); inputPage.setBreakfastOn(); inputPage.setGuestName("東京太郎"); inputPage.setPlanA(false); inputPage.setPlanA(false); CheckInfoPage checkPage = inputPage.clickGotoNext(); assertThat(checkPage.getErrorCheckResult(), is("")); assertThat(checkPage.getDateFrom(), is("2017年10月1日")); assertThat(checkPage.getDateTo(), is("2017年10月3日")); assertThat(checkPage.getDaysCount(), is("2")); assertThat(checkPage.getHeadcount(), is("1")); assertThat(checkPage.getBfOrder(), is("あり")); assertThat(checkPage.getGuestName(), is("東京太郎")); assertThat(checkPage.getPrice(), is("17750")); FinalConfirmPage finalPage = checkPage.doCommit(); assertThat(finalPage.getErrorCheckResult(), is("")); } }