JavaScript のユニット・テストを実行するためのツール

QUnit、YUI Test、JSTestDriver を使用する

開発者のなかには、JavaScript はテストをするのが難しいとこぼす人がいるかもしれませんが、最近では Web アプリケーションのクライアント・サイドにフォーカスが当てられているため、JavaScript コードのユニット・テストは不可欠なものになりつつあります。現在、コードを確実なものにするための各種ツールが用意されていますが、この記事では JavaScript のユニット・テストに最もよく使われているツールである、QUnit、YUI Test、JSTestDriver について説明します。またコード・サンプルを示しながら、テスト・ケースの例についても説明します。

Sebastiano Armeli-Battana, Software Engineer, Freelance

Sebastiono Armeli-Battana photoSebastiano Armeli-Battana は、JavaScript および Java 開発を専門とするソフトウェア・エンジニアです。Web 技術に情熱を傾けている彼は、Java 技術を採用している SMS Management & Technology でコンサルタントを務める傍ら、フリーランスの Web エンジニアとしても働いています。彼の著書には、『jQuery plug-in JAIL』があります。彼個人のサイトは http://www.sebastianoarmelibattana.com です。



2012年 5月 17日

はじめに

ユニット・テストでは、コード・モジュールやコード・ユニットが設計どおり、あるいは期待した通りに動作していることの検証に焦点が当てられます。テスト・ケースを作成することよりも、新しいモジュールの実装に多くの時間をかけたがっている開発者は、テスト・ケースの作成を時間の浪費であると考えています。しかし大規模なアプリケーションを扱う場合には、ユニット・テストによって実際に時間を節約することができます。つまりユニット・テストを実行することで問題を追跡することや、コードを安全に更新することができます。

頻繁に使用される略語

  • DOM: Document Object Model
  • HTML: HyperText Markup Language
  • JSTD: JSTestDriver
  • YUI: Yahoo! User Interface

これまでユニット・テストはサーバー・サイド言語に対してのみ行われていましたが、フロントエンド・コンポーネントが複雑になってきたことで、JavaScript コードに対してもテスト・ケースを作成する必要性が高まってきました。普段からクライアント・サイド・スクリプトのテストを作成しない人にとって、JavaScript のユニット・テストを作成する方法を学ぶのは、大変な作業になる可能性があります。ユーザー・インターフェースのテストでは、これまでとは思考プロセスを変えることが求められるかもしれないからです (JavaScript が適切なプログラミング言語であるとはとても信じられない、という開発者もまだいるかもしれません)。

この記事では、QUnit、YUI Test、JSTestDriver を使用して JavaScript のユニット・テストを行う方法について説明します。

この記事のソース・コードは、ダウンロードすることができます。


JavaScript のユニット・テスト

JavaScript のテストについて説明するために、このセクションでは JavaScript の基本的な関数のテスト・ケースを分析します。テスト対象の関数をリスト 1 に示します。この関数は、渡された変数に (数値としての) 3 を加算します。

リスト 1. ソース・コード (example1/script.js)
function addThreeToNumber(el){
    return el + 3;
}

リスト 2 では、自己実行形式の関数の中にテスト・ケースが含まれています。

リスト 2. テスト・ケース (example1/test.js)
(function testAddThreeToNumber (){
    var a = 5,
        valueExpected= 8;
    
    if (addThreeToNumber (a) === valueExpected) {
        console.log("Passed!");
    } else {
        console.log("Failed!");
    }
}());

このテストでは、テスト対象の関数に 5 を渡し、戻り値が 8 であるかどうかをチェックしています。テストに合格した場合、JavaScript に対応している最近のブラウザーの画面には「Passed!」と出力され、不合格だった場合には「Failed!」と出力されます。このテストを実行するには以下の手順に従います。

  1. テスト実行用ページとして機能することになる HTML ページに 2 つのスクリプト・ファイルをインポートします (リスト 3)。
  2. その HTML ページをブラウザーで開きます。
リスト 3. HTML ページ (example1/runner.html)
<!DOCTYPE html>
<html>
     <head>
         <meta http-equiv="Content-type" content="text/html; charset=utf-8">
         <title>Example 1</title>
         <script type="text/javascript" src="js/script.js"></script>
          <script type="text/javascript" src="js/test.js"></script>
     </head>
     <body></body>
</html>

テスト結果は、ブラウザー・コンソールに出力する代わりに HTML ページ内に出力することも、alert() メソッドによって生成されるポップアップ・ウィンドウに出力することもできます。

テスト・ケースのコア要素であるアサーションを使用すると、特定の条件を満たしているかどうかを検証することができます。例えばリスト 2 では、addThreeToNumber (a) === valueExpected がアサーションです。

アサーションを多用するテスト・ケースが大量にある場合には、フレームワークを使用すると便利です。以下のセクションでは、JavaScript のユニット・テスト・フレームワークとして最もよく使われている、QUnitYUI TestJSTestDriver に焦点を絞って説明します。


QUnit を使用する

QUnit は (Java プログラミングの) JUnit に似たユニット・テスト・フレームワークであり、jQuery の開発チームは QUnit を使用して jQuery ライブラリーをテストしています。QUnit を使用するためには以下の手順に従います。

  1. qunit.css ファイルと qunit.js ファイルをダウンロードする (「参考文献」を参照)。
  2. ダウンロードした qunit.css ファイルと qunit.js ファイルをインポートする特定のタグを含む HTML ページを作成する。

QUnit のテストを実行するための標準的な HTML をリスト 4 に示します。

リスト 4. QUnit テスト実行用 HTML (qunit/runner.html)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>QUnit Test Suite</title>
        <link rel="stylesheet" href="css/qunit.css" type="text/css" media="screen">
        <script type="text/javascript" src="js/lib/qunit.js"></script>
    </head>
    <body>
        <h1 id="qunit-header">QUnit Test Suite</h1>
        <h2 id="qunit-banner"></h2>
        <div id="qunit-testrunner-toolbar"></div>
        <h2 id="qunit-userAgent"></h2>
        <ol id="qunit-tests"></ol>
        <div id="qunit-fixture">test markup</div>
    </body>
</html>

温度を摂氏から華氏に変換する関数と、華氏から摂氏に変換する関数があるとします。その変換を行うためのスクリプトをリスト 5 に示します。

リスト 5. 温度の単位を変換するスクリプト (qunit/js/script.js)
function convertFromCelsiusToFahrenheit(c){
    var f = c * (9/5) + 32;
    return f;
}

function convertFromFahrenheitToCelsius(f){
    var c = (f - 32) * (5/9);
    return c;
}

それぞれのテスト・ケースをリスト 6 に示します。

リスト 6. テスト・ケース (qunit/js/test.js)
module ("Temperature conversion")

test("conversion to F", function(){
    var actual1 = convertFromCelsiusToFahrenheit(20);
    equal(actual1, 68, ?Value not correct?);
	
    var actual2 = convertFromCelsiusToFahrenheit(30);
    equal(actual2, 86, ?Value not correct?);
})

test("conversion to C", function(){
    var actual1 = convertFromFahrenheitToCelsius(68);
    equal(actual1, 20, ?Value not correct?);

    var actual2 = convertFromFahrenheitToCelsius(86);
    equal(actual2, 30, ?Value not correct?);
})

QUnit のテスト・ケースは test() メソッドによって定義されます。この関数に渡される 2 番目の引数の中にテストのロジックが含まれています。リスト 6 で、2 つのテストの名前は「conversion to F」と「conversion to C」です。それぞれのテストには 2 つのアサーションが含まれています。テストに使用されるアサーションは equal() メソッドを利用しています。equal() メソッドにより、テスト対象の関数から取得される実際の値と想定値とを比較することができます。equal() メソッドの 3 番目の引数はテストに不合格だった場合に表示されるメッセージです。

また、module() メソッドを使用してテストをモジュールにすることもできます。リスト 6 で、「Temperature conversion」モジュールには 2 つのテストが含まれています。

このテストを実行するためには以下の手順に従います。

  1. テストを実行する HTML にソース・コードとテスト・ファイルを含めます (リスト 7)。
  2. その HTML ページをブラウザーで開きます。
リスト 7. script.js と test.js を QUnit テスト実行用 HTML に含める
...
<script type="text/javascript" src="js/script.js"></script>
<script type="text/javascript" src="js/test.js"></script>
...

図 1 は QUnit によるテストの結果がブラウザー (Firefox) に表示される様子を示しています。

図 1. QUnit によるテストの結果
4 項目のテストのうち 4 項目とも合格だったことを示す画面のスクリーン・ショット

リスト 6 のアサーションでは equal() メソッドを使用していますが、QUnit に用意されたアサーションはそれだけではありません。QUnit には他にも ok()strictEqual() などのアサーションがあります。これらのメソッドの実際をリスト 8 に示します。

リスト 8. 他のアサーション
module ("Other assertion");
test("assertions", function(){
    ok(true);
    ok(3);
    strictEqual("c", "c");
    equal (3, "3");
});

ok() 関数は最初のパラメーターが真かどうかをチェックし、strictEqual() は最初のパラメーターが 2 番目のパラメーターと厳密に等しいかどうかを確認します。strictEqual() は背後で === 演算子を使用しており、equal()== 演算子を使用しています。

テストに不合格だった場合にも、QUnit は有用な情報を提供します。そこで今度はリスト 8 のコードをリスト 9 のように変更し、最後のアサーションが失敗するようにしましょう。

リスト 9. 最後のアサーションでエラーを発生させる
module ("Other assertion");
test("assertions", function(){
    ok(true);
    ok(3);
    strictEqual("c", "c");
    strictEqual (3, "3");
});

図 2 は、リスト 9 のコードを実行した結果として QUnit から返される情報を示しています。

図 2. QUnit を実行した結果 ― 最後のテストが不合格になる
8 項目のテストのうち 7 項目が合格で、1 項目が不合格だったことを示す画面のスクリーン・ショット

テスト結果は非常に詳細に表示されており、最後のアサーションで想定される値と実際の値との違いを容易に追跡することができます。

QUnit のもう 1 つの重要な機能として、1 つのモジュール内のすべてのテストの実行前、または実行後にコマンドを実行することができます。module() 関数は 2 番目のパラメーターとして setup() コールバックと teardown() コールバックを受け付けます。setup() 関数を使用してリスト 6 を更新し、リスト 10 のようにします。

リスト 10. setup() (qunit/js/test-setup.js)
module ("Temperature conversion", {
    setup : function() {
        this.celsius1 = 20;
        this.celsius2 = 30;
		
        this.fahrenheit1 = 68;
        this.fahrenheit2 = 86;
    }
});
test("conversion to F", function(){
    var actual1 = convertFromCelsiusToFahrenheit(this.celsius1);
    equal(actual1, this.fahrenheit1);
	
    var actual2 = convertFromCelsiusToFahrenheit(this.celsius2);
    equal(actual2, this.fahrenheit2);
});
test("conversion to C", function(){
    var actual1 = convertFromFahrenheitToCelsius(this.fahrenheit1);
    equal(actual1, this.celsius1);
	
    var actual2 = convertFromFahrenheitToCelsius(this.fahrenheit2);
    equal(actual2, this.celsius2);
});

この例はアサーションで使用されていた値を setup セクションに移動し、これらの値がテストのロジックに使用されないようにしています。

また QUnit では asyncTest() 関数を使用して非同期テストを実行することもできます。この機能は Ajax (Asynchronous JavaScript and XML) を扱う場合に非常に便利です。その場合には、expect() 関数を使用すると、テストの中で実行されるアサーションの回数を容易に確認することができます。


YUI Test: ユニット・テストのための独立モジュール

(Yahoo!) の YUI ライブラリーのコンポーネントである YUI Test は広範で完全なユニット・テスト・フレームワークです。YUI Test を使用するためには以下の手順に従います。

  1. 以下のようにして、テストを実行する HTML に YUI シードをインポートします。
    <script src="http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js"></script>

    コードを見るとわかるように、この例は YUI Test のバージョン 3 を使用しています。
  2. テスト・スクリプト・ファイルの中で YUI 関数をインスタンス化します。必要な test モジュールと console モジュールをロードします (リスト 11)。
リスト 11. YUI モジュールのち、test モジュールと console モジュールをロードする
YUI().use("test", "console", function (Y) {
     // Test cases go here
});

test モジュールはテストのために当然必要です。console モジュールは必須ではありませんが、この例ではテスト結果を出力するために console モジュールを使用しています。このテスト・ケースはグローバルな Y インスタンスを引数としてコールバックの内部をテストします。

YUI Test は Y.Test.Case() コンストラクターを使用して新しいテスト・ケースをインスタンス化し、また Y.Test.Suite() コンストラクターを使用してテスト・スイートをインスタンス化します。JUnit の場合と同様、テスト・スイートは複数のテスト・ケースを含んでいます。テスト・スイートにテスト・ケースを追加するためには add() メソッドを使用します。

YUI テストを使用してリスト 5 のソース・コードを再度テストしましょう。そのためのテスト・スイートとテスト・ケースの作成方法をリスト 12 に示します。

リスト 12. テスト・スイートとテスト・ケース
YUI().use("test", "console", function (Y) {
	
     var suite = new Y.Test.Suite("Temperature conversion suite");

     //add a test case
     suite.add(new Y.Test.Case({
         name: "Temperature conversion?
     )); 
});

リスト 12 により、Temperature conversion suite というテスト・スイートと Temperature conversion というテスト・ケースが生成されます。これで、引数として Y.Test.Case コンストラクターに渡されるオブジェクト・リテラルの中にテスト・メソッドを作成することができます (リスト 13)。

リスト 13. テスト・メソッドを使用したテスト・ケース
suite.add(new Y.Test.Case({
    name: "Temperature conversion",

    setUp : function () {
        this.celsius1 = 20;
        this.celsius2 = 30;
		
        this.fahrenheit1 = 68;
        this.fahrenheit2 = 86;
    },

    testConversionCtoF: function () {
        Y.Assert.areEqual(this.fahrenheit1,         
convertFromCelsiusToFahrenheit(this.celsius1));
        
        Y.Assert.areEqual(this.fahrenheit2, 
convertFromCelsiusToFahrenheit(this.celsius2));
    },
		
    testConversionFtoC: function () {
        Y.Assert.areEqual(this.celsius1,
convertFromFahrenheitToCelsius(this.fahrenheit1));
			
        Y.Assert.areEqual(this.celsius2, 
convertFromFahrenheitToCelsius(this.fahrenheit2));
    }
}));

リスト 13 を見て、以下の点に気付いたことと思います。

  • setUp() メソッドが使用されています。YUI Test には、テスト・ケースとテスト・スイートのレベルに setUp() メソッドと tearDown() メソッドが用意されています。
  • テスト・メソッドの名前は test という単語で始まり、アサーションを含んでいます。
  • この例では Y.Assert.areEqual() というタイプのアサーションを使用しています。このアサーションは QUnit の equal() 関数と似ています。

    YUI Test には、以下のようにアサーションのメソッドが豊富に用意されています。

    • Y.Assert.areSame() は QUnit の strictEqual() に相当します。
    • データ型のためのアサーション (Y.Assert.isArray()Y.Assert.isBoolean()Y.Assert.isNumber() など)。
    • 特殊な値のためのアサーション (Y.Assert.isFalse()Y.Assert.isNaN()Y.Assert.isNull() など)。

YUI を使用したテストを実行するためには Y.Test.Runner オブジェクトを使用します。テストを実行するためには、この Y.Test.Runner オブジェクトにテスト・スイートまたはテスト・ケースを追加し、その後で run() メソッドを呼び出す必要があります。リスト 13 で作成したテストを実行する方法をリスト 14 に示します。

リスト 14. YUI によるテストを実行する
Y.Test.Runner.add(suite);
Y.Test.Runner.run();

デフォルトで、テスト結果はブラウザーのコンソールに出力されます (ブラウザーがコンソールをサポートしている場合)。それよりも良い方法として、Yahoo! Console コンポーネントを使用してテスト結果を表示する方法があります。Yahoo! Console コンポーネントを使用するためには、Y.Console コンストラクターを使用して、テスト実行用 HTML の DOM 要素にコンソールをバインドする必要があります (リスト 15)。

リスト 15. Yahoo! Console コンポーネント
var console = new Y.Console({
    verbose: true,
    newestOnTop: false,
    width: "600px"
});

console.render('#testLogger');

リスト 15 には、いくつかのパラメーターを用いてコンソールを構成する方法が示してあります。コンソールは testLogger という ID を持つ DOM 要素の中に表示されます。

テスト実行用 HTML は、更新する必要があります。コンソールが参照する DOM 要素をリスト 16 のように追加します。

リスト 16. Yahoo! Console を使用できるようにテスト実行用 HTML を更新する
<body class="yui3-skin-sam">
     <div id="testLogger"></div> 
</body>

この例は <body> のクラスに yui3-skin-sam という名前を設定しています。このクラスはコンソールのスキンを定義します。

図 3 はテストを実行した後でコンソールに表示された内容を示しています。

図 3. YUI Test を実行した結果
各テストの結果を表示したログ・コンソールのスクリーン・キャプチャー

JSTestDriver を使用して容易にテストを行う

強力な JSTestDriver (JSTD) ツールを使用すると、コマンドラインから複数のブラウザーで JavaScript を実行することができます。JSTD に付属している JAR ファイルを使用すると、サーバーを起動したり、1 つまたは複数のブラウザーを取り込んだり、ブラウザーでテストを実行したりすることができます。上記で説明した 2 つのフレームワークとは異なり、JSTD ではテスト実行用の HTML は必要ありませんが、構成ファイルが必要です。構成ファイルをリスト 17 に示します。

リスト 17. 構成ファイル (jsTestDriver.conf)
server: http://localhost:4224
load:
  - js/src/*.js
test:
  - js/test/*.js

この構成ファイルは YAML で作成されています。YAML は構成ファイルのための優れたフォーマットです。このファイルには、起動されるサーバーの情報と、ソース・コードとテスト・ファイルの場所の情報が含まれています。

JSTD を使用してテストを実行するためには以下の手順に従います。

  1. テスト・サーバーを起動します。jsTestDriver.jar ファイルが保存されているフォルダーにコマンドラインからアクセスし、以下のコマンドを実行します。
    java -jar JsTestDriver-1.3.3d.jar -port 4224

    リスト 17 で指定されるポートは構成ファイルで指定されるポートと同じでなければなりません。デフォルトで、JSTD は JAR ファイルがあるディレクトリーと同じディレクトリーで jsTestDriver.conf ファイルを検索します。

  2. テスト対象のブラウザーに URL として http://localhost:4224/capture をコピー・アンド・ペーストすることで、1 つまたは複数のブラウザーをサーバーに登録します。

これまでの例で使用したものと同じソース・コード (リスト 5) をテストしますが、この場合は JSTD の構文を使用します。リスト 10 のテスト・ケース (QUnit 用) とリスト 14 のテスト・ケース (YUI Test 用) を変換する方法をリスト 18 に示します。

リスト 18. JSTD によるテスト
TestCase("Temperature conversion", {
    setUp : function () {
        this.celsius1 = 20;
        this.celsius2 = 30;
	
        this.fahrenheit1 = 68;
        this.fahrenheit2 = 86;
    },

    testConversionCtoF: function () {
        assertSame(this.fahrenheit1, convertFromCelsiusToFahrenheit(this.celsius1));
        assertSame(this.fahrenheit2, convertFromCelsiusToFahrenheit(this.celsius2));
    },
	
    testConversionFtoC: function () {
        assertSame(this.celsius1, convertFromFahrenheitToCelsius(this.fahrenheit1));
        assertSame(this.celsius2, convertFromFahrenheitToCelsius(this.fahrenheit2));
    }
});

リスト 18 のコードは YUI を使用するテストの場合と大きく異なってはいません。JSTD は TestCase() 関数を使用してテスト・ケースを定義します。リスト 18 のようにインライン宣言を使用してテスト・メソッドを定義することも、TestCase インスタンスのプロトタイプを継承することもできます。いずれの方法の場合も SetUp() メソッドと tearDown() メソッドを使用することができます。

テストを実行するためには、単純に以下のコマンドを起動します。

java -jar JsTestDriver-1.3.3d.jar --tests all

図 4 はターミナル・ソフトの画面に表示される出力を示しています。

図 4. JSTD によるテストを実行した結果
どのテストに合格し、どのテストに不合格であったかをコマンドラインに表示した結果

テスト前に取り込まれたすべてのブラウザー (Chrome 15、Safari 5、Firefox 7) で、テストに合格しています。

JSTD は、継続的ビルドの一部として、皆さんのお望みの継続的インテグレーション・システムにも容易に統合することができます。JSTD は (プラグインとして) Eclipse などの IDE に統合したり、(バンドルとして) TextMate に統合したりすることもできます。


まとめ

最近では Web アプリケーションのクライアント・サイドに焦点が当てられるようになってきたため、JavaScript コードのユニット・テストが不可欠になっています。いくつかのフレームワークは JavaScript コードのユニット・テストを行う上で役に立ちます。この記事では最もよく使われている 3 つのフレームワーク、QUnit、YUI Test、JSTestDriver について説明しました。

  • QUnit は非常に単純であり、出発点として適切なフレームワークです。
  • YUI Test は YUI ライブラリーを理解している人達に適した完全なツールです。
  • JSTestDriver は複数のブラウザーでテストを実行したい場合に優れた能力を発揮するフレームワークです。

ダウンロード

内容ファイル名サイズ
Article source codeIBM_UnitTestingJS.zip54KB

参考文献

学ぶために

  • QUnit のドキュメント: QUnit の使い方、API、プラグイン、サポート、そして jQuery についての説明を読んでください。
  • How to Test your JavaScript Code with QUnit: このチュートリアルを読み、QUnit について、またなぜ厳密にコードをテストする必要があるのかについて学んでください。
  • Automating JavaScript Testing with QUnit: この資料を読み、QUnit を使用したテストについて学んでください。
  • YUI Test 3: ブラウザー・ベースの JavaScript ソリューション、YUI Test フレームワークについての資料を読んでください。YUI Test 3.1 の新機能についても学んでください。
  • JSTestDriver プロジェクトのウィキ: JavaScript のためのリモート・コンソール、JSTestDriver についての最新資料を読んでください。
  • jQuery: jQuery の UI、jQuery mobile、meetup、バグ・トラッカー、ダウンロード、ドキュメント、ディスカッションなどについて学んでください。
  • developerWorks の Web development ゾーン: Web 開発の分野でスキルを磨くためのリソースが豊富に用意されています。Web development 技術文書一覧に用意された、さまざまな技術記事やヒント、チュートリアル、技術標準、IBM Redbooks をご覧ください。
  • developerWorks podcasts: ソフトウェア開発者のための興味深いインタビューや議論を聞いてください。
  • developerWorks の Technical events and webcasts: 最新情報を入手してください。
  • developerWorks は Twitter を利用しています。今すぐ developerWorks のツイートをフォローしてください。
  • developerWorks On demand demos: 初心者のための製品インストール方法やセットアップのデモから、上級開発者のための高度な機能に至るまで、多様な話題が解説されています。

製品や技術を入手するために

  • JSTestDriver プロジェクト: 必要な JsTestDriver-1.3.3d.jar ファイルを入手してください。
  • TextMate のための JSTD バンドル: Github からダウンロードしてください。
  • QUnit: Github から QUnit をダウンロードしてください。
  • IBM 製品の評価版: IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2、Lotus、Rational、Tivoli、WebSphere などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=814623
ArticleTitle=JavaScript のユニット・テストを実行するためのツール
publish-date=05172012