写点什么

测试驱动开发与行为驱动开发中的测试先行方法

  • 2016-01-28
  • 本文字数:2833 字

    阅读完需:约 9 分钟

Gil Zilberfeld 将在 Agile Practitioners 会议上举办小型研讨会,讨论测试先行(test first)方法,测试驱动开发(TDD)和行为驱动开发(BDD)的基础。

Test-First 是一个很优秀的工具。它能促进团队内更好的理解力和生产力。其结果是高质量的代码——无论是早期成功发现 bug 还是正确实现特性方面。

Agile Practitioners 2016 会议将于 1 月 26-27 日在以色列特拉维夫举行,InfoQ 将会覆盖本次会议的新闻,Q&As 和文章。

(……)今年我们的主题是亲身实践敏捷。我们知道没有老师能够传授亲身体验,因此我们举办了很多研讨会和实用讲座,会议参加者可以亲身体验、听到和看到敏捷活动是如何在许多成功企业内实施的。

InfoQ 采访了 Zilberfeld,关于测试先行方法的优势,测试驱动开发和行为驱动开发概念,团队使用 BDD 和 TDD 的实例,以及如何在不编写任何代码的情况下探索 BDD 和 TDD。

InfoQ:“测试先行”方法的优势是什么?

Zilberfeld:测试驱动开发是从 90 年代末的极限编程从业者开始的。但事实上,人们在编写代码的数十年前已经开始编写测试了。

其理念是这样的:当程序员编写代码时,他们通常在代码中解决复杂问题。但是,这种方式常常使得结果同样复杂,并且含有远远超过实际需要解决的问题(假设重要的东西已经被编码)。

这意味着需要测试更多的代码。测试有时需要改变“已经工作”的代码,这会引入风险。最终导致要么根本没有进行测试,因为没有时间测试,或者是次优的测试,因为无法覆盖我们想要覆盖的范围。

测试先行定义了工作需求。因为我们有测试形式的定义,它定义了为了解决具体问题我们需要编写什么样的代码。仅仅通过运行测试就可以非常简单地知道我们是否有可工作的功能。

这种方式会扩大测试覆盖率,因为测试成为优先开发活动,而不会被迫推到最后。

另外,编写这些测试和制定场景的时候,我们会更深入地探索问题空间,因为会出现许多问题。而在事后测试(test after)中,有时不会发生这些讨论,开发人员以他们的思维编码,而不是以解决方案的需求编码。

InfoQ:你能简单介绍一下行为驱动开发(BDD)和测试驱动开发(TDD)的概念吗?

Zilberfeld:在 TDD 和 BDD 中,你先将问题分解成多个情境,也就是例子。我们的头脑更容易专注小情境,而不善于解决大的、复杂的问题。

然后开始著名的红 - 绿 - 重构循环,就像这样:

  • 编写一个失败的情境。失败是因为编译或者因为代码不存在。无论如何,该测试是代码如何被外部模块使用的案例。
  • 努力让测试通过。重点是可工作的功能而不是形式,也就是编写最小的实现,让它通过测试。更进一步,它应该通过迄今为止我们编写的整个测试套件。
  • 改进代码。现在一切都是绿色的,使用测试安全网我们可以重写代码。如果我们破坏了什么,我们会立即知道。

将问题分解成更小的部分,然后以增量的形式开发需要的代码,并且在流程中加入急需的刹车。这有助于我们思考我们遗漏的情境,而不是“我们知道解决方案是什么样子”。

BDD 开始于 2000 年代中期,更进一步地将 TDD 推向产品空间。通过使用产品用途案例,我们可以仅仅开发情境所需的代码。我们可以专注对业务重要的情境。然后可以使用 TDD 编写实际代码。

BDD 最大的优势是沟通。如果你将“三个同伴”——业务分析师、开发人员和测试人员——集中到一个房间,讨论我们希望看到的行为案例,那么在编写代码之前,我们将会得到最好的提出和解决问题的观点。

而这就是 BDD——讨论商定的行为案例。这些案例可以写成自动化测试(但这不是要求),然后编码使测试通过,最后重构代码。

显然,BDD 情境的详细程度比更精细的 TDD 测试还要宽泛。尽管我发现在某些方面它们是相互关联的,但是在 TDD 和 BDD 情境中编写测试还是需要不同的技能。

InfoQ:你有与合作团队使用 BDD 和 TDD 的案例吗?

Zilberfeld:在 BDD 中,由谁编写情境是有区别的,但是我合作的大多数团队中,都是测试人员编写情境。这些案例的讨论通常在编写代码之前。测试人员和开发人员并行工作——测试人员专注高水平的自动化测试,开发人员专注代码和单元测试(测试优先与否)。一旦完成就会对情境进行评审。然后在某个时候对开发和测试进行集成,以确保测试通过。

BDD 和 TDD 在迭代中非常“敏捷”,这使得情境“完成”与否非常的明显。BDD 情境要么“符合”迭代,要么就是故事过于冗长。

在实现上 TDD 稍有不同。培训之后,开发人员会对等待他们的代码妥协。通常这些都是遗留代码,这与干净的测试先行代码不同。

我常开玩笑说 TDD 中最后一个 D 是纪律。因为它对测试先行的实现最重要。它与我们被教导的不同也更难,因此在看到价值之前我们需要团队的支持。这就是为什么大部分团队最终不做 TDD,勉强接受事后测试的缘故。

熬过困难的前期之后,开始清理自己的代码,添加更多的覆盖率。代码变得更加容易维护。并且从社会角度来看,新加入团队的开发人员会带着“这就是我们的工作方式”理念加入 TDD。这是一个正面的反馈循环。

InfoQ:你能给 InfoQ 读者提前透露一下 Agile Practitioners 会议上研讨会的内容吗?以及向参会者展示如何在不编写任何代码的情况下探索 BDD 和 TDD?

Zilberfeld:这次研讨会背后还有一个故事。几年前,我打算在比利时 Testing Days 会议上举办“TDD a spaceship”研讨会(我打算三月在荷兰的 Agile Testing Days 会议上举办)。它是为开发人员设计的,但是参与者都是测试人员,拥有极少的编码经验。因此研讨会变成解释测试先行的理念,并且是在没有实际编码的情况下。很自然地,我被吸引到星球大战的例子,我们交谈、做课堂笔记,并讨论了验收标准,以及如何知道故事已经完成。

那次研讨会之后,我考虑如何以一种经验的方式实现它。碰巧,我被介绍给 GIF 制作软件工具,突然之间我们有了能够帮助的工具。这是一个创建型工具,人们可以提前写电影“脚本”,构建并运行,并能够立即获得反馈。

很棒的是我们可以应用敏捷开发原则和经验。因为你所想象的电影样式跟实际结果总是会有出入,所以我们构建了一个新的版本。

另一个案例是处理遗留代码。其中一个练习是在电影中更换演员,但是因为电影已经编辑,因此我们只能在开头或者结尾添加场景。鉴于需求与代码不能分开考虑,如何更改需求与已经构建完成的代码之间的冲突这一理念就非常有启发性。

InfoQ:你同时还是 agile practitioners 会议的组织者之一,你能提前透露一下会议议程吗?

Zilberfeld:这是我们第五年举办该会议,自创立以来无论是规模还是质量都得到了提升。它被列为以色列最好的敏捷会议是因为:

我们围绕“亲身实践”主题会议。我们将有全天的专题报告、小型研讨会,甚至演讲都具有实际用途。我们旨在让人们亲身体验,然后回归工作,开始实施他们学到的内容。

我们为不同类型的参与者准备了内容——Scrum Master,测试人员,开发人员,产品经理,团队领袖等任何你能够想到的。但是,该会议不仅仅是拓宽你的角色知识。它是以一种“亲身实践”的方式让你学习别人如何做的。

查看英文原文: Test First Approaches With Test Driven Development and Behavior Driven Development

2016-01-28 18:003400
用户头像

发布了 92 篇内容, 共 27.5 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

Qt | 按钮控件的使用 QPushButton

YOLO.

qt 9月月更

小六六学Netty系列之Netty群聊

自然

Netty 网络 9月月更

上(市场篇)| 量子计算与开源软件

启科量子开发者官方号

云速ERP(WeLink认证版)上线,加速中小微企业数字化经营创新

科技云未来

行业内对低代码开发是什么看法?

优秀

低代码开发

港股交易系统解决方案/券商APP该何去何从?

软件开发大鱼V15988750073

证券 基金 港股交易系统开发 证券交易系统 港股多账户系统

揭秘 · 机器人酒店

澳鹏Appen

人工智能 nlp 语音识别 数据标注 语音标注

Java培训值不值得?

小谷哥

Qt | 按钮控件的使用 QToolButton

YOLO.

c++ qt 9月月更

启科量子出席首届量子计算产业峰

启科量子开发者官方号

量子计算与PKS信创体系首次融合,实现算力跨越

启科量子开发者官方号

下(应用篇)| 量子计算与开源软件

启科量子开发者官方号

Trending热榜关闭前,我把Github今年最火Java面试题汇总扒下来了

Java全栈架构师

Java 程序员 面试 程序人生 八股文

SpringBoot源码 | prepareEnvironment方法解析

六月的雨在InfoQ

源码 springboot 源码刨析 SpringBoot实战 9月月更

Qt | 按钮控件的使用 QRadioButton

YOLO.

c++ qt 9月月更

小六六学Netty系列之unix IO模型

自然

Netty 网络 9月月更

粤港澳大湾区第一届量子科技与产业应用研讨会在穗成功举办

启科量子开发者官方号

【荣耀开发者服务平台—百亿曝光扶持等你来】智慧服务快应用卡片接入指南(下)

荣耀开发者服务平台

前端 手机 新手指南 安卓 honor

小六六学Netty系列之Java 零拷贝

自然

Netty 网络 9月月更

java培训哪里比较好?

小谷哥

2022年应届毕业生就业率惨淡怎么办?不要错过多金的数据科学行业

雨果

数据分析师 数据科学 数据工程师

英特尔oneAPI工具大幅提升腾讯云数据库MySQL的性能

科技之家

Qt | 实现基于Qt WebEngine Widgets的网页浏览器

YOLO.

c++ qt 9月月更

云脉芯联自研RDMA技术成果公开亮相ODCC峰会

科技热闻

启科量子离子阱全系列教学模拟机多版本满足客户需求

启科量子开发者官方号

学完Java培训后有哪些就业机会呢

小谷哥

软件测试 | 测试开发 | python中的asyncio使用详解与异步协程的处理流程分析

测吧(北京)科技有限公司

软件测试 测试

Qt | 实现获取网站图标和网页缩放 QWebEngineView

YOLO.

c++ qt 9月月更

数学基础查可以参加Java培训

小谷哥

计算机网络——时延、时延带宽积

StackOverflow

计算机网络 编程‘ 9月月更

Linux云主机安全入侵排查步骤

京东科技开发者

Linux 安全 云主机 排查方法 云主机安全

测试驱动开发与行为驱动开发中的测试先行方法_研发效能_Ben Linders_InfoQ精选文章