• 为什么要行为驱动开发(BDD)

    为什么要行为驱动开发(BDD)

    行为驱动开发是一个软件工程的系列实践,能够帮助团队快速构建和交付更多价值和质量的软件产品。其和敏捷已经精益的开发实践,特别是测试驱动开发(TDD)和领域驱动开发(DDD),是一脉相承的。但是最重要的是BDD提供了一种通用的,简单的,结构化的描述语言,这种语言既可以是英语也可以是其他本地的语言,通过他能够很方便让项目成员和业务干系人非常顺畅的沟通需求,即使这些成员不懂的任何编程语言。

    请看下面的例子:

    1. Feature: Transferring money between accounts
    2. In order to manage my money more efficiently
    3. As a bank client
    4. I want to transfer funds between my accounts whenever I need to
    5. Scenario: Transferring money to a savings account
    6. Given my Current account has a balance of 1000.00
    7. And my Savings account has a balance of 2000.00
    8. When I transfer 500.00 from my Current account to my Savings account
    9. Then I should have 500.00 in my Current account
    10. And I should have 2500.00 in my Savings account
    11. Scenario: Transferring with insufficient funds
    12. Given my Current account has a balance of 1000.00
    13. And my Savings account has a balance of 2000.00
    14. When I transfer 1500.00 from my Current account to my Savings account
    15. Then I should receive an "insufficient funds" error
    16. Then I should have 1000.00 in my Current account
    17. And I should have 2000.00 in my Savings account

    上面其实就叫Feature(剧本)文件,其遵循的Gherkin(剧本语法)标准。

    这种剧本文件,客户、项目经理、业务分析师,QA都能看懂,因为其就是一个故事点或者需求点。而且通过特定的工具,比如Cucumber,或CukeTest等工具,能够把其自动转换成为代码。开发人员根据自动生成的代码,断言一些预期的行为,并根据这些行为,完成相应的代码实现。这样的自动化脚本,为一个项目中的各个人员了解项目的需求,实现提供了一个很好的交互桥梁。下面是其一个交互的过程:

    为什么要行为驱动测试 - 图1

    如果是传统的方式,其交互方式,应该是:

    为什么要行为驱动测试 - 图2

    通过对比,可以发现BDD的这种方式,把用户或者客户真正的通过Feature文件联系在一起了,其沟通是顺畅的,各个角色,包括QA,BA,开发,测试,客户,用户可以通过这一媒介,进行高效无障碍的沟通,而不是像传统的方式,通过BA进行二次转达,从而丢失了很多重要的需求。 由此可见,其BDD的好处如下:

    • 减少浪费
    • 节省成本
    • 容易并且安全的适应变化
    • 因为少了中间的转达环节,从而能够快速交付产品

    下面看一个简单的例子:

    为什么要行为驱动测试 - 图3

    从上图可以看出,当一个需求过来的时候,先通过项目干系人都能理解的Feature文件,描述项目的User Story,有的里面还有详细生动的数据示例(example),从而能够让所有的人更加容易理解其需求,比如:

    1. Scenario Outline: Earning interest
    2. Given I have an account of type <account-type> with a balance of <initial-balance>
    3. When the monthly interest is calculated
    4. Then I should have earned at an annual interest rate of <interest-rate>
    5. And I should have a new balance of <new-balance>
    6. Example:
    7. | initial-balance | account-type | interest-rate | new-balance |
    8. | 10000 | current | 1 | 10008.33 |
    9. | 10000 | savings | 3 | 10025 |
    10. | 10000 | supersaver | 5 | 10041.67 |

    通过上面的示例表(example)的表格可以更加容易的理解当前用例的意图了。当Feature和Example文件都完成后,借助于第三方的开源框架实现,比如Cucumber,jBehave,SpecFlow等把Feature和Example转换成代码,然后通过底层次的单元测试框架,比如JUnit,NUnit,Spock,RSpec,结合测试驱动开发,从而把业务代码的逻辑实现。实现一举多得。