普段テストはJunitで単体テストを書いていますが、画面からのテストなどは当然チェックできません。
フレームワークだとどうしても内部構造がわからず画面から直接うごかして確認しなくてはいけないようなケースも出てきます。
目視とはいえ、テストデータの取込→入力ぐらいは自動化できているとやはり便利です。
このような画面からのテストの場合、Seleniumを使うことが一般的だと思います。
Firefoxを立ち上げて動かすパターンでもよいですが(SeleniumIDE)、Javaのテストコードから起動して、値をソースから取込、ブラウザを稼働させることができます。
Contents
Seleniumのインストール
pom.xmlに下記のように依存関係を定義すればOKです。
1 2 3 4 5 6 |
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.46.0</version> <scope>test</scope> </dependency> |
注意点としてはバージョンにより結構不安定になるようで、ブラウザのバージョンアップなどには気を付ける必要があるようです。
現状の環境はFirefox38.0.5です。
テストコード
通常のテストコードとJunitを使って同じように記述して構いません。
下記が実際のサンプルです。
@Before,@Afterなどは通常通り使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
/** * webドライバー */ private WebDriver webDriver; @Before public void setUp() { //ここでfirefoxさせます。 webDriver = new FirefoxDriver(); } @After public void tearDown() { //終了です。 webDriver.quit(); } @Test public void sample(){ webDriver.get("http://XXXXXX.com/"); //idでHTMLの要素を取得します。 WebElement userCode = webDriver.findElement(By.id("usercode")); WebElement password = webDriver.findElement(By.id("password")); //ここで値をセットします。 userCode.sendKeys("sampleUserCode"); password.sendKeys("samplePassword"); //最後は送信ボタンの要素オブジェクトを取得します。 WebElement loginButton = webDriver.findElement(By.id("j_idt33:loginButton")); //ここでクリックです。 loginButton.click(); waitReloadPage(); } //画面が切り替わるまでまつメソッドです。(雑誌のをそのまま写しました。) public void waitReloadPage() { (new WebDriverWait(webDriver, 10)) .until(new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver webDriver) { return webDriver.getTitle().equals("hogehoge"); } }); } |
あとは画面のテキスト文字列を取得するメソッドなどもありますが、おいおい紹介していこうと思います。
また私は画面側をJSFで実装していますが、JSFで注意する点としてはinputのid=”hogehoge”などと設定しても画面に出力されるときは親の要素と結合してでてきます。
<form id=”foo”>
<input id=”hogehoge” ・・・・
</form>
のような場合、画面でみるとinputのidは”foo:hogehoge”になっています。
親要素のidがない場合、jsfが自動ではくidになります。
ちなみに下記リンクを参考にしました。