Ajaxまわりのtestができなくて悩んでいる話
お仕事で作っているwebアプリケーションはAjaxごりっごり取り入れているのですが、残念ながらWicketTesterでAjaxまわりのテストはできないのです。
Seleniumならできるかなーと思って実験してみたのだけど、けっきょくできなかった話。
TextFieldにいれた数字を2乗してとなりのLabelに表示してくれる簡単なページを作ってテスト。
package jp.ne.hatena.syoko_sasaki; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.PropertyModel; public class AjaxPage extends WebPage { private static final long serialVersionUID = 1L; private final Integer num1 = 0; private Integer num2 = 0; public AjaxPage() { TextField<Integer> num1Field = new TextField<Integer>("num1", new PropertyModel<Integer>(this, "num1")); final Label num2Label = new Label("num2", new PropertyModel<Integer>( this, "num2")); num2Label.setOutputMarkupId(true); num1Field.add(new OnChangeAjaxBehavior() { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { if (num1 != null) { num2 = num1 * num1; } target.add(num2Label); } }); add(num1Field); add(num2Label); } }
<html> <head> <title>にじょう!</title> </head> <body> 二乗するお!<br> <input type="text" wicket:id="num1" /> <span wicket:id="num2" /> </body> </html>
見た目はこんな感じ
Seleniumのテストはこんな感じ。
@Override public void setUp() throws Exception { setUp("http://localhost:8080/?0", "*firefox"); } public void testname() throws Exception { selenium.open("/"); selenium.type("xpath=//input", "3"); //ここでエラー。0が入っていますって言われる。 assertThat(selenium.getValue("xpath=//span"), is("9")); selenium.waitForPageToLoad("30000"); }
debug実行して起動したfirefox見てみると、num1には3が入っているのですが、num2は初期値0のまま。
右クリックでソースを表示したり、selenium.getHtmlSource()してみると、そもそもnum1のvalueは0でした。ここらへんはAjaxの仕様なのか?
うーん、AjaxまわりのテストをHudsonくんに毎日まわしてもらう計画ががが。
手動テスト嫌いなので、なにかいい方法あったら教えてほしいです。