スポンサーサイト

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

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

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

2011-07-03 00:45:55 Sun

JWebUnitテストコードについてはこちら

JWebUnitとは


JWebUnitは、Servletのテストを自動化するためのライブラリです。

公式サイト

まとまっている紹介サイト

IBMの紹介記事

JWebUnitの使い方の参考になったブログ


色々と難しいことが書かれていますが、要はクライアントのブラウザからマウスとキーボード使って値を入力して目視で確認しているようなことを自動化できます。
例えば、ログイン画面をクリックして次のトップ画面に来たときに「useridさん ようこそ」って文字列がレスポンスされるHTML(とかテキストとか)ならば、テストコードは次。

package test.servlet;

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

public class JWebUnitTest extends WebTestCase{

	public static void main(String[] args){
		junit.textui.TestRunner.run(new TestSuite(JWebUnitTest.class));
	}
	public void setUp(){
		getTestContext().setBaseUrl("http://localhost:8888");
	}
	public void testSearch(){
		beginAt("/index.do");//ログイン画面
		setTextField("userid", "isann");//ユーザIDの入力
		setTextField("password", "hogehoge");//パスワードの入力
		submit();//submitボタンの押下
		assertTextPresent("isannさん ようこそ");
	}
}
XXX


多分、これだけのコードで何ができるのか感覚的に分かるんじゃないかと思います。

CookieやHTTP Headerの変更などできるのですが、リクエストBODYの書き換えはできません。
あくまでもクライアントでマウスとキーボードを使ってできること(と裏で暗にブラウザがやっていること)だけです。
セッション周りやJavascript周りはまだ未検証ですが、ajax通信の戻り値によってHTMLのinnerHTMLを追記して言った際にはそいつを参照したりすることができなかったように思います。2011/07/03 00:45:21

準備


私はGAEに傾倒しているのでGoogleAppEngineSDKのインストールされている環境でlocalhostへのアクセスでテストします。
公式サイトよりjwebunitをDLしておいてください。
なお、私は「java version "1.6.0_24"」「jwebunit-core-2.5.jar」「junit-4.7.jar」を利用しています。


1.アプリケーションコードとテストコードを分ける
これはまあ自由なんですが、本番環境にテストコードまでコンパイルする必要はないため、ソースディレクトリを分けます。
私はだいたい次のようにしています。
src/main・・・アプリケーション本体
src/test・・・テストコード

WS000157.jpg

2.jarにクラスパスを通す
次に利用するjarにクラスパスを通します。
プロジェクト内は次のようなフォルダ構成です。

WS000161.jpg

Eclipseのユーザライブラリを利用してjarファイルをまとめています。
ユーザライブラリにまとめる必要はないので、jarの追加 もしくは 外部jarの追加 でjarを追加してください。

WS000160.jpg

これで準備完了です。
あとはテストコードを記述していくだけです。

※GoogleAppEngineSDKで困ったこと

GoogleAppEngineSDKはJettyサーバが動作しているようなのですが、
上記のクラスパスを通してそのまま「Webアプリケーションを実行」してしまうと起動時例外で起動してくれなくなりました。
というのも「xalan-2.7.1.jar」ライブラリによって起動が失敗しているようです。(詳細は調査できていないのですが、SAX)

こんな例外。


警告: failed com.google.apphosting.utils.jetty.DevAppEngineWebAppContext@1c5fde0{/,D:\usr\local\eclipse_3_6_0_gae_java\workspace\isann_labs\war}: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found
2011/07/02 15:11:40 com.google.apphosting.utils.jetty.JettyLogger warn
警告: failed JettyContainerService$ApiProxyHandler@19e8329: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found
2011/07/02 15:11:40 com.google.apphosting.utils.jetty.JettyLogger warn
警告: Error starting handlers
javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found
at javax.xml.parsers.SAXParserFactory.newInstance(Unknown Source)
at org.mortbay.xml.XmlParser.setValidating(XmlParser.java:91)
at org.mortbay.xml.XmlParser.(XmlParser.java:83)
at org.mortbay.jetty.webapp.TagLibConfiguration.configureWebApp(TagLibConfiguration.java:210)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1247)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:186)
at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:162)
at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:172)
at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:164)
at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
at com.google.appengine.tools.development.DevAppServerMain.(DevAppServerMain.java:113)
at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89)
2011/07/02 15:11:40 com.google.apphosting.utils.jetty.JettyLogger warn
警告: Nested in javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found:
java.lang.ClassNotFoundException: org.apache.xerces.jaxp.SAXParserFactoryImpl
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
at java.lang.ClassLoader.loadClass(Unknown Source)
at javax.xml.parsers.FactoryFinder.getProviderClass(Unknown Source)
at javax.xml.parsers.FactoryFinder.newInstance(Unknown Source)
at javax.xml.parsers.FactoryFinder.findJarServiceProvider(Unknown Source)
at javax.xml.parsers.FactoryFinder.find(Unknown Source)
at javax.xml.parsers.SAXParserFactory.newInstance(Unknown Source)
at org.mortbay.xml.XmlParser.setValidating(XmlParser.java:91)
at org.mortbay.xml.XmlParser.(XmlParser.java:83)
at org.mortbay.jetty.webapp.TagLibConfiguration.configureWebApp(TagLibConfiguration.java:210)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1247)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:186)
at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:162)
at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:172)
at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:164)
at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
at com.google.appengine.tools.development.DevAppServerMain.(DevAppServerMain.java:113)
at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89)
2011/07/02 15:11:40 com.google.appengine.tools.development.DevAppServerImpl start
情報: The server is running at http://localhost:8888/


こんなことになってしまうのでWebアプリケーションの実行構成を変更しました。
何もしていないと次のようにデフォルトクラスパスになっています。

WS000158.jpg

次のようにAppEngineSDKライブラリ(jarを集めて定義したもの)と自分が利用するjarファイルをクラスパスに設定し、xalan-2.7.1.jar を外すようにします。

WS000159.jpg

これで無事起動できるようになっています。
スポンサーサイト

⇒comment

Secret

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