速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

观点:测试驱动的开发从根本上是错误的

  • 2019-11-11
  • 本文字数:1416 字

    阅读完需:约 5 分钟

观点:测试驱动的开发从根本上是错误的

这听起来太绝对,但确实是这样。


事件起因

2008 年,我为 Windows 7 任务栏写了一个扩展插件,最后的应用程序非常小,只有几页代码。完成后,我接到指示,要为这个应用程序写单元测试,这么做只是为了能让经理检查打分。我拒绝了,因为这个项目实在太小了,根本不需要单元测试。而且,为了添加这些愚蠢的测试把应用程序拆成几个部分,意味着使本来已经通过了测试并准备发布的应用程序变得不稳定。


随着这次沟通逐渐无法进行,经理告诉了我一些话,即所谓的“测试驱动开发”,这时,我下决心要结束这场谈话,因为这是我第一次听到这样不合理的说辞:


当测试全部通过,你就完成了任务。


我遇见的每一个TDD(Test Driven Development)宣传者都会一字一句地重复上面这句话。

测试什么时候写?

当时的我已经有了 20 多年的软件开发经验,我第一次意识到明显的缺陷所在,编码前就写测试需要记住一点:在与敌人的接触中,没有任何战争计划能够幸存。我工作过的大部分地方都认为软件计划是在浪费时间,他们最多也就是走走流程。


在微软,我好几次因为在软件开发中做了周全的规划而受到惩罚,特别是在写威胁模型时。但是,我总是从需求功能规范开始规划工作,我拒绝了一些潜在客户,他们不愿意在编码前花时间做软件设计。


但是,即使是最周全的计划也会在编码实现后出现非预期的紧急事件,即便在若干小时内不会出现,也会在数天内出现。客户们的设计总是比他们认为的更加模糊不清,即使是我竭尽全力,也会有一开始想不到的事情发生。


所以,如果采用 TDD 架构,我就得不断地查看测试,审核所有测试项,确保它们满足我在项目里的新发现。而如果在工作结束时,或者快要结束时编写测试,测试项就会包含编码时所有的新发现。所以,这些都比在编码完成后写测试合理得多。


以下是我所看到的 TDD 流程:


  1. 编写 TDD 测试

  2. 开始编码

  3. 发现非预期的事件

  4. 重写测试

  5. 继续实现

  6. 返回步骤 3 重复、重复、重复……

  7. (实际上,要多于 150 条测试)所有的测试都通过

  8. 发送到 QA 专区


假设,QA 部门因为 TDD 而没有被全部解雇。注意上面第四项,在大型项目中,重写测试可能要出现几十次,而每次重新检查 TDD 的测试项都是 100%浪费时间


传统方式更好


  1. 开始编码

  2. 发现非预期事件并修复

  3. 编码完成,编写测试并运行

  4. 修复 Bug

  5. 发送到 QA 专区


这种方法,我在有了发现之后才编写测试,因此,测试只针对最终的设计而编写,只在以下情况发生时重新审核测试:


  • QA 阶段发现 bug

  • 添加新的功能

  • 发布后发现新的 bug

问题

这里存在的问题是 TDD 假设开发者自己写测试程序,这很不合理。我见过很多开发者认为项目非常稳固,但其他人却能在一分钟内就攻破它,这是为什么?


这是因为开发人员在设计时产生的盲点也同样会出现在测试中。


有谁会写一个比 Yes-No 消息框更复杂的功能,却又不运行它呢?在编码实现之前就编写测试,并不会解决这个问题。不管是在编码前写测试还是编码后写,总有些情况是开发人员预想不到的,这些情况倒不一定是“边缘情况”。每个人的工作都需要其他人根据需求和功能规范进行黑盒测试。

结论

很多开发者可能有这样的想法:在 TDD 中重新审查测试所浪费的时间会带来更多收入,项目周期也会增加 20%到 50%,这会让收入增加 20%到 50%。但是,我认为这很不道德。坦率地说,这也十分无聊。


阅读任何有关 TDD 的宣传材料,它们都会归结到测试本身的争论,没有人会反对它,它也从不谈及在编码之前写测试的理由是什么。


原文链接:https://hackernoon.com/test-driven-development-is-fundamentally-wrong-hor3z4d


2019-11-11 08:493376
用户头像
赵钰莹 极客邦科技 总编辑

发布了 883 篇内容, 共 646.5 次阅读, 收获喜欢 2679 次。

关注

评论 2 条评论

发布
用户头像
哈哈哈,其实我觉得做开发的肯定希望TDD啊,改需求你跟测试改去,我只满足测试用例就完事了。做测试的,尼玛产品改来改去的让我也改来改去的,我不同意!!!
2019-11-28 13:48
回复
用户头像
这种TDD已死的文章看过好几篇,正方,反方的说话我也度过好多,其中不乏kent beck这样的大牛,就这篇文章来说,作者一致再纠结先写测试还是生产代码写完后再写测试的问题,这说明其思维停留在测试和编码这两方面,对于生产代码的设计(API的设计,职责的划分等等,配置初始化构建和使用等等)却只字未提,这种纠结的心里和我编了10年代码(先生产后写测试代码)后的某个向测试驱动转变的时期很像,这是种再正常不过的感觉..直到你真正跨过那到坎才能体会好与不好,而不是浅尝辄止..然后尖叫..
2019-11-12 15:32
回复
没有更多了
发现更多内容

鼎友餐饮信息总监杨山海:餐饮新增长依托数智应用,用数字化打造单店盈利模型

科创人

蓝易云:IT知识百科:什么是分布式云?

百度搜索:蓝易云

云计算 Linux 运维 云服务器 分布式云

最新中文 Keka for Mac(压缩解压工具) v1.3.3

mac大玩家j

解压缩软件 解压软件 解压缩工具

Python案例|Matplotlib库实现的数据分析

TiAmo

Python 数据挖掘 数据分析

软件开发必读!华为云软件开发生产线CodeArts深度体验指南

平平无奇爱好科技

移动端应用程序的一些测试方案和策略

QE_LAB

移动端测试

蓝易云:如何在Linux系统服务器中测试存储/磁盘I/O性能?

百度搜索:蓝易云

Linux 运维 io 磁盘

酷睿轻薄本也能运行大语言模型,英特尔推动 PC 生成式 AI 落地

E科讯

火山引擎DataLeap基于Apache Atlas自研异步消息处理框架

字节跳动数据平台

数据中台 数据治理 数据安全 数据研发 企业号 8 月 PK 榜

质效提升 | 聊聊QA与业务测试

laofo

DevOps 研发效能 持续交付 质量赋能

解决访问 Amazon S3 对象时遇到的“访问被拒绝”错误

亚马逊云科技 (Amazon Web Services)

存储

Forrester首次面向中国的开源报告:阿里云在云原生领域开源布局最全面

阿里巴巴云原生

阿里云 开源 云原生

一文了解JVM对象内存布具以及内存分配规则

java易二三

Java 程序员 JVM 计算机

资源成本降低70%!华为MetaERP资产核算的Serverless架构实践

轶天下事

首期华为云ROMA Connect《企业集成战略与华为数字化之道》高研班在东莞圆满举办

平平无奇爱好科技

Presto 设计与实现(八):Presto JDBC

冰心的小屋

数据湖 JDBC presto 设计与实现 presto jdbc

如何基于 Kubernetes 实现优质开发者平台体验?

SEAL安全

Kubernetes IdP 平台工程 内部开发者平台

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 8 月 PK 榜

开创以API为核心的数字化变革,华为云实现API全生命周期一体化协作

平平无奇爱好科技

代码随想录 Day51 - 动态规划(十二)

jjn0703

Wolfram Mathematica 13 中文激活+安装教程最新

胖墩儿不胖y

Mac软件 数学计算软件 计算工具

[小笔记] Java 线程池

java易二三

Java 程序员 线程 线程池 计算机

全套解决方案:中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!

汀丶人工智能

人工智能 自然语言处理 大语言模型

联邦学习:对“数据隐私保护”和“数据孤岛”困境的破局

vivo互联网技术

人工智能 联邦学习 数据隐私 数据安全 gdpr

SpringBoot 的优雅的接口参数验证

java易二三

Java 编程 程序员 计算机

解锁多核处理器的力量:探索数据并行化在 Java 8 Stream 中的应用

java易二三

Java 程序员 计算机

R语言之 dplyr 包

timerring

R 语言

OpenHarmony 4.0 Beta2新版本发布,邀您体验

OpenHarmony开发者

OpenHarmony

多币种挖矿dapp流动性LP令牌质押开发搭建[源码部署]

V\TG【ch3nguang】

质押挖矿 流动性挖矿

观点:测试驱动的开发从根本上是错误的_语言 & 开发_Chris Fox_InfoQ精选文章