気になる開発プロダクツ

第4回 JsTester 1.4

この記事を読むのに必要な時間:およそ 5.5 分

テストケースの作成(その1)-JUnit 3.8対応

それでは,実際にJsTesterを用いてスクリプトのテストを行うテストケースを作成してみましょう。まずはJUnit 3.8対応の場合です。

JUnit3.8では,TestCaseクラスを拡張してテストケースを作成します。そしてこれを実行するTestRunnerには,テキストインターフェースのものとGUIインターフェースのものがあります。ここではJsTesterで独自に拡張されたTestCaseでテストケースを作成し,GUIインターフェースのTestRunnerでそれを実行することにします。

テスト対象となるスクリプトをリスト1に示します。ここで定義された関数func1と,Example,Calculatorという2つのオブジェクトがテストされます。

リスト1 テスト対象のスクリプト(test.js)

  function func1( fp1 )  {        // テスト対象(1)
    return fp1;
  }

  function Example()  {
    Example.prototype.add = function(a, b)  {  return a + b;  }
  }
  exmp = new Example();           // テスト対象(2)

  function Calculator()  {
    Calculator.prototype.add      = function(a, b)  {  return a + b;  }
    Calculator.prototype.subtract = function(a, b)  {  return a - b;  }
    Calculator.prototype.multiply = function(a, b)  {  return a * b;  }
    Calculator.prototype.divide   = function(a, b)  {  return a / b;  }
  }
  objCalc = new Calculator();     // テスト対象(3)

作成したテストケースをリスト2に示します。これは独自に拡張されたJsTestCaseクラスを継承しています。

JsTestCaseクラスには,テスト対象がJavaaScriptだからこそ必要となるassertメソッドがいろいろと用意されています。リスト2では,その一部を用いてテストを行っています。以下にテスト中に実行するメソッドを示します。テスト用のメソッドは5つで,最後の(5)は実行結果が数値であって文字列ではないので,テストは失敗するようになっています。

(1) assertIsFunction関数であるかどうか
(2) assertIsObjectオブジェクトであるかどうか
(3) assertExpressionEquals式の結果と答えとが等しいか
(4) assertIsEmptyオブジェクトは空であるか
(5) assertIsStringオブジェクトの内容は文字列か(リスト2では失敗)

テストするスクリプトはリスト1のみなので,setUp()メソッドで読み込んだスクリプトをずっと利用していますが,コメントアウトしている通り,テストを行うメソッドのそれぞれでもスクリプトを読み込むことは可能です。

リスト2 JUnit3.8に対応したテストケース(JsTestCase版の例)

import net.sf.jstester.JsTestCase;

public class JsTesterJUnit38Test1 extends JsTestCase  {

  // (1) func1は関数かどうか
  public void testFunction()  {
    // eval( loadScript( "test.js" ) );
    assertIsFunction( "関数ですか?", "func1" );
  }

  // (2) exmpはオブジェクトかどうか
  public void testObject()  {
    // eval( loadScript( "test.js" ) );
    assertIsObject( "オブジェクトですか?", "exmp" );
  }

  // (3) exmpのadd関数はうまく実行できるか
  public void testExample()  {
    // eval( loadScript( "test.js" ) );
    assertExpressionEquals( "exmp.add(3,2)", "5" );
  }

  // (4) objCalcは空かどうか
  public void testEmpty()  {
    // eval( loadScript( "test.js" ) );
    assertIsEmpty( "空ですか?", "objCalc" );
  }

  // (5) objCalcのdivide関数の実行結果は文字列か - failure!!
  public void testCalcDiv()  {
    // eval( loadScript( "test.js" ) );
    assertIsString( "objCalc.divide(6,3)" );
  }

  public void setUp() throws Exception {
    super.setUp();
    eval( loadScript( "test.js" ) );
  }

}

リスト2の実行結果を図1に示します。実行するには,JDK1.4以上,JsTester,JUnitのほかに,Commons LoggingRhinoのJARファイルをクラスパス(CLASSPATH)に追加する必要があります。

図1 リスト2の実行結果

図1 リスト2の実行結果

JavaScriptのテストは必ずJsTestCaseで作成しなければならないことはありません。テストを行うJsTesterオブジェクトを用意すれば,一般的なTestCaseクラスを継承してテストケースを作成することもできます。リスト3にその例を示します。実行結果はリスト2と同様になります。

リスト3 JUnit3.8に対応したテストケース(TestCase版の例)

import junit.framework.TestCase;
import net.sf.jstester.JsTester;

public class JsTesterJUnit38Test2 extends TestCase  {

  private JsTester jsTester;

  public void testFunction()  {
    jsTester.assertIsFunction( "関数ですか?", "func1" );
  }

  public void testObject()  {
    jsTester.assertIsObject( "オブジェクトですか?", "exmp" );
  }

  public void testExample()  {
    jsTester.assertEquals( "exmp.add(3,2)", "5" );
  }

  public void testEmpty()  {
    jsTester.assertIsEmpty( "空ですか?", "objCalc" );
  }

  public void testCalcDiv()  {
    jsTester.assertIsString( "objCalc.divide(6,3)" );
  }

  public void setUp() throws Exception {
    jsTester = new JsTester();
    jsTester.onSetUp();
    jsTester.eval( JsTester.loadScript( "test.js" ) );
  }

  public void tearDown() throws Exception {
    jsTester.onTearDown();
  }

}

このようにしてテストケースを作成する場合は,必ずJsTester#onSetUp()メソッドとJsTester#onTearDown()メソッドを,テストケースのsetUp(),tearDown()の各メソッドで実行しなければなりません。また,JsTestCaseでは式の結果をテストするためにassertExpressionEquals()メソッドを実行しましたが,JsTesterの場合は,同じ目的のためにassertEquals()メソッドを実行しなくてはならないということです。他のメソッドはそのままでも良いのですが,このメソッドは名称が分かれていますので,コーディング時に注意してください。

著者プロフィール

沖林正紀(おきばやしまさのり)

SE/プログラマを経て,WebアプリケーションやXMLなどについて雑誌記事や書籍の執筆活動を始める。大手メーカで製品資料の作成や,セミナーの講師を担当したこともある。現在は,取材記事や製品レビューなどに執筆活動の幅を広げる一方,プログラミング教材の開発も手がけている。

著書