SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

JavaScriptでテストを書こう!

複数のブラウザで一度にJavaScriptのテストを行う

JavaScriptでテストを書こう! 第5回

js-test-driverでのテストの書き方

 では、早速js-test-driverでテストを書いていきましょう。まず、js-test-driverのテストを実行するには、テストコードやプロダクトコードの置き場所などを記述した設定ファイルが必要です。設定ファイルはデフォルトでは「JsTestDriver.jstd」というファイル名で作成し、YAML形式で記述します(リスト1)。

リスト1 JsTestDriver.jstd(js-test-driverの設定ファイル)
server: http://localhost:8888
load:
  - js/*.js
  - test/*.js

 設定ファイルには、表1のような値を設定することができます。

表1 JsTestDriver.jstdのパラメータ
パラメータ 概要
server サーバのデフォルトのURL。この値は、実行時のコマンドラインオプションで上書きできる
load テストを実行する前に、ブラウザにロードするファイルのリスト
test 実行するテストが書かれているファイル
serve cssなど、静的に読み込む必要があるファイル
exclude 読み込みを除外するファイル
plugin 読み込むプラグイン
timeout タイムアウト時間(秒)

テストコードの記述

 テストコードは、js-test-driverに用意されているテスティングフレームワークを使用します。後述しますが、プラグインを使用することでその他のテスティングフレームワークも使用できます。

 TestCaseメソッドを使って記述します(リスト2)。第1引数にテストの名前、第2引数にテストの内容を連想配列として記述していきます。連想配列のキーがテストのメッセージに、値がテストメソッドになっています。キーのテストメッセージは、「test」で始まる必要があります。連想配列のキーをsetUpにすると、テストコード実行前に処理されるコード、tearDownにすると、テストコード実行後に処理されるコードを記述することができます。

 今回は、fizzbuzzのテストを行ってみました。リスト3は、そのプロダクトコードです。

リスト2 test-sample.js(テストコードのサンプル)
TestCase('FizzBuzzTest', {
  // テスト前の初期処理
  setUp: function() {
  },
  // テスト後の初期処理
  tearDown: function() {
  },
  'test 3の場合はFizzが返ってくる': function() {
    assertEquals(fizzbuzz(3), 'Fizz');
  },
  'test 5の場合はBuzzが返ってくる': function() {
    assertEquals(fizzbuzz(5), 'Buzz');
  },
  'test 15の場合はFizz,Buzzが返ってくる': function() {
    assertEquals(fizzbuzz(15), 'Fizz,Buzz');
  },
  'test 3と5の倍数以外は、数字が返ってくる': function() {
    assertNotEquals(fizzbuzz(1), 'Fizz');
    assertNotEquals(fizzbuzz(1), 'Buzz');
    assertEquals(fizzbuzz(1), 1);
    assertEquals(fizzbuzz(7), 7);
    assertEquals(fizzbuzz(13), 13);
  }
});
リスト3 fizzbuzz.js(テストを行うfizzbuzzメソッド)
var fizzbuzz = function(n) {
  if (n % 3 === 0 && n % 5 === 0){
    return "Fizz,Buzz";
  }else if (n % 3 === 0){
    return "Fizz";
  }else if (n % 5 === 0){
    return "Buzz";
  }else{
    return n;
  }
}

 主なアサーションメソッドは以下のとおりです。その他のアサーションメソッドは、プロジェクトページのWikiを参照してください。

表2 主要なアサーションメソッド
アサーションメソッド 否定アサーションメソッド 概要
assertEquals(メッセージ, 期待値, 処理結果の値) assertNotEquals(メッセージ, 期待値, 処理結果の値) 期待値と処理値が同じであるか
assertTrue(メッセージ, 処理結果の値) assertFalse(メッセージ, 処理結果の値) 処理結果の値がtrueであるか
assertNull(メッセージ, 処理結果の値) assertNotNull(メッセージ, 処理結果の値) 処理結果の値がNullであるか
assertUndefined(メッセージ, 処理結果の値) assertNotUndefined(メッセージ, 処理結果の値) 処理結果の値がUndefinedかどうか
assertException(メッセージ, コールバック, エラー内容) assertNoException(メッセージ, コールバック) コールバックを実行時にExceptionが発生するか
assertTypeOf(メッセージ, 型, 処理結果の値) - 処理結果の値が指定した型であるか
assertMatch(メッセージ, 正規表現, 処理結果の値) - 処理結果の値が指定した正規表現にマッチングしているか
assertInstanceOf(メッセージ, コンストラクタ, 処理結果の値) assertNotInstanceOf(メッセージ, コンストラクタ, 処理結果の値) 処理結果の値のオブジェクトが指定したコンストラクタのオブジェクトか

プロセスの起動

 では、作成したテストを実行してみましょう。js-test-driverは、Javaで動作します。Javaをインストールした上で、プロジェクトページの「Downloads」からjs-test-driver-1.3.5.jarをダウンロードします。

 プロセスを起動します。プロセスの起動は、Javaを使用するため、コマンドで行います(リスト4)。起動ポートはオプションで変更することができます。ここでは、8888を指定しています。

リスト4 サーバプロセスの起動
java -jar [jarが存在するパス]/js-test-driver-1.3.5.jar --port 8888

テストの実行

 続いて、立ち上げたサーバにブラウザでアクセスします。http://localhost:8888/にアクセスしてみましょう。図2-1のような画面が表示されます。「Capture This Browser」リンクをクリックすると、図2-2のようなページが表示され、サーバとブラウザが接続し、テストが実行される準備が整います。

図2-1 プロセスでサーバへアクセス
図2-1 プロセスでサーバへアクセス
図2-2
図2-2

 サーバプロセス起動処理とは別のターミナルを起動し、テストコマンドを実行します。すると、サーバプロセスに接続しているすべてのブラウザでテストが実行され、結果が表示されます(リスト5)。今回は、ChromeとInternet ExplorerとFirefoxでサーバへ接続してみました。それぞれのブラウザでテストが実行されたことがメッセージとして出力されます。

リスト5 テスト実行コマンドと結果
cd [JsTestDriver.jstdが置かれているディレクトリ]
java -jar [jarが存在するパス]/js-test-driver-1.3.5.jar --config ./JsTestDriver.jstd --tests all
setting runnermode QUIET
............
Total 12 tests (Passed: 12; Fails: 0; Errors: 0) (4.00 ms)
  Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko  Windows:Run 4 tests (Passed: 4; Fails: 0; Errors 0) (4.00 ms)
  Firefox 29.0 Windows: Run 4 tests (Passed: 4; Fails: 0; Errors 0) (1.00 ms)
  Chrome 35.0.1916.153 Windows: Run 4 tests (Passed: 4; Fails: 0; Errors 0) (3739.00 ms)

[エラーの場合]
FF......F...
Total 12 tests (Passed: 9; Fails: 3; Errors: 0) (2.00 ms)
  Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko  Windows:
 Run 4 tests (Passed: 3; Fails: 1; Errors 0) (1.00 ms)
    FizzBuzzTest.test 3の場合はFizzが返ってくる failed (1.00 ms): AssertError: expected "Fizz" but was "Fizzs"
      AssertError: expected "Fizz" but was "Fizzs"
         at test 3の場合はFizzが返ってくる (http://localhost:8888/test/test/test-sample.js:9:5)

  Firefox 29.0 Windows: Run 4 tests (Passed: 3; Fails: 1; Errors 0) (2.00 ms)
    FizzBuzzTest.test 3の場合はFizzが返ってくる failed (1.00 ms): AssertError: expected "Fizz" but was "Fizzs"
      ["test 3の場合はFizzが返ってくる"]@http://localhost:8888/test/test/test-sample.js:9

  Chrome 35.0.1916.153 Windows: Run 4 tests (Passed: 3; Fails: 1; Errors 0) (0.00 ms)
    FizzBuzzTest.test 3の場合はFizzが返ってくる failed (0.00 ms): AssertError: expected "Fizz" but was "Fizzs"
      Error: expected "Fizz" but was "Fizzs"
          at Object.TestCase.test 3の場合はFizzが返ってくる (http://localhost:8888/test/test/test-sample.js:9:18)

次のページ
Jasmineで書いたテストを動かしてみよう

この記事は参考になりましたか?

JavaScriptでテストを書こう!連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 安西剛(ヤスニシ ツヨシ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7955 2014/08/21 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー