写点什么

J.B. Rainsberger:“集成测试是个阴谋”

  • 2009-05-05
  • 本文字数:1466 字

    阅读完需:约 5 分钟

著名的敏捷和 TDD 专家 J.B. Rainsberger 开始了一系列的文章,介绍他是如何根据自己的经验得到了这个比较有争议的结论:“集成测试是个阴谋”。

J.B. 刚刚发布了系列的第一篇 ,说明了他所提到的“集成测试”的具体含义。

这里我要首先澄清一下我所说的“集成测试”的具体含义,因为在软件领域中,很多名词都有好多种不同的理解。 在我的理解中,集成测试表示那些测试结果(成功或失败)依赖于超过一个重要行为的实现正确性的测试。

我自然也希望有个更加严格的定义,不过这个定义绝大多数情况下都还不错。我的想法很简单:我不想要那些可能会因为多种多样问题而失败的测试。这些测试带来的问题要比它们能解决的还要多。

接下来,他继续解释了为什么开发人员会经常在最后写出了过多的集成测试。他给出了一个场景,其中,一位开发人员(或团队)发现了某个缺陷似乎只能通过集成测试来找到,因此得出了这样的结论——“最好在各处都提供集成测试”——以便找到这样的缺陷。

J.B. 表明了他的态度,说这个结论“完全错误”,他继续向读者演示了一个相对较严格的基于数学的检验,察看针对一个中型大小 Web 应用程序进行集成测试所要花费的代价。通过给出这些数字(“至少 10000(个测试),甚至无数多”),J.B. 描述了这些测试占用了大量的项目时间,且很多团队最终会对此种做法产生抗拒。

随后,J.B. 很快发布了系列的第二部分,《集成测试的一些隐含成本 》,其中通过一个有趣的“两个测试套件的故事”给出了他的想法。在这个故事中,一个套件运行了 6 秒钟(假定主要由对象测试组成),而另一个花费了整整 1 分钟(假定更多由集成测试组成)。

使用那个 6 秒套件的开发者在点击“运行”按钮和得到结果之间几乎没有时间浪费在等待上:

6 秒钟能做些什么呢?只能预测一下测试的结果了:要么全部通过,要么新添加的测试会失败,或者新的测试也通过了,因为在过去的 10 分钟之内你已经在代码上花费了很大力气。在这一小段时间之后,你就得到了运行的结果,那么就继续下面的工作吧。

而作为对比,那个使用 1 分钟套件的开发者则必须在点击“运行”按钮之后,再经历一个思想上的“断层”。这将引入很多额外的开销:

需要指出的是这里存在着双倍的开销。第一种开销很容易看到:我们等待测试的时间加上计算机等待我们的时间——因为很难让人在 60 秒钟之内全神贯注地盯着电脑,并在结束之后立即做出反应。这并不是什么大问题,真正的问题是由于失去耐心所带来的一系列效率下降。
……
在我编写某个(支持 TDD 测试的对象的)测试时,我很清楚我的目标,并专注于让其通过测试,随后关注如何将该对象良好地集成到系统中。这项工作存在着多次迭代,需要持续的注意力。这种关注和检查的一次次循环构造出了一种独特的节奏,并成为了开发人员保持注意力的动力。这也就是经常提及的所谓的“流”。6 秒钟的测试很容易组成这个良好的循环,而 1 分钟的测试则会打破开发人员工作的进程。

与系列第一部分的关注点不同,J.B. 在第二部分中给出了那些经常需要“一分钟测试”的开发人员的尴尬情况,以及他们可有的选择。在第一部分中,使用集成测试的开发者通常都只关心“最重要的百分之几测试用例”。

两篇文章都包含有大量的内容(文章本身以及相关评论),这里仅作出了简要总结。非常值得阅读。此外,Rainsberger 的这两篇文章似乎还仅仅是这一系列文章的开始,如果感兴趣的话,也请继续关注下去。

查看原文: http://www.infoq.com/news/2009/04/jbrains-integration-test-scam “J.B. Rainsberger: “Integration Tests Are A Scam””">J.B. Rainsberger: “Integration Tests Are A Scam”

2009-05-05 20:064009
用户头像

发布了 37 篇内容, 共 87246 次阅读, 收获喜欢 3 次。

关注

评论

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

大专的我狂刷29天“阿里内部面试笔记”最终直接斩获十七个Offer

收到请回复

Java 程序员 阿里 面试八股文 Java面试八股文

字节跳动嵌入式数据分析最佳实践

字节跳动数据平台

字节跳动 数据分析 BI 嵌入式分析 数据看板

打破底层技术瓶颈,RTC技术或成为物联网市场的强劲引擎

擎声科技

物联网 RTC sdk 实时音视频 擎声Qtt

5 分钟温故知新 RxJS 【转换操作符】

掘金安东尼

前端 函数式编程 8月月更

HPC、AI与云计算:当智能时代三叉戟在亚马逊云科技完美融合

脑极体

leetcode 303. Range Sum Query - Immutable 区域和检索 - 数组不可变(简单)

okokabcd

LeetCode 算法与数据结构

短视频源码APP开发——短视频的功能

开源直播系统源码

软件开发 直播系统源码 短视频直播系统

开源贡献者计划 2022 第二期正式启动!争做战“码”先锋!

InfoQ写作社区官方

开源 OpenHarmony 热门活动

【Java】:数组的创建、赋值、访问以及长度

翼同学

Java 学习 编程语言 分享 8月月更

HTML

武师叔

8月月更

RocksDB在大规模分布式系统应用中的经验

CnosDB

时序数据库 开源社区 CnosDB 工程师有话说 CnosDB Tech Talk

把充电宝拆了看看

Sher10ck

拆解 充电宝

头脑风暴:最长递增子序列

HelloWorld杰少

算法 LeetCode 数据结构, 8月月更

【源码解析】MyBatis结果集映射和参数绑定

小明Java问道之路

源码解析 mybatis源码 mybaits 深度 8月月更

【Django | 开发】面试招聘信息网站(快速搭建核心需求)

计算机魔术师

8月月更

openEuler代码贡献之星:麒麟软件裴建康

openEuler

开发者 成长 代码规范 openEuler 开源社区

避免 10 大 NGINX 配置错误(下)

NGINX开源社区

nginx 配置 配置分析 故障排除

新书上市 | 连载 5 年,千万读者追更,这本书讲透了通信背后的故事!

图灵教育

[极致用户体验] 网页里的「返回」应该用 history.back 还是 push ?

HullQin

CSS JavaScript html 前端 8月月更

程序员面试太卷?我选择背这份阿里最新Java面试八股文(详解版)

Java面试那些事儿

Java 面试 Java 面试 java程序员 java 编程

从函数计算到 Serverless 架构

阿里巴巴中间件

阿里云 开源 Serverless 云原生

百炼成钢 —— 声网实时网络的自动运维丨Dev for Dev 专栏

声网

Dev for Dev 自动运维

IPv6邻居发现协议详解

穿过生命散发芬芳

NDP 8月月更

微服务的拆分与设计原则

阿泽🧸

微服务 8月月更

每日一R「09」类型系统(三)

Samson

8月月更 ​Rust

个推TechDay直播预告 | 8月24日晚19:30,实时数仓搭建保姆级教程开课

个推

数据仓库 实时数仓 Flink 平台

深度学习公式推导(3):初探神经网络

老崔说架构

开源一夏 | Node.js实战对于Buffer和Stream模块系统的深入剖析

恒山其若陋兮

开源 8月月更

ABAP工作进程对数据库表读取操作的检测

汪子熙

数据库 SAP abap Netweaver 8月月更

关于 SAP ABAP 字符变量和字符串变量字符个数的一个知识点

汪子熙

字符串 SAP abap Netweaver 8月月更

C语言基本的窗口开发

计算机魔术师

8月月更

J.B. Rainsberger:“集成测试是个阴谋”_Java_Mike Bria_InfoQ精选文章