いまさらユニットテストの勉強

screenshot
JsUnit
野村総研のJsUnit利用ガイド(PDF)。
NRI JsUnit利用ガイド


Copyright © 株式会社野村総合研究所2006 All rights reserved.

本書は、本書に記載した要件、技術、方式に関する内容が変更されないこと、および出典を明示
いただくことを前提に、無償でその全部または一部を複製、翻案、翻訳、転載、引用、公衆送信、
譲渡等して利用いただけます。なお、全体を複製、翻案、翻訳された場合は、本書にある著作権
示を明示してください。
本書の著作権者は、本書の記載内容に関して、その正確性、商品性、利用目的への適合性等に関
して保証するものではなく、その利用により生じた損害について、法律上のいかなる責任も負いま
せん。
すばらしい。野村総研の担当者様、感謝いたします。

いままで、ろくなテスト工程を踏まずにその場限りの使い捨てコードばかり書いていたので、ユニットテストという考え方から勉強することになったのだけど、ユニットテスト自体当たり前になって久しいらしく、基本的な考え方やドキュメントに登場する単語の意味が掴みにくかった。
JsUnitを用いたJavaScriptユニットテストを行う方法は上記の野村総研のドキュメントに詳しく書かれているけれど、なんせ用語の意味するところがわからないので苦労したが、一度動き始めれば納得。

というわけで、JsUnitでのユニットテストを行うための、最小限の環境をここに書いておく。テストの実行すらおぼつかなかった今日午前中の私のために。
JsUnitのパッケージをダウンロード(SourceForge.net: Files)し、作業用のディレクトリに展開する。
テスト用のHTMLにJsUnit実行用のjsUnitCore.jsを読み込ませる。
個々のテストを以下のように記述する。


test[テスト名](){
...処理など
[Assertion Functions]('[comment]',[value] ,[value2]);
}

ワンセット書くとこんな感じ。


<head>
<!-- JsUnit実行用のjsUnitCore.jsをリンクする -->
<script src="./app/jsUnitCore.js" type="text/javascript"></script>
<script>

//JsTestのテスト項目
function testTEST_1(){
assert('initialize()があるか?',init());
}

function testTEST_2(){
assertEquals('1が引数のときに6が返るか?',test_6times(1),6);
assertEquals('5が引数のときに6が返るか?',test_6times(5),30);
}

function testTEST_3(){
assertNotEquals('0が代入されたときに1でないと返るか?',test_6times(0), 1 );
}

function testTEST_4(){
assertUndefined('document.referrerがUndefinedとなるか?',document.referrer.location );
}


//テスト対象の関数((何も仕事をしていないに等しい関数ですが、とにかくテストツールが動かないことには始まらないです。))
function init(){
return true;
}

function test_6times(input){
return input * 6;
}

</script>

関数がこのテストを通るように設計しようとすると、自ずと一つ一つの関数で処理する量は小さくなるし、メンテナンス性も高まる、ような、気が、する。間違ってグローバル変数なんかを指定していたりする間違いも防げそう。

上記のテストコードは当たり前ですがエラーなしで実行されますが、以下のようにエラーとなるテストがあった場合に、JsUnitのTestRunner.htmlでテストを実行すると、スクリーンショットのようにエラーとコメントが表示されます。


function testTEST_5(){
assertNotUndefined('document.referrerがUndefinedではない',document.referrer.location );
}

unittest