概要

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に設定できます。

tests/sampleTest.js
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`モジュールのユニットテストの一部です。

tests/utilsTest.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`のみに依存することを意味します。

nightwatch.json
{
  "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を確認してください。