验收测试驱动开发包含哪四步_验收测试驱动开发

验收测试驱动开发包含哪四步

在这个简短的关于验收测试的系列文章中,我之前写过关于测试人员和开发人员之间的协作以及验收测试如何帮助定义系统的明确要求的文章。

上一篇文章是理论上的,现在让我们看看在开发过程中将验收测试作为一种实践。 我更喜欢使用验收测试驱动开发或ATDD。

简而言之

使用ATDD,您可以使用验收测试来指导功能的实现路径。 您编写了失败的测试方案和所需的粘合代码。 当方案失败并显示正确的消息(即测试工具可以运行验收测试并且消息正确描述缺少的功能)时,您便开始实施该功能。

就像在TDD中一样,使用最简单的方法来使场景通过,但要在功能级别上进行。 在TDD中,您将以最简单的方式通过测试,然后从那里进行改进。 在ATDD中,您只需以最简单的方式来实现该功能即可通过该方案。 简而言之,如果您具有正确的场景集,则该功能将在最后一个场景通过时实现。

[请注意,我故意选择不使用完成(done)一词,因为在实现该功能后,我们经常需要摆弄UI些。

示例问题

例如,我们将使用ATDD为Harry Potter图书销售kata建立购物车。 客户根据所购买系列书籍的数量获得折扣。 此练习摘自Coding Dojo网站上的kata列表。 有关完整说明,请阅读: http : //codingdojo.org/cgi-bin/wiki.pl?KataPotter

《哈利·波特》系列的前五本书正在发售中。 任何一本书的售价为8美元。 如果您购买该系列中的两本不同的书,您将获得5%的折扣;如果您购买三本不同的书,您将获得10%的折扣;如果您购买四本不同的书,您的折扣将为20%;如果您购买全部五本,您将获得5%折扣。 25%的折扣。

让我们配对并一起构建此功能。

讨论和提炼

构建新功能的周期分为几个阶段。 在考虑编写生产代码之前,我们必须先了解一些场景。 还记得上一篇文章中我们如何谈论与业务专家的团队会议吗? 这些活动构成了开发周期的第一阶段:讨论和提炼。

我们的团队安排了与业务专家的会议,讨论购物车。 我们已经准备了一些问题,因此这次会议非常有效。 我们的团队比在这次会议上讨论技术细节更了解。 我们不想浪费任何业务专家的宝贵时间。 在会议结束时,我们记下了描述购物车行为的示例。 为了清楚起见,我们决定使用罗马数字列出这些书。

一世 II 三级 IV V $
1个 1 * 8 8.00
1个 1个 2 * 8 * 0.95 15.20
1个 1个 1个 3 * 8 * 0.9 21.60
1个 1个 1个 1个 4 * 8 * 0.8 25.60
1个 1个 1个 1个 1个 5 * 8 * 0.75 30.00
2 2 * 8 16.00
2 1个 2 * 8 * 0.95 + 1 * 8 23.20
2 2 2 1个 1个 4 * 8 * 0.8 + 4 * 8 * 0.8 51.20

这些行中的大多数几乎都是不言自明的。 最后一行显示有2套共4本书。 这可能令人惊讶,因为您期望一套5本书加一套3本书。 原因是必须为客户优化折扣。 在这种情况下,最好的折扣是购买2套4本书,因为这比5本书和3本书便宜0.40美元。

会议结束后,我们将从这些示例中提取验收测试,并将其另存为Cucumber方案。 第一个示例的方案如下:

Scenario: buy single book without discount

  When I buy 1 copy of "Harry Potter I"
  Then I must pay $8

事实证明,第二个示例的场景与第一个示例非常相似:

Scenario: buy two distinct books

  When I buy 1 copy of "Harry Potter II"
  Then I must pay $15.20

显然,其余方案可以以相同的方式添加。 但是正在出现一种模式。 仅使用不同的值就必须复制并粘贴完全相同的场景会非常繁琐和重复。 此外,如果我们也可以将与业务专家会面时得到的示例表也用于验收测试,那就太好了。 这将使我们的方案作为文档更加有用。

Cucumber提供了方案大纲功能来提供帮助。 方案大纲通过使用带有占位符的模板和示例表来更简洁地表达这些示例。 我们尝试针对前两个方案的方案大纲,然后决定使用该大纲添加其余方案。

Scenario Outline: buy discounted Harry Potter books

  When I buy <I> copies of "Harry Potter I"
  And I buy <II> copies of "Harry Potter II"
  And I buy <III> copies of "Harry Potter III"
  And I buy <IV> copies of "Harry Potter IV"
  And I buy <V> copies of "Harry Potter V"
  Then I must pay $<Total>

Examples:
  | I | II | III | IV | V | Total |
  | 1 | 0  | 0   | 0  | 0 |  8.00 |
  | 1 | 1  | 0   | 0  | 0 | 15.20 |
  | 1 | 1  | 1   | 0  | 0 | 21.60 |
  | 1 | 1  | 1   | 1  | 0 | 25.60 |
  | 1 | 1  | 1   | 1  | 1 | 30.00 |
  | 2 | 0  | 0   | 0  | 0 | 16.00 |
  | 2 | 1  | 0   | 0  | 0 | 23.20 |
  | 2 | 2  | 2   | 1  | 1 | 51.20 |

这还差不多。 使用大纲,我们的示例阅读起来就像我们之前绘制的表格一样。

显然,尽管我们已经成功地讨论了该功能以及该讨论的精炼验收方案,但在此阶段我们还没有完成。 现在,我们有一套完整的验收方案。 根据业务专家的说法,我们的方案是问题的完整表示。 方案的注释格式非常简单,业务专家可以查看它们。

现在我们的团队已准备好实施阶段。

实行

我们需要的第一件事是粘合代码,以便示例可以运行并通过合理的错误消息而失败。 幸运的是,Cucumber可以通过生成存根来帮助我们创建必要的粘合功能。 在没有胶水代码的情况下进行第一次运行后,我们可以复制并粘贴以执行挂起的步骤。

下面列出了此类针对Java生成的函数的示例。 这是Cucumber场景中单个步骤的粘合代码,也称为步骤定义。

When("^I buy (\\d+) copies of \"([^\"]*)\"$")
public void I_buy_copies_of(int arg1, String arg2) throws Throwable {
    // Express the Regexp above with the code you wish you had
    throw new PendingException();
}

现在所有步骤都待处理,我们开始执行步骤以使第一种情况失败并显示相应的消息。 为了完成这些步骤,我们需要添加一些基本的生产代码,稍后我们将通过实现对其进行增强。 这很有趣,因为此时我们希望我们的API 能够从验收测试中获得自然流。

当第一种情况失败并显示一条描述缺少的功能的消息时,我们将实施该功能。 然后,我们继续下一个,依此类推,直到所有功能通过。 我们使用TDD保持代码干净。

就本文而言,步骤定义和代码的实际实现并不那么有趣。 由于我也不想放弃这些细节,所以我做了练习,并将代码放在了Github上

评论

构建新功能的最后阶段是对其进行审查。 我不是在这里谈论代码审查,这些审查是在实施阶段进行的。

为了总结我们的新功能,我们进行了一些探索性测试。 探索性测试是通过使用自由样式来找出系统的实际工作方式。 即没有要遵循的测试脚本。 相反,测试用例是即时发明的,并立即针对系统执行。 如果您想了解有关探索性测试的更多信息,我建议您阅读Elisabeth Hendrickson的绝妙著作《 探索它》!

在审核阶段,我们会记录通过探索性测试发现的任何不一致之处。

为了完成我们的功能,我们将其演示给业务专家并收集他们的反馈。 结合探索性测试的任何结果,这对于业务专家而言是重要的输入。 只有他们才能决定系统的行为方式。

更多例子

我个人认为ATDD是整个团队工作的一种非常愉快的方式。 在拥有明确要求的好处的同时,您享受了这样一个事实,即您增长了可以(并且应该)运行每个构建的自动化回归套件。 该回归套件使团队获得了很大的信心,不必害怕在任何地方进行更改。 一旦出现问题,测试将失败,并且团队知道要解决的问题。

如果您想查看ATDD的更多示例,则应阅读ATDD by Example ,其中MarkusGärtner与您一起练习ATDD,同时解决示例问题。

参考: Software Craft博客上的JCG合作伙伴 Bart Bakker的验收测试驱动开发

翻译自: https://www.javacodegeeks.com/2014/01/acceptance-test-driven-development.html

验收测试驱动开发包含哪四步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
测试驱动的编程是 XP 困扰程序员的一个方面。对于测试驱动的编程意味着什么以及如何去做,大多数人都做出了不正确的假设。这个月,XP 方面的讲师兼 Java 开发人员 Roy Miller 谈论了测试驱动的编程是什么,它为什么可以使程序员的生产力和质量发生巨大变化,以及编写测试的原理。请在与本文相随的 论坛中提出您就本文的想法,以飨笔者和其他读者。(您也可以单击本文顶部或底部的“讨论”来访问该论坛。) 最近 50 年来,测试一直被视为项目结束时要做的事。当然,可以在项目进行之中结合测试,测试通常并不是在 所有编码工作结束后才开始,而是一般在稍后阶段进行测试。然而,XP 的提倡者建议完全逆转这个模型。作为一名程序员,应该在编写代码 之前编写测试,然后只编写足以让测试通过的代码即可。这样做将有助于使您的系统尽可能的简单。 先编写测试 XP 涉及两种测试: 程序员测试和 客户测试。测试驱动的编程(也称为 测试为先编程)最常指第一种测试,至少我使用这个术语时是这样。测试驱动的编程是让 程序员测试(即单元测试 ― 重申一下,只是换用一个术语)决定您所编写的代码。这意味着您必须在编写代码之前进行测试。测试指出您 需要编写的代码,从而也 决定了您要编写的代码。您只需编写足够通过测试的代码即可 ― 不用多,也不用少。XP 规则很简单:如果不进行程序员测试,则您不知道要编写什么代码,所以您不会去编写任何代码。 测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。本文从开发人员使用的角度,介绍了 TDD 优势、原理、过程、原则、测试技术、Tips 等方面。 背景 一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦。国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从。最近兴起的一些软件开发过程相关的技术,提供一些比较高效、实用的软件过程开发方法。其中比较基础、关键的一个技术就是测试驱动开发(Test-Driven Development)。虽然TDD光大于极限编程,但测试驱动开发完全可以单独应用。下面就从开发人员使用的角度进行介绍,使开发人员用最少的代价尽快理解、掌握、应用这种技术。下面分优势,原理,过程,原则,测试技术,Tips等方面进行讨论。 1. 优势 TDD的基本思路就是通过测试来推动整个开发的进行。而测试驱动开发技术并不只是单纯的测试工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值