TDD和BDD的区别 (TDD vs BDD)

前言

如果你关注软件开发最佳实践方面的话题,你肯定听说过测试驱动开发(TDD - Test Driven Development) 和行为驱动开发(BDD - Behavior Driven Development)。这篇文章会为你阐述这两种模式的含义并举例,同时对二者进行比较。

测试驱动开发 (TDD)

当我第一次听到TDD这个词,从字面上理解,觉得很简单,就是用于驱动软件开发的测试。

这没有错,如果对TDD作进一步的解释,这个过程可以进一步分解为5个步骤:

  1. 首先,开发者在码业务前写一些测试用例
  2. 运行这些测试用例。结果肯定是运行失败,因为测试用例中的业务逻辑还没实现嘛
  3. 开发者实现测试用例中的业务逻辑
  4. 再运行测试用例, 如果开发者代码能力不错,这些测试用例应该可以跑通了(pass)
  5. 对业务代码及时重构,包括增加注释,清理重复等。因为没人比开发者自己更了解哪些代码会对哪些部分造成影响从而导致测试失败(fail)

当需要开发新需求新功能时,重复上述步骤。流程如下图所示:

在这里插入图片描述

TDD举例

我们通过举例来了解一下如何实践TDD。例子中的代码可以从github上获取tdd-vs-bdd。将代码clone下来,执行命令npm install && grunt

假设我们想写一个计算阶乘的函数(这是一个很刻意的例子,但是这个例子对我们指出TDD和BDD的区别很有帮助)。TDD的常用方式是运行某函数,然后断言结果满足某个值

在阶乘的例子中,我们使用的javascript测试框架是Mocha。废话不说,上代码:

var assert = require('assert'),
    factorial = require('../index');

suite('Test', function (){
    setup(function (){
        // Create any objects that we might need
    });

    suite('#factorial()', function (){
        test('equals 1 for sets of zero length', function (){
            assert.equal(1, factorial(0));
        });

        test('equals 1 for sets of length one', function (){
            assert.equal(1, factorial(1));
        });

        test('equals 2 for sets of length 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);
    };
    

    现在我们再次运行测试用例,所有的case都跑通了! 这就是TDD的使用方式。

我们接着来学习BDD,看它与TDD有什么不同。

行为驱动开发 (BDD)

BDD是什么? 很多人都会感到很模糊。 有人说它与TDD类似,有人说它是对TDD做了扩展。

抛开晦涩的定义,我们只需要记住一点:BDD旨在消除TDD过程中可能造成的问题

与TDD相比,BDD是通过编写行为和规范来驱动软件开发。 行为和规范可能看起来与测试非常相似,但是它们之间却有着微妙但重要的区别。

BDD举例

我们还以讲解TDD中用到的阶乘函数为例:

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', function (){
            factorial(3).should.equal(6);
        });
    });

    after(function () {
        // Anything after the tests have finished
    });
});

看出TDD和BDD的区别了吗?其实就是措辞。BDD的描述采用了更加’繁琐’的描述风格,阅读BDD的测试用例就像是阅读一篇文档。

这正是为什么我说BDD旨在消除TDD过程中可能造成的问题的原因所在。BDD赋予的这种像阅读句子一样阅读测试的能力有助于带来对测试认知上的转变,有助于我们去考虑如何更好写测试。当你可以流畅的阅读自己写的测试,你自然可以写出更好更全面的测试用例。

尽管上面的举例非常简单,当我们可以看出:BDD更注重功能本身而非单纯的测试用例运行结果。这也是我们经常听到的一句关于BDD本质的另外一种表达方式:BDD帮助开发人员设计(design)软件,TDD帮助开发人员测试(test)软件

TDD vs BDD

在TDD和BDD之间做选择不是件容易的事。这取决于开发者使用的语言是否有合适的测试框架,小组的同学们是否适应对应框架的用法等等。

有人总是声称BDD优于TDD,因为BDD有助于消除TDD开发中可能产生的问题(issue)。

BDD可能有助于防止问题,但并不能保证消除所有问题。一些由糟糕的代码结构,不好的编程实践引发的问题不可能通过BDD就可以消除的。只是如果开发者BDD测试写的很糟糕,那基本上也不可能开发出健壮的功能。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: BDD (Behavior-Driven Development) 是一种软件开发方法,旨在通过对软件行为的描述来指导开发过程。它是测试驱动开发(TDD)的一种变体,旨在更加关注软件的实际行为,而不是细节实现。 在 BDD 中,开发人员与业务利益相关者(如客户或产品经理)合作,共同编写预期软件行为的描述。这些描述称为用例,通常以类似自然语言的方式书写。每个用例都包含了输入、期望的输出、和预期的结果。 JavaScript BDD 就是使用 JavaScript 编写 BDD 用例的方法。常用的 JavaScript BDD 框架有 Mocha 和 Jasmine。 Mocha 是一个流行的 JavaScript BDD 框架,提供了一个简单的测试接口,可以在多种 JavaScript 环境中使用。Jasmine 是另一个流行的 JavaScript BDD 框架,提供了一个简单的、可扩展的测试接口。 使用 JavaScript BDD 框架编写用例的流程通常如下: 1. 安装所需的框架(如 Mocha 或 Jasmine) 2. 编写一个或多个测试套件(test suite),每个测试套件包含一组相关的测试 3. 在每个测试套件中编写测试用例(test case) 4. 运行测试套件,并查看测试 ### 回答2: JavaScript BDD(行为驱动开发)是一种软件开发方法,旨在通过关注应用程序的行为和用户需求来开发高质量的JavaScript代码。 BDD的核心原则是将开发的重点从代码本身转移到应用程序的行为上。在JavaScript中,BDD的实践包括使用行为描述语言(例如Cucumber或Jasmine)来编写可读性强的测试用例。通过这些测试用例,开发者可以更清晰地定义函数或模块的预期行为,并确保它们在不同的情况下正确工作。 在JavaScript中,BDD的好处不仅仅体现在测试方面。由于BDD注重应用程序的行为和用户需求,它提供了一种更直观、可读性更强的代码编写方式。通过使用描述性的测试用例和行为描述语言,开发人员可以更好地理解应用程序的功能,并确保代码与预期行为保持一致。 此外,BDD还加强了开发团队内的沟通和协作。开发者通过共同编写并讨论测试用例,可以更好地理解应用程序的需求和行为。这种沟通和协作减少了误解和错误的可能性,并提高了团队的效率和代码质量。 总之,JavaScript BDD是一种通过关注应用程序的行为和用户需求来开发高质量代码的方法。它通过使用描述性的测试用例和行为描述语言,提供了一种更直观、可读性更强的代码编写方式。此外,BDD还加强了开发团队的沟通和协作,有助于提高团队的效率和代码质量。 ### 回答3: JavaScript BDD(行为驱动开发)是一种使用JavaScript编写自动化测试的开发方法。它结合了BDDTDD(测试驱动开发)的概念和方法。 BDD的核心思想是从业务需求和用户行为出发,将测试用例以自然语言的方式表达出来,然后根据这些用例来编写代码。JavaScript BDD可以使用一些专门的框架,如Jasmine、Mocha或Cucumber.js来实现。 在JavaScript BDD中,我们首先对应用程序的行为进行建模,然后将这些行为转化为测试用例。这些测试用例使用描述性的语法来描述期望的行为和结果。然后,我们使用JavaScript编写测试代码来验证这些期望。这种描述性的语法对于团队中的非开发人员也非常友好,因为他们可以更容易地理解和参与测试。 JavaScript BDD中的测试代码主要使用断言语句来比较实际结果与期望结果。这些测试代码可以在浏览器端或服务器端运行,以验证应用程序在各种情况下的行为是否符合预期。 通过使用JavaScript BDD,开发团队可以更准确地了解和满足用户需求,因为测试用例是直接基于用户行为进行设计的。此外,由于测试用例是以自然语言的形式编写,非开发人员更容易理解和验证这些测试用例。 总之,JavaScript BDD是一种结合了BDDTDD思想的开发方法,利用描述性的语法和自然语言来编写测试用例,以验证应用程序的行为是否符合预期。使用JavaScript BDD可以帮助开发团队更好地理解和满足用户需求,从而提高软件质量和开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值