最近好玩,根据vue-cli里的e2e看了下nightwatch的使用
之后有空研究下内部原理
night watch
night watch本身只是一个测试框架而已。如图,webdriver与dev都不是night watch的内容,因此需要在配置文件中指定。night watch中则包含测试逻辑。
当然,night watch也可以包含其他测试框架,比如mocha,通过配置文件中的test_runner设置即可。
google前几的教程以及官网都太过于系统化了,只讲了两个部分各自的配置,没有具体说明每部分配置的意义和逻辑。
题外话:night watch的官网真是够烂的
配置文件
官网
嗯,官网的东西就是写的没有人看得懂
简单的说,配置文件nightwatch.conf.js(nightwatch.json)包含三大部分
1. basic
night watch 本身的配置,最主要的是src_folders,作为测试文件的入口文件夹
2. server
默认使用的是selenium,官网给的是java下的jar,但是在使用中可以采用selenium-server库
配置文件如下
selenium: {
start_process: true,
server_path: require('selenium-server').path
}
server_path也可以采用java下的selenium包,甚至是其他环境下的selenium包。甚至可以不需要selenium来启动webdriver服务。
3. test
test配置了各项test runner内容,默认采用default,也可在命令行中采用--env environment
设置
测试文件
官网
测试文件放在nightwatch.conf.js中src_folders下
形式如
module.exports = {
'default e2e tests': function (browser) {
browser
.url('http://localhost:3000')
.assert.elementPresent('#trigger')
.assert.containsText('#clear', 'clear')
.end()
}
}
测试时night watch会找到文件夹下所有.js测试文件,并对其中暴露的所有方法进行测试
断言及api语法
测试
官网压根就没说,也是很优秀了
1. cli方式
node_module/.bin/nightwatch file.js --config configfile.js --env chrome
如果不加--config
会默认为根目录的nightwatch.conf.js
如果不加--env
会默认为’default’
因此
node_module/.bin/nightwatch
会默认读取./nightwatch.conf.js,从中读取入口文件夹,根据其中的.js文件进行测试
2. 文件方式
vue-cli采用了文件方式起了一个子线程来跑测试,核心部分如下
let opts = [];
if (opts.indexOf('--config') === -1) {
opts = opts.concat(['--config', 'nightwatch.conf.js']);
}
if (opts.indexOf('--env') === -1) {
opts = opts.concat(['--env', 'chrome']);
}
const spawn = require('cross-spawn');
const runner = spawn('./node_modules/.bin/nightwatch', opts, {
stdio: 'inherit'
});
runner.on('exit', function(code) {
process.exit(code);
});
runner.on('error', function(err) {
throw err;
});
这段是起测试服务的核心代码,本质就是起了一个子线程。vue-cli的这种方式是为了在起测试之前先起prod-server服务,同时能将一些config文件给抽离出去
puppeteer
严格来说puppeteer与night watch并不是并列的,在night watch图中最右侧的部分采用的是phantomjs,可以使用puppeteer代替
不过自己用的时候感觉pupeteer本身就可以做一个e2e测试库了
晚上回去接着写吧。。。