Nightwatch を使用したユニットテストの記述
概要
Nightwatchでのユニットテストはバージョン0.9
から利用可能であり、Nightwatchで記述されたユニットテストはMochaのExportsインターフェースとも完全に互換性があるため、どちらのテストランナーも使用できます。
ユニットテストモード
Nightwatchは自動的にWebDriverサーバーに接続し、セッションを作成しようとします。ユニットテストを実行する場合、これは無効にする必要があり、ランナーはユニットテストモードで動作していることを認識する必要があります。
これは2つの方法で行うことができます。
1. `unit_tests_mode=true` の設定
これはグローバルオプションです。`nightwatch.json`で`unit_tests_mode`オプションを`true`に設定します。
{
"src_folders" : ["tests"],
"unit_tests_mode": true
}
2. テストごとに`@unitTest`プロパティの追加
個々のテストスイートをユニットテストとして扱う場合は、`@unitTest`プロパティをtrueに設定できます。
const assert = require('assert');
module.exports = {
'@unitTest': true,
'demo UnitTest' : function (done) {
assert.equal('TEST', 'TEST');
setTimeout(function() {
done();
}, 10);
}
};
アサーションフレームワークの選択
ユニットテストでは、`browser`オブジェクトはテストケースの引数として渡されません。渡される唯一の引数は、非同期テストで使用される`done`コールバックです。
任意のアサーションフレームワークを使用できます。Chai.jsは非常に優れた柔軟性の高いフレームワークです。
例
これは、Nightwatch の`utils.js`モジュールのユニットテストの一部です。
const assert = require('assert');
const common = require('../../common.js');
const Utils = common.require('util/utils.js');
module.exports = {
'test Utils' : {
testFormatElapsedTime : function() {
var resultMs = Utils.formatElapsedTime(999);
assert.equal(resultMs, '999ms');
var resultSec = Utils.formatElapsedTime(1999);
assert.equal(resultSec, '1.999s');
var resultMin = Utils.formatElapsedTime(122299, true);
assert.equal(resultMin, '2m 2s / 122299ms');
},
testMakeFnAsync : function() {
function asyncFn(cb) {
cb();
}
function syncFn() {}
var convertedFn = Utils.makeFnAsync(1, syncFn);
var called = false;
convertedFn(function() {
called = true;
});
assert.equal(Utils.makeFnAsync(1, asyncFn), asyncFn);
assert.ok(called);
}
}
};
非同期ユニットテスト
テスト関数の引数は、テストが完了したことを示すオプションの`done`コールバックです。存在する場合は、非同期操作が終了したときにコールバックを呼び出す必要があります。
例
これは、設定された時間内(10ms)に`done`コールバックを呼び出さなかった場合にNightwatchがエラーをスローするかどうかを確認するユニットテストです。
module.exports = {
const assert = require('assert');
module.exports = {
'demo UnitTest' : function (done) {
assert.equal('TEST', 'TEST');
setTimeout(function() {
done();
}, 10);
}
};
};
複合設定の使用
以下は、同じ`nightwatch.json`設定ファイルでエンドツーエンドテストとユニットテストを組み合わせる方法の例です。`exclude`と`filter`プロパティの使用方法に注意してください。
空の`exclude`は、その値をリセットして`filter`のみに依存することを意味します。
{
"src_folders" : ["./examples/tests", "./examples/unittests"],
"output_folder" : "./examples/reports",
"webdriver" : {
"start_process": true,
"server_path": "node_modules/.bin/chromedriver",
"port": 9515
},
"test_settings" : {
"default" : {
"launch_url" : "http://localhost",
"desiredCapabilities": {
"browserName": "chrome"
},
"exclude" : "./examples/unittests/*"
},
"unittests" : {
"unit_tests_mode" : true,
"filter" : "./examples/unittests/*",
"exclude" : ""
}
}
}
コードカバレッジ
現時点では、Nightwatchはカバレッジレポーターを提供していませんが、今後のリリースで計画されています。その間、カバレッジデータを出力するカスタムレポーターを作成できます。カスタムレポーターセクションとMocha HTMLCovレポーターを参照して、レポーターの外観を確認してください。
サードパーティのカバレッジサービス
最新のWebインターフェースでレポートとメトリクスを提供するホスト型サービスがいくつかあります。これらのサービスは通常、LCOV形式のコーダデータが必要です。Nightwatchはcoveralls.ioを使用します。
LCOVレポーターの外観とプロジェクトへの統合方法の詳細については、mocha-lcov-reporterを確認してください。