- Notifications
You must be signed in to change notification settings - Fork8
UnitTest
WebModule にはテストランナーが付属しており、Browser, WebWorkers, Node.js, NW.js, Electron, iPhone Simurator, Travic CI といった様々な環境で動作します。
ユニットテスト用のコードは test/testcase.js に記述します。
コード( lib/MyExample.js )を修正したら、品質の確認とテストを行います。
npm start
で簡易httpサーバを起動し、その後にnpm t
とタイプすることでビルドとテストが行われます。テスト対象はlib/MyExample.js
とrelease/MyExample.*.min.js
です。
ブラウザ用のテストページはhttp://localhost:8000/MyExample.js/test/browser/index.html にあります。
testcase.js のひな形は以下のようになっています。
varModuleTestMyExample=(function(global){// テストする環境を指定する場合は、 以下のオプションを ture または false にしますvartest=newTest("MyExample",{disable:false,// ユニットテスト全体を無効化しますbrowser:true,// Browser のテストを有効にしますworker:true,// WebWorkers のテストを有効にしますnode:true,// Node.js のテストを有効にしますnw:true,// nw.js のテストを有効にしますel:true,// electron (render process) のテストを有効にしますbutton:true,// 個別テスト用のボタンを HTML に追加しますboth:true,// minify 前のコードと minify 後のコードの両方をテストしますignoreError:false,// true を指定するとエラーが発生してもテストを止めません(エラーを無視します)callback:function(){// テスト終了でコールバックします},errorback:function(error){// テスト失敗でコールバックします}}).add([testMyExample_concat,]);if(IN_BROWSER||IN_NW||IN_EL){test.add([// browser and node-webkit test]);}elseif(IN_WORKER){test.add([// worker test]);}elseif(IN_NODE){test.add([// node.js and io.js test]);}// --- test cases ------------------------------------------functiontestMyExample_concat(test,pass,miss){varresult={0:newMyExample().concat("a")==="a",// true1:newMyExample("b").concat("b")==="bb"// true};if(/false/.test(JSON.stringify(result,null,2))){test.done(miss());}else{test.done(pass());}}returntest.run();})(GLOBAL);
特定の環境用にテストを追加する場合は、以下のようにします。
if(IN_BROWSER){test.add([testMyExample_newTest,<--追加]);}functiontestMyExample_newTest(test,pass,miss){if(テスト成功){test.done(pass());}else{test.done(miss());}}
テストの成功でtest.done(pass())
を実行してください。テストの失敗でtest.done(miss())
を実行してください。
同期処理と非同期処理の両方をテストできます。
functiontestMyExample_async(test,pass,miss){setTimeout(function(){test.done(pass());},1000);}
最初にtest/node/index.js
による Node.js のテストが走り、
次にtest/browser/index.html
とtest/browser/worker.js
を使ったブラウザのテストが始まります。
テストは最初lib/MyExample.js
に対して node → browser → worker の順番で行い、次にrelease/MyExample.*.min.js
に対して行います。
テスト成功でブラウザの画面が緑に、失敗で赤くなります。
また、Closure Compiler によるMyExample.*.min.js
のコンパイルに失敗している場合も赤くなります。
Closure Compiler の ADVANCED_OPTIMIZATIONS MODE に対応できていないコードはコンパイルに失敗します。恐らくはリネームが原因です。
たとえば、function SomeAPI() { return { foo: 123 }; }
はエラーになります。function SomeAPI() { return { "foo": 123 }; }
にしてください。
この場合は、恐らくfoo
がコンパイラにより別の短い名前(a
やb
)にされています。
リネームされたくない名前やプロパティはglobal.MyExample.hoge = 1;
の形ではなくglobal["MyExample"]["hoge"] = 1;
のように保護します。
MyExample.*.min.js
を DevTools で開き、Minify されているコードを展開({ }
をクリック)し、リネーム状況を確認することができます。