概述

Nightwatch 从版本 0.9 开始支持单元测试,在 Nightwatch 中编写的单元测试也完全兼容 Mocha 的 Exports 接口,因此您可以使用任一测试运行器。

单元测试模式

Nightwatch 会自动尝试连接到 WebDriver 服务器并创建会话。在运行单元测试时,需要禁用此功能,并让运行器知道它正在单元测试模式下运行。

这可以通过两种方式完成

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 回调,它表示测试已完成。如果存在,则回调必须在异步操作完成后被调用。

示例

以下单元测试检查 Nightwatch 是否在您未在设定的时间(10 毫秒)内调用 done 回调时抛出错误。


module.exports = {
  const assert = require('assert');
  
module.exports = { 'demo UnitTest' : function (done) { assert.equal('TEST', 'TEST');
setTimeout(function() { done(); }, 10); } }; };

使用组合配置

下面是如何在同一个 nightwatch.json 配置文件中组合端到端测试和单元测试的示例。请注意 excludefilter 属性的使用。

一个空的 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" : "https://127.0.0.1", "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.