【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

如何控制单元测试的粒度?

  • 2012-09-07
  • 本文字数:2078 字

    阅读完需:约 7 分钟

单元测试的粒度问题一直是软件开发社区面临的现实问题,最近,陈皓针对 StackOverflow 上的老问题做了总结,并发表了自己的看法,读者在随后的评论中也进行了讨论。

John Nolan 在《 How deep are your unit tests? 》中问道:

TDD 需要花时间写测试,而我们一般多少会写一些代码,而第一个测试是测试我的构造函数有没有把这个类的变量都设置对了,这会不会太过分了?那么,我们写单元测试的这个单元的粒度到底是什么样的?并且,是不是我们的测试测试得多了点?

最佳答案是:

老板为我的代码付报酬,而不是测试,所以,我对此的价值观是——测试越少越好,少到你对你的代码质量达到了某种自信(我觉得这种的自信标准应该要高于业内的标准,当然,这种自信也可能是种自大)。如果我的编码生涯中不会犯这种典型的错误(如:在构造函数中设了个错误的值),那我就不会测试它。我倾向于去对那些有意义的错误做测试,所以,我对一些比较复杂的条件逻辑会异常地小心。当在一个团队中,我会非常小心的测试那些会让团队容易出错的代码。

最让人意外的是,这个答案是由 XP 和 TDD 的创造者 Kent Beck 给出的! 难怪有人评论说:

只是要地球人都不会觉得 Kent Beck 会这么说啊!我们有大堆程序员在忠实的追求着 100% 的代码测试覆盖率,因为这些程序员觉得 Kent Beck 也会这么干!我告诉过很多人,你在你的 XP 的书里说过,你并不总是支持“宗教信仰式的 Test First”,但是今天 Kent 这么说,我还是很惊讶!

陈皓则是非常同意 Kent 的回答:“怎么合适怎么搞,爱怎么测试就怎么测试,只要自己和团队有信心就可以了。没有必要就一定要写测试,一定要测试先行。”

其他排名靠前的答案包括:

Dominic Rodger

为可能会出错的地方和边界情况编写单元测试。另外,单元测试应该跟着缺陷报告走,在修补缺陷之前编写好单元测试。开发人员就会对代码充满自信:一是 bug 已经修补,二是 bug 不会重现。

kitofr

关于 TDD 最大的误解之一就是第一个字母——测试(T)。这也是 BDD 出现的原因。因为大家没有真正理解第一个 D(驱动)的重要性。我们总是倾向于对测试关注更多,而对设计的驱动关注太少。我想这是一个模糊的回答,但是你应该考虑如何驱动你的代码,而不是测试什么,这是覆盖率工具该做的事情。设计是一个很大而且问题更多的问题。

最后,陈皓表达了自己的观点:

  • 目前的国内教育模式让我们习惯于标准答案,习惯于教条,从而不会思考!敏捷开发中的若干东西似乎都成了软件开发中对某种标准答案的教条,实在是悲哀!
  • 软件开发是一种脑力劳动,是一种知识密集型的工作,就像艺术作品一样,创作过程和成品是没有标准答案的。
  • 软件的质量不是测试出来的,而是设计和维护出来的。就像工匠们在一点一点地雕琢他们的作品一样。

许多读者在原文的评论中表达了自己的看法

  • 对于要做多细,我的经验就是:当我不在的时候,如果同事打电话说有 Bug,询问是否会是我的问题,而我可以很自信的回答 No 的时候,就可以啦! 所以最享受的就是大家加班,而我在放心玩乐的时刻。这让我想起了一件事情,有位同行朋友学车,一开始总想让师傅告诉他,需要“打点方向”的时候到底是多少度? 需要“加点油”的时候到底是加到每小时多少公里? 后来知道了,没人会告诉你,你得自己 Do!
  • 其实我觉得在现今大型企业的团队中, 开发人员的职责就是开发和保证代码正确的实现 至于测试则基本是交给测试的人员来做,而测试人员又拿着测试的工资,他们不会考虑开发人员的水平,而是循规蹈矩的去完成整个测试流程。
  • 关于 StackOverflow 上出现的大量排斥 TDD 的观点,我尝试这样来解释:占主流群体的底层程序员在没有监督的情况下缺乏责任心只求应付工作…到了工作岗位上也是如此,领导在不在大不一样。总结下来就是,大多数人在没有监督的情况下容易慵懒应付。这应该是人的天性。后来工厂出现的流水线,应该就是对付这种情况的。把工作流程标准化、流水线化,让整个流水线上的人都没机会偷懒。我想这也是 TDD 的目标之一。如果没有足够的测试用例,你怎么确认某个模块是功能完整的无明显缺陷的?如果原作者离职了,后来的维护者修改了先前的代码,又如何保证不影响以前的功能?要知道,你修改一个新 bug,很可能会把以前的多个旧 bug 放出来,有经验的开发者应该明白我说的什么意思。于是软件越来越难于维护,维护者也越来越排斥修改代码,一潭死水无人敢碰,软件提前寿终正寝。我最终的结论就是,TDD 要由项目管理者推动实施,而不能征求下面程序员的意见,——他们虽然人数众多,但就像面对老师的学生一样,总是要求玩耍而不是学习,这对项目本身是无益的。
  • 说白了还是看你怎么用,TDD 也只不过是个方法罢了,工具而已,又不是思想或者本质之类的。我个人开发就很不 TDD,即使需要写测试也是针对公开的接口或者某些特定的调用去做测试程序,这样的好处是达到测试代码的目的,同时又有了一个测试程序。缺点是这个测试程序不带好集成到发布过程。但换言之,好的程序员写的代码自然质量较高,差的程序员有没有单元测试一样差,甚至于无法保证差的程序员写的测试单元没有 BUG,如果有 BUG 那不是更悲剧?

InfoQ 的读者朋友对此有何自己的见解?

2012-09-07 09:375056
用户头像

发布了 501 篇内容, 共 246.5 次阅读, 收获喜欢 57 次。

关注

评论 1 条评论

发布
用户头像
莫名其妙,陈浩是谁啊?权威吗。他怎么看关我什么事?怎么 infoQ 能发这样没思想的文章。
2022-03-08 10:55
回复
没有更多了
发现更多内容

项目管理全史(持续更新)

Ian哥

28天写作

成年人最渴望的奖励就是成功 Jan 20, 2021

王泰

28天写作

Soul 网关实践 05|sofa服务&SpringCloud服务接入网关

哼干嘛

[讨论]几个能有效应对 35 岁危机的办法

穿甲兵

两万字长文总结,梳理 Java 入门进阶那些事

程序员小跃

Java redis 架构 后端 面向对象编程

交易所APP系统软件开发案例

系统开发

长文攻略|如何打造一键部署的云开发应用

binggg

小程序 大前端 全栈 开发应用 云开发

产品经理训练营第一章作业

阿波

产品经理-第一周作业

LLL777

送你一个造梦机器,然后入眠「幻想短篇 12/28」

道伟

28天写作

SpringCloud 从入门到精通 13---Nacos集群搭建

Felix

20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测

阿里巴巴云原生

人工智能 机器学习 深度学习 Serverless 云原生

张小龙关于微信十年的产品思考 | 视频号 28 天 (13)

赵新龙

28天写作

谈谈统计学正态分布阈值原理在数据分析工作中的运用

vivo互联网技术

大数据 正态分布 核心

绩效管理,上下同心者胜(四 完结篇)

一笑

管理 绩效 28天写作

透过现象看本质:Java类动态加载和热替换

华为云开发者联盟

Java JVM 插件 类加载器 热替换

花一分钟体验大数据任务调度系统 - Apache DolphinScheduler 第一个官方 Docker 镜像

代立冬

大数据 workflow 任务编排

C2C场外交易系统APP开发|C2C场外交易软件开发

系统开发

豆瓣9.5分,它是Scala领域当之无愧的王者之作!

博文视点Broadview

scala 编程语言 豆瓣高分

Soul 学习笔记---数据同步 websocket 连接建立过程分析(五)

fightingting

Soul网关

如何成为分享高手(上)

熊斌

个人成长 28天写作

时间是最大的变量

石君

时间 28天写作

详解MySQL执行事务的语法和流程

华为云开发者联盟

MySQL 数据库 事务 服务器 SQL语法

NanoDet:这是个小于4M超轻量目标检测模型

华为云开发者联盟

PyTorch 目标检测 yolo nanodet

招投标挖坑、防坑指南

浪潮云

tob 招标 投标

2020年中国DevOps应用发展研究——艾瑞咨询报告总结

禅道项目管理

DevOps 行业资讯 趋势

“数据库网络故障”愁坏了头,五种方法带你解难题

华为云开发者联盟

数据库 数据 GaussDB 网络故障 丢包

uni-app的发展和应用

anyRTC开发者

uni-app 音视频 WebRTC sdk 安卓

智汇华云 | ArcherOS Stack利旧FC-SAN存储

华云数据

存储

迟到的年度总结-数据的人生

松子(李博源)

大数据 数据中台 总结 年度总结

对容器镜像的思考和讨论

阿里巴巴云原生

Docker 容器 开发者 云原生 CloudNative

如何控制单元测试的粒度?_研发效能_崔康_InfoQ精选文章