教程:https://cnodejs.org/topic/516526766d38277306c7d277
看着挺爽的。
//同步
var assert = require(‘assert‘); describe(‘Array‘, function(){ describe(‘#indexOf‘, function(){ it(‘should return -1 when the value is not present‘, function(){ assert.equal(-1, [1,2,3].indexOf(5)); assert.equal(-1, [1,2,3].indexOf(0)); }) }) })
describe (moduleName, testDetails)
由上述代码可看出,describe是可以嵌套的,比如上述代码嵌套的两个describe就可以理解成测试人员希望测试Array模块下的#indexOf() 子模块。
module_name 是可以随便取的,关键是要让人读明白就好。
it (info, function)
具体的测试语句会放在it的回调函数里,一般来说info字符串会写期望的正确输出的简要一句话文字说明。
当该it block内的test failed的时候控制台就会把详细信息打印出来。
一般是从最外层的describe的module_name开始输出(可以理解成沿着路径或者递归链或者回调链),最后输出info,表示该期望的info内容没有被满足。
一个it对应一个实际的test case
assert.equal (exp1, exp2)
断言判断exp1结果是否等于exp2, 这里采取的等于判断是== 而并非 === 。即 assert.equal(1, ‘1’) 认为是True。
这只是nodejs里的assert.js的一种断言形式,下文会提到同样比较常用的should.js。
采用should
//异步
最深处的回调函数中加done()表示结束:按照瀑布流编程习惯,取名done是表示你回调的最深处,也就是结束写嵌套回调函数。但对于回调链来说done实际上意味着告诉mocha从此处开始测试,一层层回调回去。
假如我有两个异步函数(两条分叉的回调链),那我应该在哪里加done()呢?实际上这个时候就不应该在一个it里面存在两个要测试的函数,事实上一个it里面只能调用一次done,当你调用多次done的话mocha会抛出错误。
fs = require(‘fs‘); describe(‘File‘, function(){ describe(‘#readFile()‘, function(){ it(‘should read test.ls without error‘, function(done){ fs.readFile(‘test.ls‘, function(err){ if (err) throw err; done(); }); }) it(‘should read test.js without error‘, function(done){ fs.readFile(‘test.js‘, function(err){ if (err) throw err; done(); }); }) }) })
未写细节的:默认会pass
describe(‘Array‘, function(){ describe(‘#indexOf()‘, function(){ it(‘should return -1 when the value is not present‘, function(){ }) }) });
only skip函数:只有only的会被执行,另一个会被忽略掉。每个函数里只能有一个only。如果是it.skip ,那么该case就会被忽略。
fs = require(‘fs‘); describe(‘File‘, function(){ describe(‘#readFile()‘, function(){ it.only[skip](‘should read test.ls without error‘, function(done){ fs.readFile(‘test.ls‘, function(err){ if (err) throw err; done(); }); }) it(‘should read test.js without error‘, function(done){ }) }) })
before beforeEach after afterEach
beforeEach会对当前describe下的所有子case生效。
before和after的代码没有特殊顺序要求。
同一个describe下可以有多个before,执行顺序与代码顺序相同。
同一个describe下的执行顺序为before, beforeEach, afterEach, after
当一个it有多个before的时候,执行顺序从最外围的describe的before开始,其余同理。
以上都是BDD 行为驱动开发
如果是TDD的话 测试驱动开发:suite, test, setup, teardown
suite ‘Array‘, !-> setup !-> console.log ‘setup‘ teardown !-> console.log ‘teardown‘ suite ‘#indexOf()‘, !-> test ‘should return -1 when not present‘, !-> assert.equal -1, [1,2,3].indexOf 4