BDD 行为驱动开发

使用BDD可以解决需求和开发脱节的问题,首先都是从用户的需求出发,保证程序实现效果与用户需求一致。
编写一个拷贝对象的模块,需要进行大量测试。从需求角度出发,模块涉及的数据类型繁多,每一种都需要不同的测试用例。对于需求方来说,更关注的是模块在每个用例下运行的表现——甚至可以说,这样的模块是以需求为驱动的,即使一开始无法满足所有用例,只要有明确的用例需求,就能够迭代出正确的功能。

BDD是第二代的、由外及内的、基于拉(pull)的、多方利益相关者的(stakeholder)、多种可扩展的、高自动化的敏捷方法。它描述了一个交互循环,可以具有带有良好定义的输出(即工作中交付的结果):已测试过的软件。
BDD风格用例:

describe('Array', function(){
before(function(){
// ...
});
describe('#indexOf()', function(){
it('should return -1 when not present', function(){
[1,2,3].indexOf(4).should.equal(-1);
});
});
after(function(){
// ...
});
});

BDD常用的接口有:

  • describe() :描述场景,在里面可以设定Context,可包括多个测试用例,也可以嵌套场景
  • it() :位于场景内,描述测试用例
  • before() :所有测试用例的统一前置动作
  • after() :所有测试用例的统一后置动作
  • beforeEach() :每个测试用例的前置动作
  • afterEach() :每个测试用例的后置动作

BDD同样支持异步

describe('File loading', function () {
it('content should not empty', function (done) {
require('fs').read('test.txt', function(err, res){
res.should.not.equal(null);
done();
});
});
});

done()为异步方法完成回调,可用于下一用例的等待。