使用 Nightwatch 编写单元测试
概述
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。
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
回调,它表示测试已完成。如果存在,则回调必须在异步操作完成后被调用。
示例
以下单元测试检查 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
配置文件中组合端到端测试和单元测试的示例。请注意 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" : "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.