テスティングフレームワーク
テスティングフレームワークとは
ブラウザとそれ以外(Adobe AIR、Aptana Jaxer、Rhino、他)の環境でテストを行う為のxUnitフレームワークです。
他のxUnitと同様にテストケースを登録・実行し、アサート結果から合否を判定して結果を出力します。また、一般的な同期処理に加えて、setTimeoutやsetInterval関数を使った非同期処理のテストにも対応しています。さらにテスト結果の出力形式はHTML(QUnit風 ※)、HTML(テキストエリア)、コンソールの3種類があり実行環境により自動的に切り替えます。
次のテストコードを実行すると実行結果がその下に表示した形で出力されます。
※QUnitはjQueryプロジェクトの為のテストランナーで、このフレームワークを設計する上で参考にしています。
Ael.test({
"testcase1": function(){
this.assertEquals(1, 1, "message1");
},
"testcase2": function(){
this.assertEquals(2, 2, "message2");
}
})
.run();
・HTML(QUnit風)
・HTML(テキストエリア)
・コンソール
Test Suite Language ECMAScript 1.6 implemention "Mozilla Rhino" 1.6 release 2 1. testcase1 (0, 1, 1) [0 ms] 2. testcase2 (0, 1, 1) [0 ms] Tests completed in 16 milliseconds. 0 tests of 2 failed.
使い方
テストを実施するには次の手順で行う必要があります。
- テストケースを作成。
- テストケースを実行リストに追加。
- テストを実行。
テストケースはケースの実行コードと結果の確認コードを含めた関数として作成します。そして作成したテストケースはAel.testメソッドを呼び出して実行リストに追加します。最後にAel.testメソッドの戻り値のテストオブジェクトが持つrunメソッドを呼び出してテストを実行します。以降で各手順の詳細を説明します。
テストケースを作成する
テストケースは下記のようにケースの実行コードと結果の確認コードを含めた関数として作成する。
var testcase = function(){
var result = 1 + 1;
this.assertEquals(2, result, "1 + 1 = 2");
}
テストを実行するとテストケースはAel.test.Assertオブジェクトをthisとして呼び出されます。このAssertオブジェクトにはthis.assertXXXXメソッドが定義されており、これらのメソッドを使って結果の妥当性を確認します。assertXXXXメソッドについてはAPIリファレンスを参照してください。
var testcase = function(){
this.assertEquals(1, 1, "message1");
this.assertFalse(false, "message2");
this.assertArrayEquals([1,2], [1,2], "message3");
this.assertNaN(NaN, "message4");
}
またthis.expectメソッドでタイムアウト時間やassertXXXXメソッドの実行回数を設定することができます。二つは主に非同期処理やパフォーマンスのテストに使います。
var testcase = function(){
var self = this;
this.expect({
amount : 1,
timeout : 1050
});
Ael(function(){
self.assertEquals(1, 1, "message1");
}).defer({
ms : 1000
});
}
テストケースを追加する
テストを実行するにはまずテストケースを実行リストに追加する必要があります。実行リストへはAel.testメソッドを使って追加します。実行リストはAelが内部で持っているリストで直接参照する必要はありません。
Ael.test({
"testcase1": function(){
this.assertEquals(1, 1, "message1");
},
"testcase2": function(){
this.assertTrue(true, "message2");
}
});
テストケースは分けて追加することもできます。
Ael.test({
"testcase3": function(){
this.assertNaN(NaN, "message3");
}
});
Ael.test({
"testcase4": function(){
this.assertNull(null, "message4");
},
"testcase5": function(){
this.assertEquals(NaN, "message5");
this.assertArrayEquals([], [], "message5");
}
});
テストを実行する
テストケースを実行リストに登録した後は実行です。実行はAel.testメソッドが戻り値として返すテストオブジェクトが持つrunメソッドを呼び出すことで行います。テストオブジェクトはtestメソッドを引数なしで呼び出しても取得できます。
Ael.test().run();
テストオブジェクトはAel.testメソッドに引数を渡した場合でも返されるので、テストケースを追加しつつテストを実行することもできます。
Ael.test({
"testcase1": function(){
this.assertEquals(1, 1, "message1");
}
}).run();
実行をカスタマイズする
テストの実行はrunメソッドにオプションを渡すことでカスタマイズすることができます。指定可能なオプション項目についてはAPIリファレンスを参照してください。例としてテストケース名が「testcase1」または「testcase2」のケースを同期モードで実行するには、次のようにオプションを指定します。
Ael.test({
"testcase1": function(){
this.assertEquals(1, 1, "message1");
},
"testcase2": function(){
this.assertTrue(true, "message2");
},
"testcase3": function(){
this.assertTrue(true, "message3");
}
}).run({
filter : /^testcase[12]$/,
sync : true
});
実行手順
ブラウザで実行するには
ブラウザでテストを実行するには4つのファイルを用意する必要があります。
- AelのJavaScriptファイル(ael-all.jsmin.js)
- AelのCSSファイル(ael.css)
- ユーザが作成したテストケースを含むJavaScriptファイル
- テストを実行するHTMLファイル
1と2はダウンロードページから一式を纏めたZip形式ファイルをダウンロードして取得してください。3はユーザ側で作成する必要があります。4は以下の雛形からユーザ側で作成してください。この雛形は全てのファイルを一つのフォルダに配置した想定で書かれています。雛形は"XXXXX"とした部分(JavaScriptファイル名)をユーザ側で環境に合わせて変更する必要があります。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta content="text/html; charset=shift_jis" http-equiv="content-type"/> <title>Test</title> <link rel="stylesheet" type="text/css" href="./ael.css" /> <script language="javascript" type="text/javascript" src="./ael-all.jsmin.js"></script> <script language="javascript" type="text/javascript" src="./XXXXX.js"></script> </head> <body onload="Ael.test().run();"></body> </html>
全てのファイルの準備が済みましたら、HTMLファイルをブラウザで開くとテストが実行され結果が表示されます。
Rhinoで実行するには
Rhinoで実行するにはJavaの実行環境がインストールされている事と、次のファイルを用意する必要があります。
- AelのJavaScriptファイル(ael-all.jsmin.js)
- ユーザが作成したテストケースを含むJavaScriptファイル
- テストを実行するJavaScriptファイル
Javaのインストールについては公式を参照してください。1は「ブラウザで実行するには」で説明した方法で取得してください。2も同様に作成してください。3は"Ael.test().run();"と書いたテキストファイルを作成してください(以降の説明では「run.js」で作成したと仮定)。
一通りの準備が終わったらコマンドプロンプトからjava.exeを使ってテストを実行すると結果が表示されます。
(JREインストール先ディレクトリ)\bin\java.exe ^
-classpath ".\js.jar" ^
-Dfile.encoding=MS932 ^
org.mozilla.javascript.tools.shell.Main ^
-f ".\ael-all.jsmin.js" ^
-f ".\XXXXX.js" ^
-f ".\run.js"
Sun JDK 6.0に内臓されているRhinoでテストを実行する場合、JDKが予めインストールされている状態でjrunscript.exeを使うことで実行できます。またjrunscriptはオリジナルのRhinoと違って、-eオプションに実行コードを渡して実行することも可能です。
(JDKインストール先ディレクトリ)\bin\jrunscript.exe ^
-encoding MS932 ^
-f "./ael-all.jsmin.js" ^
-f "./XXXXX.js" ^
-e "Ael.test().run()"
上記二つの例ではエンコーディングを指定していますが必須ではありません。適宜、値を変更または削除してください。
WSHで実行するには
WSHで実行するには次のファイルを用意する必要があります。
- AelのJavaScriptファイル(ael-all.jsmin.js)
- ユーザが作成したテストケースを含むJavaScriptファイル
- テストを実行するWSFファイル
1は「ブラウザで実行するには」で説明した方法で取得してください。2も同様に作成してください。3は以下の雛形からユーザ側で作成してください。雛形は"XXXXX"とした部分(JavaScriptファイル名)をユーザ側で環境に合わせて変更する必要があります。
<?XML version="1.0" standalone="false"?> <package> <job id="test.Ael"> <?job error="true" debug="true"?> <script language="JScript" src=".\ael-all.jsmin.js"/> <script language="JScript" src=".\XXXXX.js"/> <script language="JScript"> Ael.test().run(); </script> </job> </package>
全てのファイルの準備が済みましたら、コマンドプロンプトからcscript.exeを使ってテストを実行すると結果が表示されます。
cscript.exe //Nologo .\test.wsf
WSFファイルを次の様に書き換えることで、WSFファイルをダブルクリックしてテストを実行できるようになります。コマンドプロンプトを開く手間が省けるので少しだけ便利です。
<?XML version="1.0" standalone="false"?>
<package>
<job id="test.Ael">
<?job error="true" debug="true"?>
<script language="JScript">
if(typeof WScript === "undefined"){
WScript.Echo("Error: WScript is undefined.");
WScript.Quit(1);
}
var execPath = WScript.FullName.toLowerCase();
if(execPath.indexOf("cscript.exe") !== -1) {
}else if(execPath.indexOf("wscript.exe") !== -1) {
var shell = new ActiveXObject("WScript.Shell");
shell.Run("CMD /C CScript //Nologo \"" + WScript.ScriptFullName + "\"");
WScript.Quit(0);
}else{
WScript.Echo("Error: execute failed. [" + WScript.FullName + "]");
WScript.Quit(1);
}
</script>
<script language="JScript" src=".\ael-all.jsmin.js"/>
<script language="JScript" src=".\XXXXX.js"/>
<script language="JScript">
Ael.test().run();
while(!WScript.StdIn.AtEndOfStream)
WScript.Quit(0);
</script>
</job>
</package>
AIRで実行するには
Adobe AIRでテストを実行するには「ブラウザで実行するには」で説明した4つのファイルに加えて、アプリケーションディスクリプタファイルを用意する必要があります。このファイルは以下の雛形からユーザ側で作成してください。雛形は"XXXXX"とした部分(!HTMLファイル名)を環境に合わせて変更する必要があります。
<?xml version="1.0" encoding="utf-8" standalone="no"?> <application xmlns="http://ns.adobe.com/air/application/1.0"> <id>Test</id> <filename>test</filename> <name>Test</name> <version>1.0</version> <description/> <copyright/> <initialWindow> <content>XXXXX.html</content> <title/> <systemChrome>standard</systemChrome> <transparent>false</transparent> <visible>true</visible> <minimizable>true</minimizable> <maximizable>true</maximizable> <resizable>true</resizable> <width>1024</width> <height>768</height> <x>200</x> <y>200</y> <minSize>800 600</minSize> <maxSize>1280 1024</maxSize> </initialWindow> </application>
全てのファイルの準備が済みましたら、コマンドプロンプトからadl.exeを使ってテストをAIRアプリケーションとして実行すると結果が表示されます。
(AIRインストール先ディレクトリ)\bin\adl.exe application.xml