Nightwatch运行器(Nightwatch Runner)
Nightwatch包含一个命令行运行器,它可以很容易地运行测试并生成有用的输出。关于如何使用测试运行器,有一些不同的选项,这取决于你的安装类型。
Global
如果你已经在全局范围内(-g )安装了Nightwatch,就可以在任何地方使用Nightwatch。
$ nightwatch [source] [options]
项目具体设置
如果你已经把Nightwatch作为你的项目的依赖项安装了,你可以从node_modules/.bin目录下引用了。
Linux and MacOSX:
$ ./node_modules/.bin/nightwatch [source] [options]
Windows:
创建nightwatch.js文件,增加如下一行:
require('nightwatch/bin/runner.js');
然后运行如下:
C:\workspace\project> node nightwatch.js [source] [options]
Tests source
可选的source参数可以是一个或多个文件或整个文件夹。在src_folders去设置。
例子 - 单独文件
$ nightwatch tests/one/firstTest.js
例子 - 两个单独文件
$ nightwatch tests/one/firstTest.js tests/secondTest.js
例子 - 一个单独文件和一个文件夹
$ nightwatch tests/one/test.js tests/utils
命令行选项(Command-line Options)
测试运行器支持许多run-time选项被传递到。请运行以下命令查询更多帮助。
$ nightwatch --help
| Name | Shortname | default | description |
|---|---|---|---|
--config |
-c |
./nightwatch.json |
本地nightwatch.json文件。配置文件在运行时使用,也包含了Selenium WebDriver设置选项。 |
--output |
-o |
tests_output |
保存JUnit xml报告的位置 |
--reporter |
-r |
junit |
预定义报告人或报告人文件位置时用的。 |
--env |
-e |
default |
测试环境的定义nightwatch.json |
--verbose |
在会话期间扩展selenium日志输出 | ||
--version |
-v |
显示版本号 | |
--test |
-t |
只运行指定的测试套件/模块。默认情况下会执行src_folders下的所有测试用例。 | |
--testcase |
只和--test一起使用。从当前测试套件/模块中运行指定的testcase。 | ||
--group |
-g |
只运行指定组的测试,测试以组来划分它们放在同一个子文件夹下。 | |
--skipgroup |
-s |
跳过一个或多个测试组(它们中间以逗号分开) | |
--filter |
-f |
指定一个过滤器,加载作为文件名格式化来使用。 | |
--tag |
-a |
通过标签来过滤测试模块,只有具体指定标签的测试才会被运行。 | |
--skiptags |
跳过有指定标签或标记的测试用例(逗号分隔)。 | ||
--retries |
重试失败或错误的测试用例的次数达到指定的次数。重新尝试beforEach和afterEach hooks. | ||
--suiteRetries |
重试失败或错误的testsuites,直到指定的次数。如果在testsuites中定义了任何一个测试集,那么重新尝试before 和 after hooks |
FIXME
Test Groups
可以将你的测试脚本划分到组中,并根据需要运行它们。要将测试组合在一起,只需将它们放在相同的子文件夹中,文件夹的名字即是组的名字。
例如:
lib/
├── selenium-server-standalone.jar
custom-commands/
├── loginUser.js
├── attachPicture.js
tests/
├── logingroup
| ├── login_test.js
| └── otherlogin_test.js
├── addressbook
| ├── addressbook_test.js
| └── contact_test.js
├── chat
| ├── chatwindow_test.js
| ├── chatmessage_test.js
| └── otherchat_test.js
└── smoketests
├── smoke_test.js
└── othersmoke_test.js
如果只运行smoketests组,你可以这样做:
$ nightwatch --group smoketests
同样,如果你想跳过运行smoketests组,你可以这样做:
$ nightwatch --skipgroup smoketests
想跳过多个组,只需要将他们用逗号分隔:
$ nightwatch --skipgroup addressbook,chat
Test Tags
你还可以根据标记对测试进行选择,例如:
module.exports = {
'@tags': ['login', 'report'],
'demo login test': function (client) {
// test code
}
};
比如你想测试所有关于report的功能,这些功能可能分布在不同的测试用例中,那么直接运行如下命令即可测试report功能:
$ nightwatch --tag report
也可以运行多个标签:
$ nightwatch --tag login --tag report
也可以跳过多个标签:
$ nightwatch --skiptags login,report
Disabling Tests
为了防止测试模块运行,只需将该模块中的禁用属性设置为true,如下:
module.exports = {
'@disabled': true, // This will prevent the test module from running.
'sample test': function (client) {
// test code
}
};
如果你不想运行已知的失败的测试用例,这是很有用的。
禁用个别方法
目前还不支持禁用单独的testcase。然后如下方式这样写 ''+function 可以将这个方法禁用掉,供参考。
module.exports = {
'sample test': function (client) {
// test code
},
// disabled
'other sample test': ''+function (client) {
// test code
}
};
并发运行
从v0.5开始nightwatch支持并发测试。通过在命令行中指定多个环境来工作,用逗号分隔。例如:
$ nightwatch -e default,chrome
这样可以在多个相同或是不同的浏览器上运行。
终端输出
每个环境将作为一个单独的child_process运行,输出将被发送到主进程。
为了让输出更容易阅读,Nightwatch默认地缓冲了每个子进程的输出,并在最后显示所有的内容,按环境分组。
如果想禁用输出缓冲,并在发送到输出文档时看到每个子进程的输出,只需在nightwatch.json中将“live_output”:true
你可以在每个浏览器(通过desiredCapabilities)创建一个单独的环境,然后并行地运行它们。此外,使用filter和exclude选项测试可以在每个环境中进行拆分,以便并行运行。
Via Workers
在v0.版本7引入了一个新特性,允许并行运行测试。当启用这个功能时,测试运行器将启动一个可配置的子进程,然后将所加载的测试分发到并行运行。
想启动测试workers,设置test_workers最高级的属性,如下:
"test_workers": {
"enabled": true,
"workers": "auto"
}
或者,简单的:
"test_workers": true
worker选项配置可以同时运行多个子进程
- “auto”——由cpu数量决定,例如4个cpu,意味着4个worker
- {number} - 指定确切的workers数量
测试并发性是在文件级别完成的。每个测试文件将填充一个测试worker位置。测试文件中的单个测试/步骤不会并发运行。
在并行运行测试时,0.9版本为显示输出提供了改进的支持。建议在测试环境中设置
detailed_output to false,以提高输出的可读性。
Using Grunt
Grunt是一个流行的JavaScript任务运行程序。从Nightwatch0.6版本开始,很容易与繁重的任务捆绑在一起,可以在现有的Grunt-based构建配置中运行测试用例
用法
首先,在你的Gruntfile.js的顶部加载Nightwatch grunt任务
module.exports = function(grunt) {
var nightwatch = require('nightwatch');
nightwatch.initGrunt(grunt);
// ...
};
任务配置和目标
Nightwatch任务将有一个或多个目标,可以以多种方式使用,其中一种方法是将它们映射到环境。相关的设置参数:
- options - 目前可用的唯一选项是cwd - 当前工作目录
- argv - 命令行参数通常会床底到Nightwatch运行器(例如:env)
- settings - 测试设置指定为一个单独的Nightwatch环境。
例如:
grunt.initConfig({
nightwatch: {
options: {
cwd: './'
},
'default' : {},
browserstack: {
argv: {
env: 'browserstack'
},
settings: {
silent: true
}
},
'all' : {
argv: {
env: 'default,browserstack'
}
},
}
});
执行一下任务:
$ grunt nightwatch:default
或
$ grunt nightwatch:browserstack
如果你感兴趣的话,也可以使用一些Nightwatch第三方的Grunt插件,最受欢迎的是grunt-nightwatch。
Using Mocha
Nightwatch从0.8版本开始,与流行的Mocha测试运行器捆绑在一起,它允许使用Mocha运行测试,从而利用它的接口和报告。
用法
有两种主要的方法在Nightwatch中使用Mocha。
Mocha作为一个可选的测试运行器,通过在nightwatch.json中的test_runner来特殊指定。
可以为Mocha定制设置:
{
...
"test_runner" : {
"type" : "mocha",
"options" : {
"ui" : "bdd",
"reporter" : "list"
}
}
...
}
或 简单的:
{
...
"test_runner" : "mocha"
...
}
可以在这里找到一个完整的Mocha选项列表。
test_runner也可以在测试环境中指定:
{
"test_settings" : {
"mocha_tests" : {
"test_runner" : {
"type" : "mocha",
"options" : {
"ui" : "tdd",
"reporter" : "list"
}
}
}
}
...
}
例如:
在Mocha上编写测试与在Nightwatch中编写测试是一样的。每个testcase都接收到client对象,hooks也异步操作接收一个done的回调。
describe('Google demo test for Mocha', function() {
describe('with Nightwatch', function() {
before(function(client, done) {
done();
});
after(function(client, done) {
client.end(function() {
done();
});
});
afterEach(function(client, done) {
done();
});
beforeEach(function(client, done) {
done();
});
it('uses BDD to run the Google simple test', function(client) {
client
.url('http://google.com')
.expect.element('body').to.be.present.before(1000);
client.setValue('input[type=text]', ['nightwatch', client.Keys.ENTER])
.pause(1000)
.assert.containsText('#main', 'Night Watch');
});
});
});
当从Nightwatch使用mocha测试运行器时,一些cli选项是不可用的,比如--retries,--suiteRetries,--reporter。
使用标准的Mocha
使用标准的Mocha运行Nightwatch测试也是可能的,尽管需要更的样板代码,你需要管理selenium服务器。
例如
var nightwatch = require('nightwatch');
describe('Github', function() {
var client = nightwatch.initClient({
silent : true
});
var browser = client.api();
this.timeout(99999999);
before(function() {
browser.perform(function() {
console.log('beforeAll')
});
});
beforeEach(function(done) {
browser.perform(function() {
console.log('beforeEach')
});
client.start(done);
});
it('Demo test GitHub', function (done) {
browser
.url('https://github.com/nightwatchjs/nightwatch')
.waitForElementVisible('body', 5000)
.assert.title('nightwatchjs/nightwatch · GitHub')
.waitForElementVisible('body', 1000)
.assert.visible('.container .breadcrumb a span')
.assert.containsText('.container .breadcrumb a span', 'nightwatch', 'Checking project title is set to nightwatch');
client.start(done);
});
afterEach(function() {
browser.perform(function() {
console.log('afterEach')
});
});
after(function(done) {
browser.end(function() {
console.log('afterAll')
});
client.start(done);
});
});