《Cucumber:行为驱动开发指南》——1.2 行为驱动开发

本节书摘来自异步社区《Cucumber:行为驱动开发指南》一书中的第1章,第1.2节,作者:【英】Matt Wynne , 【挪】Aslak Hellesy著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.2 行为驱动开发

行为驱动开发(Behaviour-Driven Development,BDD)1建立于测试驱动开发的基础之上,它标准化了那些优秀TDD实践者的良好习惯。优秀的TDD实践者以自外向内的方式开发软件,最初他们会编写一个失败的客户验收测试,该测试从客户的视角描述系统的行为。作为BDD实践者,我们细心编写验收测试,作为所有团队成员都能读懂的实例。我们使用这个编写实例的过程来获取业务人员的反馈,以便在开始实现软件之前,我们就知道自己是否是在编写正确的软件。在此过程中,我们会主动开发一种共享的通用语言(ubiquitous language)来描述和讨论我们开发的系统。

1.2.1 通用语言
正如Eric Evans在他的《领域驱动设计》[Eva03]一书中所描述的,很多软件项目都受过团队中领域专家和开发人员之间低质量沟通之苦:

“如果一个项目中的语言是支离破碎的,那么这个项目就面临着严重的问题。领域专家使用他们的行话,技术团队成员则拥有自己的、专门从设计角度讨论领域的语言……由于这种语言方面的分歧,领域专家描述他们的需求的时候非常模糊。开发人员努力尝试理解一个全新的领域,却只能得到模糊的结果。”

通过整个团队的自觉努力,项目涉及的所有人都能理解和使用的一款通用语言就会出现。如果整个团队在所有交谈、文档及代码中一致地使用这种语言,就不需要再花精力去翻译各自的不同方言,理解错误的概率也因此大大地降低了。

Cucumber为存在语言分歧的双方提供了可以会合的场所,从而促进了通用语言的发现和使用。Cucumber测试直接与开发人员的代码交互,同时它们又是用一种利益相关人能够理解的中间语言编写的。通过一起编写测试的方式,即协作描述(specifying collaboratively),团队成员不仅确定了下一步要实现的行为,也学会了怎样用一种大家都能理解的通用语言描述这种行为。

如果我们在开发开始之前就编写验收测试,就可以在错误的理解渗入代码之前发现并消灭它们。

1.2.2 实例
Cucumber之所以能从大量的测试工具中脱颖而出,是因为它在设计时有一点非常明确,就是确保团队中的任何人都能够很容易地阅读或编写验收测试。这符合验收测试的本质——作为一种交流和协作的工具。Cucumber测试的易读性把利益相关人吸引到协作过程中来,帮助大家探索并真正理解他们的需求。

下面是一个Cucumber验收测试的实例:

Feature: Sign up

 Sign up should be quick and friendly. 

 Scenario: Successful sign up

  New users should get a confirmation email and be greeted
  personally by the site once signed in.

  Given I have chosen to sign up

  When I sign up with valid details
  Then I should receive a confirmation email
  And I should see a personalized greeting message

 Scenario: Duplicate email

  Where someone tries to create an account for an email address
  that already exists.

  Given I have chosen to sign up
  But I enter an email address that has already registered 
  Then I should be told that the email is already registered 
  And I should be offered the option to recover my password

注意测试是如何描述为特定场景下我们期望的系统行为的实例(example)的。类似的实例能够强有力地帮助人们在系统被构建之前就将其形象化,效果通常超出大家的预期。任何团队成员都能阅读这样的测试,然后说出该测试是否反映了他对系统行为的理解,这样的测试也许还会激发他们进一步的思考,从而发现其他你未曾考虑的场景。Gojko Adzic的《实例化需求》一书包含了很多这方面的案例研究,案例中涉及的团队发现了实例的优点并将其充分利用。

以这种风格编写的验收测试已经不仅仅是测试了,它们是可执行的规格说明(executable specification)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者: [英]Matt Wynne / [挪]Aslak Hellesy 出版社: 人民邮电出版社 原作名: The Cucumber Book:Behaviour-Driven Development for Testers and Developers 译者: 许晓斌 / 王江平 这是一本半技术书籍,虽然是测试使用,但阅读它实在也需要一定的代码基础,所以可见,测试的技术含量越来越高了:D 由于本人使用Java,所以忽略了12章以后的内容,由于它所使用到的那些框架都是基于Ruby。 本书分为3部分: 1. 基础 2. 进阶 3. 应用 在第一部分,基础篇中,介绍了Gherkin语法,Cucumber的产生背景与适用范围,以及常见问题与解答。 Cucumber是一种系统行为的描述文件,它是活文档,应该时刻描述当前系统的正确行为,并且能够自动测试。 这一特性事实上也要求在写Cu..ber文件时,务必做到用户精准,不要重复场景,用书上的话来讲,就是同一句话,对且只对应系统中的唯一的一个行为。 Cu..ber主要用于在团队中进行沟通,语言必须能通用,要通用就要求隐藏技术细节,以自然语言去描述系统的行为,最经典的场景如: Given ... When ... Then ... 给定一定场景,当做什么操作时,会产生什么样的结果。 表格的使用,Backgroud关键字都是为了让特性文件能更简洁,也更易懂和富有表现力。 第二部分进阶篇中,介绍了一些高级的功能,比如: 钩子和标签 钩子是指 @Before @After 这种加上实现方法之前,在测试开始时和结束后执行一些特定的操作。Cu...ber的步骤是全局的,同理,@Be..这类钩子也是全局的,Cu...ber的全局是大有深意的,因为它认为,特性中的所有有用步骤,只能对应一种系统的行为。若需要让其支持单个场景,则需要对在钩子后面加上标签的方式。 标签同钩子形式相同,可以在场景和特性关键词上加标签。 对于特性(Feature)的标签,会加在每个场景上。 Cu...ber可以对一组标签进行测试。 Cu...ber测试中(可以推而广之到任何测试中),凡是有数据库参与,需要在测试之前保证数据库是干净的,并且当前测试不会遗留下数据影响到下一个测试。可以使用事务和Truncate的方式来保证这点,实际上,只要测试环节所需要的数据都由Given中提供,则不会有问题。 第三部分讲应用 ,基本上都是基于Ruby的一些库,但11章的命令行使用方式还是很有意义的, Cu...ber本身就是一个命令行工具,通过命令行,可以对特性文件进行一些过滤,对输出格式进行定制,以及集成到持续集成中。 命令行命令可以使用帮助:--help 一些重要的命令: --tags 过滤标签 --lines 指定行执行 xxx.feature:45 指定行的另一种形式 --format 格式化输出 如果真能把 Cucumber 用起来,用严肃的态度对待每一个步骤,以测试驱动开发,做出来的项目质量应该能大上一个台阶的,是个很好的工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值