若是你一直在关注最新的软件开发,你必定听过测试驱动开发(Test-driven development TDD)和行为驱动开发(Behavior-driven development BDD)。这篇文章说明比较了这两种不一样的开发模式,并提供了例子。git
Test Drive Development,测试驱动开发github
当我第一次据说TDD,就以为它是一个很简单的概念,TDD是使用测试案例等来驱动你的软件开发。npm
若是咱们想要更深刻点了解TDD,咱们能够将它分红五个不一样的阶段:框架
1.首先,开发人员编写一些测试方法。函数
2.其次,开发人员使用这些测试,可是很明显的,测试都没有经过,缘由是尚未编写这些功能的代码来实际执行。grunt
3.接下来,开发人员实现测试中的代码。学习
4.若是开发人员写代码很优秀,那么在下一阶段会看到他的测试经过。测试
5.而后开发人员能够重构本身的代码,添加注释,使其变得整洁,开发人员知道,若是新添加的代码破坏了什么,那么测试会提醒他失败。ui
这种周期不断的循环下去,只要开发者有更多的功能须要开发。流程图以下:spa
Test-driven development flowchart
例子:
咱们来看看一个开发人员是怎么来作着几个步骤的。这篇文章的完整的代码在:https://github.com/jdavis/tdd-vs-bdd,代码免费下载,你可使用如下命令来运行:npm install && grunt。
比方说,开发人员但愿写一个简单的函数来极端阶乘(这个例子很简单,但它会告诉咱们TDD和BDD之间的差别)。TDD的常规作法是使用这个方法(function),而后断言(assert)计算结果符合条件。
在这个例子中,咱们将使用Javascript的测试框架中的Mocha。测试应该和下面这个差很少:
var assert = require('assert'), factorial = require('../index');
suit('Test', function(){ setup(function(){ //Create any objects that we might need }); suit('#factorial()', function(){ test('equals 1 for sets of zero length', function(){ assert.equal(1, factorial(0)); }); test('equals 1 for sets of lengrh one', function(){ assert.equal(1, factorial(1)); }); test('equals 2 for sets of lengrh two', function(){ assert.equal(2, factorial(2)); }); test('equals 6 for sets of length three', function(){ assert.equal(6, factorial(3)); }); }); }); |
很明显,测试会失败,由于咱们尚未写函数。而后让咱们来写知足测试条件的函数。这些函数可能像下面这样:
module.exports = function(n) { if(n<0) return NaN; if(n===0) return 1;
return n*(factorial(n-1)); } |
如今咱们运行这个测试,就能够经过了。下面咱们看看BDD是怎样工做的。
Behavior-Driven Development ,行为驱动开发
好啦,如今你可能要问什么是BDD呢?这个定义呢,就有一点模糊了。有些人会说,它和TDD很像;还有人会说,这就是有着更好的指导的TDD。
无论它实际的定义是什么,这没有那么重要。最主要的是你要知道BDD能够消除TDD可能存在的问题。
和TDD比起来,BDD是须要咱们先写行为规范(功能明细),在进行软件开发。功能明细和测试看起来很是类似,可是功能明细更加含蓄一些。
例子:
让咱们继续看一下上面那个例子用BDD如何实现:
var assert=require('assert'), factorial = require('../index');
describe('Test', function(){ before(function(){ //Stuff to do before the tests, like imports, what not });
describe('#factorial()', function(){ it('should return 1 when given 0', function(){ factorial(0).should.equal(1); }); it('should return 1 when given 1', function(){ factorial(1).should.equal(1); }); it('should return 2 when given 2', function(){ factorial(2).should.equal(2); }); it('should return 6 when given 3', funcrion(){ factorial(3).should.equal(6); }); });
after(function(){ //Anything after the tests have finished }); }); |
最主要的区别在于描述的不一样。BDD采用了更详细的方式使得它看起来就像是一句话。
这就是我所说的BDD能够解决一些TDD可能致使的问题。让你的测试看起来更像一个句子,是一种认知上的转变,你会更多的去考虑如何写你的测试。有一种说法是,若是你能够毫无障碍的阅读你的测试,你天然会写出更好的、更全面的测试。
这个例子很简单,咱们不须要对其作过多的说明。BDD测试应该注重功能而不是实际的结果。你经常会据说BDD是帮助设计软件,而不是像TDD那样的测试软件。
TDD VS BDD
在TDD和BDD之间作选择是比较复杂的事情。这取决于你使用的语言是否有一个合适的测试框架,你的同事们是否熟悉他等等因素。
有些人认为BDD总比TDD要好。由于它可以消除TDD带来的问题。
BDD的关键在于,他并非总可以保证阻止问题的发生。就像那些糟糕的代码组织或者是糟糕的设计的问题依然存在。使用测试让你写糟糕代码的可能性下降,从而有更强大的功能。
结论
哪种测试方案会更好,这彻底取决于我的。一个知道如何写优秀的TDD测试的人可能和另外一个写优秀的BDD测试的人所写出代码的bug同样少。若是你发现你本身使用TDD写了不完整的测试,并但愿设计更好的软件,那么不妨使用下BDD。若是你是一个学习TDD和BDD的新手,我建议你先学习TDD。这两种风格最重要的部分就是强制你写你代码的测试样例。若是你从不测试你的代码,你会须要他们的。
我不是一个研究TDD和BDD的专家。我只是知道他们之间的一点区别,并研究了如下。再次说明,文中的代码位于:https://github.com/jdavis/tdd-vs-bdd。
若是您对这篇文章有建议或错误改正。或者只是提出你的不一样意的观点,我很乐意听到这一切。请随时与我联系。感谢您的阅读!
原文连接:
https://joshldavis.com/2013/05/27/difference-between-tdd-and-bdd/