FC2ブログ

スポンサーサイト

-------- --:--:-- --

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Java】サーブレットをテストする(テストコード)【JWebUnit】

2011-07-03 01:47:58 Sun

テストコードを記述する


前回、JWebUnitを利用する環境を準備しました。
今回は実際にテストコードを記述していきます。

JSONICを利用して簡単なJSONのRESTサービスを作成しておきます。

例)
URL:http://localhost:8888/json/test1.json
メソッド:POST
パラメータ:userName

もう一つ同じものをhttp://localhost:8888/json/test2.jsonで作成しておきます。

指定したuserNameをレスポンスするだけのJSONです。
[
{
"statusCode": 0,
"userName": "テスト1"
}
]


これを次のテストドライバーHTMLから利用してRESTサービスのテストを行います。
formタグを2つおいて、同じnameをもつテキストフィールドとサブミットボタンがあるだけです。

<!DOCTYPE html>
<html>
<head>
    <title>test codes</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
	テスト1
	<form action="/json/test1.json" method="POST">
	    <input type="text" name="userName" value="テスト1">
	    <input type="submit" value="test1" name="test1">
    </form>
	<br><br>
	テスト2
	<form action="/json/test2.json" method="POST">
	    <input type="text" name="userName" value="テスト2">
	    <input type="submit" value="test2" name="test2">
    </form>
    <div id="addArea">
</body>
</html>


これでまず、テスト1をテストするテストコードを記述してみます。(※一部あとで訂正します。)


package test.json;

import junit.framework.TestSuite;
import net.sourceforge.jwebunit.junit.WebTestCase;

public class Test1ServiceTest extends WebTestCase{

	public static void main(String[] args){
		junit.textui.TestRunner.run(new TestSuite(Test1ServiceTest.class));
	}
	public void setUp(){
		getTestContext().setBaseUrl("http://localhost:8888");
	}
	public void testSearch(){
		beginAt("/test.html");//Jsonテスト用画面
//		String pageSource = getTestingEngine().getPageSource();//これで現在のHTMLソースが見れる
//		String pageText = getTestingEngine().getPageText();//こっちはブラウザに表示されるような文字列
		
		// GoogleAppEngineの開発環境ログイン画面
		checkCheckbox("isAdmin");
		submit("action", "Log In");
		
		String paramValue = "テスト1太郎";
		setTextField("userName", paramValue);
//		submit();//submitだけでも行けるのですが、あえてname属性を指定しています。
		submit("test1");
		
		assertTextPresent("\"userName\": \"" + paramValue + "\""); //userNameのアサーション
		
	}
	
}


これをJUnitテストとして実行すると正常に動作し、テストが成功します。

WS000162.jpg

次にテスト2をテストします。
テストコードは次です。(正常に動作しません)

package test.json;

import junit.framework.TestSuite;
import net.sourceforge.jwebunit.junit.WebTestCase;

public class Test2ServiceTest extends WebTestCase{

	public static void main(String[] args){
		junit.textui.TestRunner.run(new TestSuite(Test2ServiceTest.class));
	}
	public void setUp(){
		getTestContext().setBaseUrl("http://localhost:8888");
	}
	public void testSearch(){
		beginAt("/test.html");//Jsonテスト用画面
//		String pageSource = getTestingEngine().getPageSource();
//		String pageText = getTestingEngine().getPageText();
		
		// GoogleAppEngineの開発環境ログイン画面
		checkCheckbox("isAdmin");
		submit("action", "Log In");
		
		String paramValue = "テスト2太郎";
		setTextField("userName", paramValue);
//		submit();
		submit("test2");
		
		assertTextPresent("\"userName\": \"" + paramValue + "\"");
		
	}
	
}


WS000163.jpg

これだけを見て何か気づく方もいるかもしれませんが、Submit Button [test2] not found. と言われてしまいます。
HTMLにはちゃんと定義されています。
nameを誤ってidにしているということもありません。

で、これの原因は何かと言うと

setTextField("userName", paramValue);


これのライブラリ側の動作のためです。
ライブラリ側では、このメソッドが呼ばれた際にHTMLを解析するのですが、
最初に見つかった「userName」をnameに持つinputタグを含んだformをカレントにします。
そのため、「test2」というnameのサブミットボタンは存在しないという判断がされてしまったのです。
これを回避するにはカレントになっているformを変更してやる必要があります。
これは下記のように記述して実行します。

// テスト
ITestingEngine e = getTestingEngine();
e.setWorkingForm(FORM_INDEX);// submitするformの設定
getTestingEngine().setTextField("userName", "テスト二太郎");//値の設定
submit("test2");


これを元に先程のテスト2のコードを下記のように修正します。


package test.json;

import junit.framework.TestSuite;
import net.sourceforge.jwebunit.api.ITestingEngine;
import net.sourceforge.jwebunit.junit.WebTestCase;

public class Test2ServiceTest extends WebTestCase{

	public static void main(String[] args){
		junit.textui.TestRunner.run(new TestSuite(Test2ServiceTest.class));
	}
	public void setUp(){
		getTestContext().setBaseUrl("http://localhost:8888");
	}
	public void testSearch(){
		beginAt("/test.html");//Jsonテスト用画面
//		String pageSource = getTestingEngine().getPageSource();
//		String pageText = getTestingEngine().getPageText();
		
		// GoogleAppEngineの開発環境ログイン画面
		checkCheckbox("isAdmin");
		submit("action", "Log In");
		
		String paramValue = "テスト2太郎";
//		setTextField("userName", paramValue);
////		submit();
//		submit("test2");
		// テスト
		ITestingEngine e = getTestingEngine();
		e.setWorkingForm(1);// submitするformの設定
		getTestingEngine().setTextField("userName", paramValue);//値の設定
		submit("test2");
//		submit(); // submitしたいformを明示的に選択しているのでサブミットボタンのnameを指定しなくても構いません。
		
		assertTextPresent("\"userName\": \"" + paramValue + "\"");
		
	}
	
}


これで正常にテストが動作します。

WS000164.jpg

ひとまずは今はここまでです。

他のJava Webアプリケーション テストライブラリ


なお、テストライブラリは他にもたくさんあります。
ユニットテストについてのまとめ
Seleniumについて
SeleniumRCについて
Cactusについて(古い…)
公式Cactus

Cactusはテストフレームワークの考え方としてもプログラムに近くて非常に良いと思います。
JWebUnitの人間(ブラウザ)対サーバとは正反対にあります。
UnitTestとしてはCactusを利用するのが正しいと思います。
ただ、準備がかなり難しそうでAntからIvyを利用して、さらにはMaven(?Ivyの実行時に定義されたライブラリがローカルのmavenセントラルにないっみたいな怒られた)

まあ、色々とあるのでPJに必要なものを検討して利用してください、
スポンサーサイト

⇒comment

Secret

名言集
全記事(数)表示
全タイトルを表示
ブログ内検索
Loading
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。