写点什么

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

  • 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:003411
用户头像

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

关注

评论

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

我还不懂什么是分布式事务

好好学习,天天向上

Java MySQL spring 分布式 事务

可视化开发:前端按时下班不再是问题

华为云开发者联盟

大前端 框架 交互 渲染引擎

Kafka、RabbitMQ、RocketMQ 之间的区别是什么 ?

AI乔治

Java kafka 架构 消息队列

书单|互联网企业面试案头书之数据分析师篇

博文视点Broadview

局域网服务器访问外网方案

程序员与厨子

Linux 网络 路由表

缓存不一致、缓存雪崩、缓存击穿、缓存穿透

escray

redis 学习 极客时间 3月日更 Redis 核心技术与实战

Firebase 命令行工具

HoneyMoose

推进智能变革,HPE让零售业的数字化梦想照进现实

Lily

图片的黑魔法——GitHub 热点速览 v.21.13

HelloGitHub

GitHub 开源

科普NA公链(Nirvana):NAC公链采用基于NIO的Netty,实现链上应用百万级TPS并发​

区块链第一资讯

作业8

瑾瑾呀

记上周双休日的加班

sadhu

加班

史上最全教程:idea将Java项目打包Jar包,并生成exe可执行文件

madison

Java jar包转exe可执行文件 exe4j

Python API 类型系统的设计与演变

李宇飞

API

企业迁移到云服务时要考虑的六大问题

云计算

来,在图片上画个矩形吧,取经之旅第 14 天

梦想橡皮擦

3月日更

2020 年前端技术发展盘点

三钻

发展 大前端 组件化 机会与趋势

智慧社区服务平台的搭建,助力老旧小区改造

13828808769

智慧终端

AA

郑伟

标签

万物皆可拆

小匚

区块链农产品溯源系统开发,区块链农产品溯源平台的搭建

13828808769

区块链 区块链+ #区块链#

区块链在医疗领域的应用场景,区块链+医疗的解决方案

13828808769

区块链 区块链+ #区块链#

如何避免水肥一体化过量灌溉?开启智慧管理,一个屏幕轻松搞定

一只数据鲸鱼

物联网 数据可视化 智慧城市 智慧农业

世界首台人工智能地震监测系统问世;AAAI 2021 | 利用深度元学习对城市销量进行预测

京东科技开发者

大数据 红帽

双非怎么了

我是程序员小贱

3月日更

MySQL主从原理,基于快速学习一门技术的3种方式

博文视点Broadview

无需编程,通过配置零代码生成CRUD RESTful API

crudapi

RESTful 低代码 API crud crudapi

华为云副总裁薛浩:云原生视频服务,重塑体验,助力产业升级

华为云开发者联盟

云原生 音视频 视频 华为云 AR/VR

从相识到相惜:Redis与计算存储分离四部曲

华为云开发者联盟

数据库 redis 华为云 存算分离 GaussDB ( for Redis )

工作四年,分享50个让你代码更好的小建议

比伯

Java 程序员 架构 程序人生 计算机

PS 进行隐藏图制作

空城机

PhotoShop ps 视觉处理 视觉 隐藏图

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