作者:vienwu
这篇是前段时间总结给自己备忘的,要用到的工具实在太多,没法一一记住。
个人感觉,作为一个测试的工具,只要会用就好了。
所以这里稍微做了一些修改,简单介绍一下常用的写法和命令,其次将之前的一些示例改成javascript版本,方便没有coffee基础的同学浏览。
介绍
mocha是一个拥有丰富功能的javascript测试框架,可以用于nodejs和浏览器。支持同步/异步测试用例,有多种报告形式。
官网介绍了很多的特性,个人感觉实用的就几点:
一个是nodejs和浏览器都可以用,不用再记那么多奇怪的api和写法了。
其次是编写同步/异步测试用例非常简单。
安装
$ npm install mocha -g
成功安装后就可以使用mocha
命令了。
使用
运行./test/
目录所有js
$ mocha
指定js文件
$ mocha xxx.js
监听文件变化
$ mocha xxx.js -w
指定coffee编译
for coffescript 1.6
$ mocha --compilers coffee:coffee-script test.coffee
for coffeescript 1.7+
$ mocha --compilers coffee:coffee-script/register test.coffee
浏览器的使用
$ mocha init <path>
指定一个目录,初始化一个用于浏览器的测试目录。执行后会在该目录生成index.html
、mocha.js
、mocha.css
和一个空白的test.js
,可以直接在test.js
中添加测试用例。
当然,也可以不敲命令直接复制引用mocha.js
到html。
编写用例
常用的断言库都可以运行的很好。以下列出几个:
should.js
BDD style shown throughout these docs.chai
expect() assert() and should style assertionsexpect.js
expect() style assertionsbetter-assert
c-style self.documenting assert()
个人一般用nodejs自带的assert
(方便不用安装)和should.js
(功能强大很好用)
同步代码
require('should');
describe('测试数组Array',function(){
describe('测试#indexOf方法',function(){
it('不存在的元素会返回-1',function(){
[1,2,3].indexOf(5).should.equal(-1);
[1,2,3].indexOf(0).should.equal(-1);
});
});
});
异步代码
写法和同步代码类似,只是在it()
的第二个参数的函数参数中传入一个done
函数,用于控制异步函数的结束。
describe('测试User模块',function(){
describe('测试#save()方法',function(){
it('此处不应出错',function(done){
var user = new User({name:'董小姐'});
user.save(function(err){
assert.ifError(err);
done();
});
});
});
});
其中,done()
函数也可以接受一个error作为参数,所以上面其实可以简化为:
describe('测试User模块',function(){
describe('测试#save()方法',function(){
it('此处不应出错',function(done){
var user = new User({name:'董大爷'});
user.save(done);
});
});
});
hooks
mocha支持多种体位的hook,用法做一些或者干掉一些东东。如下:
before()
开始前1次after()
结束后做1次beforeEach()
开始前每次都做afterEach()
每次结束后都做
所有的hooks都可以接收done()
参数用于异步结束。甚至可以不使用done
参数,而是直接返回一个promise
对象,例如:
beforeEach(function(){
return db.clear().then(function() {
return db.save([tobi, loki, jane]);
});
});
不过建议还是加上done
参数,看起来清晰,习惯统一。
BDD和TDD
现在一般都用BDD。
BDD interface 提供了 describe(),context(),it(),before(),after(),beforeEach(),afterEach()。
context()和describe()没区别。
TDD interface 提供了suite(),test(),suiteSetup(),suiteTeardown(),setup(),teardown()
其他常用
-b 参数 只显示第一个异常
一般测试用例多的时候非常有用,不然某个接口变化全屏报错就悲剧了
-t 参数 指定单个测试用例的超时时间
默认单个测试用例超时时间为2000ms。
命令行中添加为全局的设置,也可以在测试用例内部调用timeout()
方法单独控制。
ok,介绍到此就结束了,最后附上其他命令速查
其他命令行
- -h,—help
- -V,—version
- -A,—async-only 强制为异步模式,即所有测试必须包含一个done()回调。
- -c,—colors
- -C,—no-colors
- -G,—growl
- -O,—reporter-options \
- -R,—reporter \
- -S,—sort
- -b,—bail
- -d,—debug
- -g,—grep \
- -f,—fgrep \
- -gc,—expose-gc
- -i,—invert
- -r,—require \
- -s,—slow \
- -t,—timeout \ 设置超时,默认为2000ms,如果是长时间运算需要设置。
- -u,—ui \
- -w,—watch 监视文件变化
- —check-leaks
- —compilers :,… 使用指定模块编译文件,经常会用到编译coffee
- —debug-brak
- —globals \
- —inline-diffs
- —interfaces
- —no-deprecation
- —no-exit
- —no-timeouts
- —opts \
- —prof
- —recursive
- —reporters
- —throw-deprecation
- —trace
- —trace-deprecation
- —watch-extensions ,…
- —delay