単体テスト
このチュートリアルに沿って学習するには、あらかじめ SDK をインストールし、cfx 入門および再利用可能なモジュールの作成のチュートリアルを学習してください。
SDK では、コードの単体テストの作成と実行を支援するフレームワークが提供されています。ここでは、このフレームワークの機能を理解するために、単純な Base64 エンコードモジュール用の単体テストを作成します。
単純な Base64 モジュール
Web ページでは、btoa() 関数と atob() 関数を使用して、Base64 のエンコードとデコードを実行できます。しかし残念なことにこれらの関数は window オブジェクトに付加され、window オブジェクトはメインのアドオンコードで使用できないため、atob() と btoa() もメインのアドオンコードで使用できません。低レベルの window-utils モジュールを使用して、window にアクセスし、これらの関数を呼び出すことは可能です。
しかし、window-utils に直接アクセスするコードを別のモジュールとしてカプセル化し、atob() 関数と btoa() 関数のみをエクスポートする方が適切な方法です。そこでここでは、それを行う Base64 モジュールを作成します。
まず新しいディレクトリを作成し、そのディレクトリに移動して cfx init を実行します。「lib」に「base64.js」という名前の新しいファイルを作成し、以下の内容をコピーします。
1 2 3 4 5 6 7 8 9 | var window = require("window-utils").activeBrowserWindow;exports.atob = function(a) { return window.atob(a);}exports.btoa = function(b) { return window.btoa(b);} |
このコードは 2 つの関数をエクスポートし、それらの関数が window オブジェクトの対応する関数を呼び出します。モジュールの動作を確認するため、「main.js」ファイルを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var widgets = require("widget");var base64 = require("base64");var widget = widgets.Widget({ id: "base64", label: "Base64 encode", onClick: function() { encoded = base64.btoa("hello"); console.log(encoded); decoded = base64.atob(encoded); console.log(decoded); }}); |
これで「main.js」は base64 モジュールをインポートし、それがエクスポートする 2 つの関数を呼び出すようになりました。このアドオンを実行し、ウィジェットをクリックすると、以下のログ出力が表示されます。
info: aGVsbG8= info: hello
作成した Base64 モジュールのテスト
アドオンの test ディレクトリに移動し、test-main.js ファイルを削除します。このファイルの代わりに test-base64.js というファイルを作成し、以下の内容をコピーします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | var base64 = require("base64")function test_atob(test) { test.assertEqual(base64.atob("aGVsbG8="), "hello"); test.done();}function test_btoa(test) { test.assertEqual(base64.btoa("hello"), "aGVsbG8="); test.done();}function test_empty_string(test) { test.assertRaises(function() { base64.atob(); }, "String contains an invalid character");};exports.test_atob = test_atob;exports.test_btoa = test_btoa;exports.test_empty_string = test_empty_string; |
このファイルでは 3 つの関数が呼び出され、それぞれが test オブジェクトである引数を 1 つずつ受け取ります。test は unit-test モジュールによって提供され、単体テストを簡単に実行するための関数を提供します。
-
最初の 2 つの関数は
atob()とbtoa()を呼び出し、test.assertEqual()を使用して予期したとおりの出力が得られることを確認します。 -
3 番目の test_empty_string 関数は、モジュールのエラー処理コードのテストとして、空の文字列を
atob()に渡し、test.assertRaises()を使用して予期したとおりに例外が発生することを確認します。
この時点で、アドオンは以下のようになります。
/base64
package.json
README.md
/doc
main.md
/lib
main.js
base64.js
/test
test-base64.js
ここでアドオンのルートディレクトリから、cfx --verbose test を実行します。以下のような出力が表示されます。
Running tests on Firefox 10.0/Gecko 10.0 ({ec8030f7-c20a-464f-9b0e-13a3a9e97384}) under darwin/x86.
info: executing 'test-base64.test_atob'
info: pass: a == b == "hello"
info: executing 'test-base64.test_btoa'
info: pass: a == b == "aGVsbG8="
info: executing 'test-base64.test_empty_string'
info: pass: a == b == "String contains an invalid character"
3 of 3 tests passed.
Total time: 1.691787 seconds
Program terminated successfully.
ここでの cfx test の動作は以下のとおりです。
モジュール名の「test」の後にハイフンが付いていることに注意してください。例えば「test-myCode.js」というモジュールは cfx test に読み込まれますが、「test_myCode.js」や「testMyCode.js」は読み込まれません。
- パッケージの
testディレクトリを調べます。 - 名前が
test-で始まるすべてのモジュールを読み込みます。 - それらのモジュールによってエクスポートされるすべての関数を呼び出します。このとき、
testオブジェクトの実装を唯一の引数として渡します。
もちろん、--verbose オプションを cfx に渡すことは必須ではありませんが、このオプションを使用すると出力がわかりやすくなります。