Selenium RCを使ったJBoss Seamアプリケーションの自動テスト

こうすればテストしやすい、といったTipsをまとめる。

想定はSelenium RC(Java)。

View(xhtml): JSFタグでは原則id属性をつける

例えば

<h:form>

ではなく

<h:form id="fooForm">

とする。これにより、表示されるページでは、各入力部品のidとして、

j_id123:name

のように動的に割り振られた親(Form)のIDで装飾されたものではなく、

fooForm:name

のように、固定される。
好みの問題と言えばそれまでだけど、Selenium RCで記述されたJavaテストコードで、ロケータは極力id指定にしたい。XPATHとかCSSではなく。そういう思想もあるので、idを振った方が都合がよい。

フォームのidの他に、今開発中のアプリでは、エンティティ一覧のテーブルをを使って表示しているのだけど、その場合も、

<ui:repeat id="fooItem" var="foo" value="#{fooList}">

ってな具合にid(fooItem)をつけるようにしている。

をはじめとするRichFaces部品の操作への工夫

テキストボックスやチェックボックスなんかは、

selenium.type("id=fooForm:name", "jappy");

といった具合に楽に書けるのだけど、で、特定の日付を選択させるような操作をさせたい場合、一捻り必要。

Selenium IDEでケースをエクスポートすればいいじゃん、という考え方もあるけど、テストを実行する日がいつかはわからないので、「来月の末日をを使って選択する」といったことをしたい時に、このやり方だと、その日しかちゃんと動く保証がない。

そんなわけで、以下の案を考えた。

(1) RichCalendarのJavaScript APIJavaから呼び出す。

できなくはなさそうな方法だけど、Javascriptの操作までテストしたくないかなと思い却下。

(2) enableManualInput属性をtrueにし、直接入力可能にする

アプリケーションとして、不正フォーマットの検証が余分に必要になる手間はあるけど、妥協できる範囲。テストが自動化できる(というより、テストコードが保守しやすくなる)メリットを考えれば十分お釣りがくる。