TDD vs. BDD

若是你一直在关注最新的软件开发,你必定听过测试驱动开发(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

 

比方说,开发人员但愿写一个简单的函数来极端阶乘(这个例子很简单,但它会告诉咱们TDDBDD之间的差别)。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

TDDBDD之间作选择是比较复杂的事情。这取决于你使用的语言是否有一个合适的测试框架,你的同事们是否熟悉他等等因素。

 

有些人认为BDD总比TDD要好。由于它可以消除TDD带来的问题。

 

BDD的关键在于,他并非总可以保证阻止问题的发生。就像那些糟糕的代码组织或者是糟糕的设计的问题依然存在。使用测试让你写糟糕代码的可能性下降,从而有更强大的功能。

 

结论

哪种测试方案会更好,这彻底取决于我的。一个知道如何写优秀的TDD测试的人可能和另外一个写优秀的BDD测试的人所写出代码的bug同样少。若是你发现你本身使用TDD写了不完整的测试,并但愿设计更好的软件,那么不妨使用下BDD。若是你是一个学习TDDBDD的新手,我建议你先学习TDD。这两种风格最重要的部分就是强制你写你代码的测试样例。若是你从不测试你的代码,你会须要他们的。

 

我不是一个研究TDDBDD的专家。我只是知道他们之间的一点区别,并研究了如下。再次说明,文中的代码位于:https://github.com/jdavis/tdd-vs-bdd。

 

若是您对这篇文章有建议或错误改正。或者只是提出你的不一样意的观点,我很乐意听到这一切。请随时与我联系。感谢您的阅读!

 

原文连接:

https://joshldavis.com/2013/05/27/difference-between-tdd-and-bdd/

相关文章
相关标签/搜索