shokosブログ

プログラミング

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>

見た目はこんな感じ

f:id:syoko_sasaki:20110505164643p:image


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くんに毎日まわしてもらう計画ががが。

手動テスト嫌いなので、なにかいい方法あったら教えてほしいです。