JsTester(http://jstester.sourceforge.net/)は,JUnit3/4やTestNGといったテストツールと連携してJavaScriptによるスクリプトのテストを行うツールです。執筆時点で最新のバージョン1.4では,JDK6のjavax.scriptパッケージ(JSR223)をサポートしました。配布ライセンスはApache License Version 2.0で,ダウンロードモジュールはJDK1.4,同5,同6に対応したバイナリとソースが用意されています。
Ajaxが注目されるようになり,JavaScriptを用いたWebアプリケーションを構築する機会が増えていますが,開発工程で問題になるのが,それらをテストする方法です。Javaプログラムはアプリケーションサーバ上で動作しますが,JavaScriptによるスクリプトはWebブラウザ上で動作します。そのため,動作を確認するテストはそれぞれの環境で行う必要があります。
Javaであれば,前述したJUnitやTestNGといったテストツールが普及しています。これらはEclipse,NetBeansといったIDE(統合開発環境)で実行することができます。JavaScriptのテストツールとしては,WebブラウザのFirefox上で動作するSelenium(http://www.openqa.org/selenium/)がよく知られています。
なぜJsTesterなのか
ただ,Webブラウザ上で実行する前にJavaScriptのスクリプトをテストしておきたい場合もあるでしょう。たとえば,以下のような場合です。
- Javaプログラムで生成するJavaScriptのソースコードをテストしたい
- Webブラウザ画面の動作とは直接関係のないサーバとの連携部分をテストする
- 開発マシンはテキストインターフェースで利用していて,JavaScriptに対応したWebブラウザを実行できない
- そもそも,テストするプログラムごとにテスト環境を切り替えるのは面倒
など....
思い当たるところがあれば,JsTesterを試してみてはいかがでしょうか。これは一般的なJavaツールなので,JUnitやTestNGに組み込んでテストを実行できます。ですから,テストごとに実行環境を切り替える必要がなく,JavaとJavaScriptとの連携も一般的なアプリケーションと同じようにテストできます。
たとえばJavaプログラムで生成したスクリプトをテストする場合,テスト環境がばらばらだと,生成したスクリプトを一旦ファイルに保存して,テスト環境を切り替えてからJavaScriptをテストするというような作業の流れになるでしょう。
しかしJsTesterであれば,テストツール内でスクリプトを生成するプログラムを実行し,生成されたスクリプトをファイルに保存せずにそのままJsTesterに読み込ませて,引き続きテストすることができます。テスト環境を切り替えずに済むことで,生成されたスクリプトをファイルを保存する必要もなくなり,作業効率の向上が期待できます。
JavaScriptのテスト方法
JsTesterを利用してJavaScriptのスクリプトをテストする方法には,大きく2通りあります。
- 独自に拡張したTestCaseを用いる方法
- JsTesterクラスを用いる方法
a) 独自に拡張したTestCaseを用いる方法
JUnitのTestCaseクラスを拡張したJsTestCaseクラス(JDK6の場合はJDK6JsTestCaseクラス)を用いてテストを行う方法です。この方法は,JUnitユーザには馴染みやすく,テストケースのソースコードの記述が少なくて済むメリットがあります。一方で,JUnit上でしか利用できないというデメリットもあります。
JDK6対応のJDK6JsTestCaseを用いる場合の注意
JDK6JsTestCaseにはバグがあり,loadScript()メソッドを実行すると例外がスローされます。このクラスのソースコードの314行目を以下のように変更すると,この問題を解決できます。これは今後改善される可能性があります。
- 変更前)
- return JsTester.loadScript( scriptName );
- 変更後)
- return jsTester.loadScript( scriptName );
b) JsTesterクラスを用いる方法
JsTesterクラス(JDK6の場合はJDK6JsTesterクラス)は,JavaScriptのテストを行う直接行うクラスで,スクリプトを読み込んで実行し,結果を判定します。判定時に実行するメソッドには,assertEquals()のようにJUnitでは馴染み深いものだけでなく,テスト対象がJavaScriptだからこそ判定する必要がある独自のメソッドまで用意されています。
この方法はJUnitで一般的なTestCase内でも実行できますし,TestCaseを必要としないJUnit4やTestNGにも対応できるのがメリットです。デメリットとしては,テストケース内にJsTesterオブジェクトを用意しなくてはならず,処理がいくらか複雑になることがあります。

