intra-mart Accel Platform スクリプト開発モデル プログラミングガイド 第16版 2020-04-01

サーバサイド単体テスト

サーバサイド単体テストとは

サーバサイド単体テストはスクリプト開発モデルで作成したファンクションコンテナ(js)の単体テストを稼働中のサーバで実施します。
実際に動作しているアプリケーションサーバ内で実行されますので、実際の動作環境で単体テストを実施できます。

以下の図は、サーバで単体テストを実行した結果画面サンプルです。
テスト結果状況およびエラー状況が色覚的に確認できます。
../../../_images/jsunit.png

注意

この機能は、単体テストを稼働中のサーバ単体で実施するものであり、eBuilderと連携するものではありません。

アプリケーションサーバの構築

サーバサイド単体テストを実行できる環境を構築します。

IM-Juggling においてIM-UnitTestを含めたWARファイルでアプリケーションサーバを構築してください。
IM-UnitTestはモジュール構成内の「開発フレームワーク」カテゴリに存在します。

テストケースについて

テストケースは、スクリプト開発モデルで作成します。
テストケース作成には、いくつかのルールが存在します。

テストケースでの関数の種類と実行順序

特殊関数の種類

特殊関数は、単体テストを行う上で特別な意味を持つ関数です。
特殊関数 説明
testXXXXXX()
test から始まる関数を検索して、随時実行します。
この関数内に評価関数を用いて、テスト内容を記述します。
各関数の実行する順序に決まりはありません。
setUp()
各 testXXXXXX()が実行される前に実行される関数です。
存在しない場合は実行されません。
tearDown()
各 testXXXXXX()が実行された後に実行される関数です。
存在しない場合は実行されません。
oneTimeSetUp()
テストケースファイルがロードされた直後に一度だけ実行されます。
存在しない場合は実行されません。
oneTimeTearDown()
テストケース内のすべての testXXXXXX()の実行が終わった後の一番最後に一度だけ実行されます。
存在しない場合は実行されません。
defineTestSuite()
この関数が定義されていた場合、このファイルをテストスィートとして扱います。
「テストスィート」とは、複数のテストケースをまとめて実行するための機能です。
その他の関数はすべて無視されます。
テストスィートのファイルを作成する場合は、この関数だけを定義します。

評価関数

評価関数は、テストの結果を評価するために利用する関数です。
この関数を用いることで、テスト結果として情報が収集されます。
評価関数 説明
JsUnit.assert([comment], actual)
評価値(actual)が true であることを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertTrue([comment], actual)
評価値(actual)が true であることを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertEquals([comment], expect,actual)
評価値(actual)と期待値(expect)が同じであることを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertNull([comment], actual)
評価値(actual)が null であることを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertUndefined([comment], expect, actual)
評価値(actual)が undefined であることを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertNaN([comment], actual)
評価値(actual)が NaN であることを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertFalse([comment], actual)
評価値(actual)が false であることを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertNotEquals([comment], expect,actual)
評価値(actual)と期待値(expect)が同じでないことを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertNotNaN([comment], actual)
評価値(actual)が NaN でないことを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertNotNull([comment], actual)
評価値(actual)が null でないことを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.assertNotUndefined([comment], actual)
評価値(actual)が undefined でないことを確認します。
コメント(comment)は、評価に失敗した場合、結果に表示されます。省略可能です。
JsUnit.fail(message)
評価に失敗させます。
メッセージ(message)は結果に表示されます。

実行順序

テストケース内の関数の実行順序のイメージは以下の通りです。
テストケースファイルにテスト関数として testSample1() と testSample2() が記述されていた場合を例にします。
なお、testSample1() と testSample2()は入れ替わる場合があります。(順位不同)
  1. oneTimeSetUp()
  2. setUp()
  3. testSample1()
  4. tearDown()
  5. setUp()
  6. testSample2()
  7. tearDown()
  8. oneTimeTearDown()

テストケースの作成

テストケースは、実際の単体内容を記述します。
特殊関数(defineTestSuite()を除く)および評価関数を用いて、テスト内容を記述します。

テスト対象ファイル(user/test/source.js)

// 2つの値を加算します。
function calcPlus(x, y) {
  return x + y;
}

テストケース

// テスト対象 user/test/source.js をオブジェクトとしてロードします。
let module = JsUnit.loadScriptModule("user/test/source");

function testSample1() {
  // テスト対象の関数を呼び出します。
  let result = module.calcPlus(1,2);
  // 関数の結果が正しいかテストします。
  JsUnit.assertEquals(3,result);
  // 関数の結果が正しいかテストします。(コメント付)
  JsUnit.assertEquals("足し算のテスト(1 + 2)",3,result);
}

注意

テストケースを作成するにあたって、以下の点に注意してください。
  • 画面遷移が発生する API を使用してはいけません。
    画面遷移が発生する API (Debug.browse(), redirect(), forward(), Module.alert.* など)を記述した場合、指定した画面に遷移するため正常に動作できません。
    別の関数に分けるなどして、テストを行ってください。

テストスィートの作成

テストスィートは、複数のテストケースをまとめて実行できます。

テストスィートの作成には、defineTestSuite 関数を定義します。
defineTestSuite 関数内でJsTestSuiteオブジェクトを作成し、グループ化したいテストケースおよびテストスィートファイルを追加します。
 function defineTestSuite() {

   // JsTestSuiteオブジェクトの作成
   // JsTestSuiteオブジェクトの第一引数は名称です。
   let suite = new JsTestSuite("テストの集まり");

   // テストケースまたはテストスィートファイルを追加します。
   // addTest関数の第一引数は名称です。
   // addTest関数の第二引数はテストケースまたはテストスィートファイルのパス(フルパス)です。
   suite.addTest("1つ目のテストです。","sample/testcase/test2");
   suite.addTest("2つ目のテストです。","sample/testcase/test3");
   suite.addTest("3つ目のテストです。","sample/testcase/test_suite2");

   // テストスィートオブジェクトを返却します。
   return suite;
}

テストケースの配置と実行

テストケースの配置

作成したテスト対象ファイル、テストケースファイルおよびテストスウィートファイルを以下の場所に配置してください。
なお、テスト対象ファイルが既に配置されている場合は、配置の必要はありません。
アプリケーションサーバ内のWARファイル展開フォルダ/WEB-INF/jssp/src

テストケースの実行

  1. 任意にユーザでログインします。

  2. 「サイトマップ」→「テストツール」→「Unit Test Launchar」をクリックします。

    ../../../_images/launcher.png

    コラム

    履歴には、過去に実行されたテストのパスがパス名の昇順で表示されます。
    テストのパスのリンクをクリックすることで、再実行が可能です。
    また、履歴の「削除」アイコンをクリックすることで、履歴を削除できます。
    履歴をすべて削除する場合は、「全削除」ボタンをクリックします。
  3. テストケースパスに、実行したいテストケースまたはテストスウィートファイルのパスを入力します。

  4. 実行ボタンをクリックします。

  5. テストが実行され、結果が表示されます。

    ../../../_images/jsunit.png

    項目 説明
    テストメソッド
    実行したテストメソッド名です。
    テストメソッドで評価に失敗またはエラーが発生した場合は、テストメソッド名がリンクで表示されます。
    リンクをクリックすることで、詳細な評価内容を確認できます。
    エラー テスト中にエラーが発生した数です。
    失敗 テスト中に評価関数において、評価に失敗した数です。
    成功 テスト中に評価関数において、評価に成功した数です。
    合計 テスト中に評価関数で評価した数およびエラーの数の合計です。
    実行時間 テストの実行時間です。単位はミリ秒です。
    グラフ テスト結果を色覚的に棒グラフで表現しています。