JSSpecを使ってみる
JavaScriptのテストをそろそろちゃんとしようかな、と思ってテスティングフレームワークを検討中。JavaScriptのxUnit系フレームワークにはあんまりいいのがなかった記憶があるので、BDD系で探してみるとJSSpecがヒット。なかなか良さそうなのでちょっと使ってみました。
ダウンロード
Downloads - JSSpecより、JSSpec20080923.zip をダウンロードして展開。
簡単なサンプル
JSSpecに添付されているサンプルを改変して作成してみました。
- 振る舞いとかexpectationといったBDD用語は、Rubyist Magazine - スはスペックのスがわかりやすいのでそちらを参照。
- 本当は、テスト対象クラスは別のファイルになるはずだし、specの部分も別のファイルにしておくのがよいんだろうな。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>JSSpec results</title> <link rel="stylesheet" type="text/css" href="jsspec/JSSpec.css" /> <script type="text/javascript" src="jsspec/diff_match_patch.js"></script> <script type="text/javascript" src="jsspec/JSSpec.js"></script> <script type="text/javascript"> // テスト対象のクラス Kitten = function( name, age ) { this.name = name; this.age = age; }; Kitten.prototype = { meow : function() { return this.name + ":meow!" } }; // Kittenの振る舞い定義 describe(' Kitten ("mii", 1) の場合', { // 各expectationの前に呼び出される関数。 // xUnitにおけるsetUpに該当。 // 同様に、tearDownに対応するafterも利用できる。 'before': function() { target = new Kitten( "mii", 1 ); // ↑ローカル変数のようだけど、example内でも参照できる。 // スコープが同じになっているようだ。 }, // 実行可能なサンプル (example)。 'age は 1 になる': function() { value_of(target.age).should_be(1); // expectation。should_be()以外にもいろいろ使える。 }, 'name は "mii" になる': function() { value_of(target.name).should_be("mii"); }, 'meow() は "mii:meow!" になる': function() { value_of(target.meow()).should_be("mii:meow!"); } }) </script> </head> <body></body> </html>
ふむ。依存ファイルも少なくてさくっと使えし、なかなかいいんじゃないかと。これを期にBDDもちゃんと勉強するかな。