Mocha是一个拥有丰富功能的javascript测试框架,可以用于nodejs和浏览器。支持同步/异步测试用例,有多种报告形式。
Installation
npm install -g mocha
Assertions
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
。
Synchronous code
1 | describe 'Array',-> |
Asynchronous code
1 | describe 'User',-> |
可以看到同步/异步的区别只是增加一个done
函数作为参数。异步过程结束后调用done()
即可。
done()
函数也可以接受一个error作为参数。
hooks
具体用法看名字就知道了。
before()
after()
beforeEach()
afterEach()
All ‘hooks’ 同样可以接受done
参数用于同步/异步过程。
甚至可以不使用done回调,而是直接返回一个promise对象。例如:
1 | it 'test',-> |
不过一般还是习惯加上done参数,整个流程看起来更清晰。
也可以什么都不做,只加入一段说明或者等待以后补充处理过程。
1 | describe 'Array',-> |
Exclusive tests
通过使用only()
只执行指定的测试场景。
1 | describe 'Array',-> |
1 | describe 'Array',-> |
Inclusive tests
类似only()
,可以用skip()
跳过某些测试。1
2
3
4
5describe 'Array',->
describe.skip '#indexOf',->
# do something
describe '#ooo',->
it.skip 'shoud...',->
基本用法和命令参数
mocha [debug] [options] [files]
直接执行mocha
命令,默认会查找./test/*.js
,so,尽量把所有测试用例放到test
目录。
因为现在基本只用coffee编码,为了偷懒少打几个字,习惯将常用的mocha
命令加入到grunt
tasks中,安装grunt-shell
模块,再添加一个简单的task即可,这里就不提了。
mocha init <path>
指定一个目录,初始化一个用于浏览器的测试目录。执行后会在该目录生成index.html
,mocha.js
,mocha.css
和一个空白的test.js
,可以直接在test.js
在添加测试用例。
命令行
- -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
常用
-w 监视文件变化
—compilers
for coffeescript 1.6
mocha --compilers coffee:coffee-script test/test.coffee
for coffeescript 1.7+
mocha --compilers coffee:coffee-script/register test/test.coffee
-b
只显示第一个异常,一般测试用例非常多的时比较有用,不然某个接口变化后全屏报错就会悲剧。
-t
指定超时时间,命令行中添加为全局的设置,也可以在测试用例内部调用timeout()
方法单独设置。1
2
3
4describe 'a suite of tests.',->
this.timeout 500
it 'should take less than 500ms',(done)->
setTimeout done,300
Interfaces
BDD
我一般只用到BDD
BDD
interface 提供了 describe()
,context()
,it()
,before()
,after()
,beforeEach()
,afterEach()
。context()
和describe()
没区别。
TDD
TDD
interface 提供了suite()
,test()
,suiteSetup()
,suiteTeardown()
,setup()
,teardown()
Exports
这个没什么好讲的。1
2
3
4
5
6module.exports =
before:->
'Array':
'#indexOf()':->
'should return -1 when not present':->
[1,2,3].indexOf(4).should.equal -1
QUnit
用到的第一个测试框架就是QUnit
,用法非常简单,但是现在基本不用了,没有层次会比较乱。