我讨厌单元测试:滕振宇谈如何进行单元测试

阿里巴巴编码规范习题 因为工作需要,公司组里要求考阿里巴巴编程规范,于是我花了一天的时间看了一遍,然后刷了一些题,终于在第三次的时候考过了。考试是基于《阿里巴巴Java开发手册》,一共50道题目,包括多选和单选,题目都是选择题。目前阿里云编程规范是出到V1.5.0华山版了,好的代码规范能减少很多不必要的问题。 《阿里巴巴Java开发手册》分为:编程规约、异常日志、单元测试、安全规约、MySql数据库规约、工程结构和设计规约七个维度。内容很多,分类也很细致,每条规约都写得很详细,略微复杂的规约会做说明解释。考试难度不大,... 阅读详情

(本文首发于InfoQ中文站:http://www.infoq.com/cn/news/2012/02/I-Hate-Unit-Test)

说起单元测试的好处相信大家都能列举出不少,可是很多时候,开发人员面对自己产品的代码,想写单元测试却无从下手,久而久之,便会有人大喊:“我讨厌单元测试。”资深敏捷咨询师腾振宇(Daniel Teng)在GTUG-TopGeek开发工程管理沙龙就以此为题,结合最近的一个项目,和大家分享了他对单元测试的一些看法。

Daniel先介绍了下最近的一个项目,虽然不是遗留系统,但代码已经惨不忍睹,而且缺乏必要的测试保障,要修改代码可谓举步维艰。例如,一段代码和结对伙伴读了半小时没读懂,找来原作者看着注释又想了10分钟,终于才搞明白这段代码是做什么的。根据二八原则,先找到那20%的点,修改它带来80%的价值。最直接的做法就是寻找代码库里最常被修改的文件,一般的文件只有几次修改,有的文件则被修改了几十次,每个人都在往复杂的代码里加入新的东西,但没有人往里面加测试,于是第一步就是为它增加测试。

很多开发者会说老项目就算了,如果新启动一个项目,我就会写单元测试了,Daniel认为这是一个“美好的梦想”,很多原因会打破它:

  • 代码已经很烂了,又没办法下手了
  • UI不好测
  • 认为这是QA的工作
  • 写的单元测试找不到Bug
  • 代码的外部依赖太多
  • 代码稍作修改,测试也要一并修改,太麻烦了

究其根本原因,是开发者根本不会写单元测试!满足什么标准的测试才是单元测试呢?根据《修改代码的艺术》,需要访问数据库的测试不是单元测试,需要访问网络的测试不是单元测试,需要访问文件系统的测试不是单元测试……

为了更方便地进行单元测试,业务代码应避免以下情况:

  • 存在太多条件逻辑
  • 构造函数中做的事情太多
  • 存在太多全局状态
  • 混杂了太多无关的逻辑
  • 存在太多静态方法
  • 存在过多外部依赖

例如,在代码中存在硬编码,或者是直接创建了一个数据库连接,这种做法都是比较危险的,因为在测试时没有办法“偷梁换柱”。

想要写好单元测试,学会重构是很重要的,重构的过程类似于清理厨房,虽然和做饭没太大关系,但可以让您下次做饭更方便,心情更好。可以重构的地方包括,在待测试类与其依赖之间增加一层Test Fixture;将创建逻辑与业务逻辑分开等等。重构可以采取以下策略:

  • 编写测试代码建立基本的防护网。在单元测试和功能测试之间要有取舍,如果单元测试实施成本很高,可以先加功能测试。
  • 通过增加中间层来打破依赖,不是为了去掉依赖,而是为了后续的修改以及测试的便利。
  • 将第一步中编写的功能测试换成单元测试。

最后,Daniel还为大家提了一些建议:

  • 项目里的破窗要修好,别容忍别人加新的破窗,用测试将破窗保护起来。
  • 当你离开一个地方的时候,要让它比你来的时候更整洁干净。(童子军军规)
  • 不停地重构你的代码,每次走一小步。

随后有人提问,如何评估一个单元测试的质量,用代码行覆盖率是否可行。Daniel认为没必要去追求代码行覆盖率,真正要覆盖的是逻辑,而不是代码行。通过结对编程可以减少低质量的单元测试,人都喜欢改变,但没人喜欢被改变,不要强求结对编程,让他看到好处,尝到甜头,吸引他来做结对编程,没有人喜欢落后,比如50%的人在做结对了,剩下的人自然会想尝试。

当被问及单元测试是否是必须的时候,Daniel回答这并不是必要的,而是需要进行综合的衡量,比如你的竞争对手一周前推出了一个产品,你需要在一周内完成产品研发并上线,这时可以选择写或者不写单元测试,对于没有写过单元测试的人,一开始是需要上手的成本的。

如果您也对单元测试的话题感兴趣,不妨关注腾振宇的博客和微博,也可以观看会议视频。


【chatgpt代码系列】磁导航纠偏算法推导 例如,可以根据AGV偏离路径的方向和距离,计算出需要进行的修正角度和移动距离,然后通过控制算法实现对AGV的纠偏。具体来说,磁导航AGV的行驶是通过磁场传感器感知地面磁场信号,然后根据信号的强度和方向来确定AGV的位置和方向,进而控制AGV的行驶。但是,在实际应用中,由于地面磁场信号的变化和干扰等因素,磁导航AGV可能会出现偏离路径的情况,导致行驶不稳定甚至出现误差。磁导航AGV纠偏公式是通过对AGV行驶中偏离路径的原因进行分析,结合磁导航AGV的工作原理和控制算法,推导出来的。假设AGV的目标方向为。 阅读详情

相关推荐

【开源数据集】电动车佩戴头盔检测数据集(TWHD)

佩戴头盔检测数据集VOC格式图像与标注数量各5448张

hzg19930513的博客 5165

单元测试与持续集成

敏捷开发中单元测试、持续集成是两个不可或缺的最佳实践。为此,培训中心特推出“单元测试及持续集成实战”培训班,具体事宜通知如下: 一、受众群体 1) 软件开发人员 2) 软件项目经理 3) 软件测试人员 4) EPG、QA等等 二、授课老师 由业界知名人士亲自授课: 冯老师:培训中心高级讲师,研究领域:CMMI、软件项目管理、软件质量管理等。 1、服务过多家大型软件企业。凭借外资、

中科院计算所培训中心 1375

AUTOSAR开发实战:NvM模块如何解决汽车电子中的EEPROM与Flash存储难题?

本文深入探讨了AUTOSAR中的NvM模块如何有效解决汽车电子系统中EEPROM与Flash存储的难题。通过分层架构设计,NvM模块实现了硬件抽象与统一管理,支持数据一致性检查、错误恢复等高级功能,显著提升了存储可靠性和耐久性。文章结合实战案例,详细解析了NvM的核心机制及工程优化方案,为汽车电子开发者提供宝贵参考。

e3f4g5的博客 564

阿里巴巴Java开发手册之单元测试

好的单元测试必须遵守AIR原则。 单元测试在线上运行时,感觉像空气(AIR)一样并不存在,但在测试质量的保障方面,它却是非常关键的。从宏观上来说,好的单元测试具有自动化、独立性、可重复执行的特点。 单元测试应该是全自动执行的,并且是非交互式的。测试用例通常是被定期执行的,执行过程必须完全自动化才有意义。需要人工检查输出结果的测试不是一个好的单元测试,单元测试中不准出现System.out进行人肉...

qq_37745636的博客 797

AIGC实战:用ComfyUI和Lora微调打造专属原神角色(含完整工作流)

本文详细介绍了如何利用ComfyUI和Lora微调技术打造专属原神风格角色,涵盖从环境配置、数据集准备到工作流构建和Lora训练的全过程。通过模块化节点设计和高级控制技术,创作者可实现高度个性化的AIGC艺术创作,提升二次元角色生成的效率与质量。

weixin_29185199的博客 348

RK-XCKU5P RoCEv2 传感器桥工程分析报告

烧入后这块 FPGA 就是一个固定身份(CA:FE:C0:FF:EE:00 / 192.168.0.2 / 无 FEC 100G)的RoCEv2 UC 端点,每秒在 UDP 12267 广播自报家门;对端 CX5 只要关 FEC、配 192.168.0.101 +MTU 4200,就能 ping 通它、用 UDP 8192 读写它的全部寄存器、再按"ECB 旁路交换 QPN/rkey"的方式建立 UC RDMA 通道收发数据。

eloudy的专栏 244

阿里巴巴Java开发手册之异常日志、单元测试和安全规约

文章目录异常日志异常处理日志规约单元测试安全规约 异常日志 异常处理 【强制】Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避,而不应该 通过catch 来处理,比如:IndexOutOfBoundsException,NullPointerException等等。 说明:无法通过预检查的异常除外,如在解析一个外部传来的字符串形式数字时,通过 catch...

Jason王祖龙 561

《网络信息制作与发布》实训全流程:从专题策划、网站构建到前端实现与上线发布

本文详细介绍了WEB设计专题网站从策划到发布的全流程。主要内容包括:1.网络专题设计(确定主题、编写策划方案、素材搜集整理);2.网站结构构建(设计二级栏目、绘制布局图);3.艺术设计(配色方案、版式设计);4.网页制作(使用Dreamweaver进行标准化布局);5.信息发布(通过Dreamweaver和CuteFTP上传文件、网站维护与备份)。以"学习WEB设计"专题为例,采用框架结构,包含20余个栏目,使用深灰和蓝色为主色调。文章提供了完整的操作步骤和技术要点,适用于网站开发学习者

深耕计算机专业知识与技术。 1532

滕振宇谈如何进行单元测试

说起单元测试的好处相信大家都能列举出不少,可是很多时候,开发人员面对自己产品的代码,想写单元测试却无从下手,久而久之,便会有人大喊:“我讨厌单元测试。”资深敏捷咨询师腾振宇(Daniel Teng)在GTUG-TopGeek开发工程管理沙龙就以此为题,结合最近的一个项目,和大家分享了他对单元测试的一些看法。 Daniel先介绍了下最近的一个项目,虽然不是遗留系统,但代码已经惨不忍睹,而且缺乏

王新友的博客 1266

YOLOv13改进策略【特征提取层】| CVPR-2024 PKI Module 获取多尺度纹理特征,适应尺度变化大的目标

PKI Module是。

Limiiiing的博客 275

假新闻检测论文分享(30)MMDFND: Multi-modal Multi-Domain Fake News Detection

现有的假新闻检测方法通常集中在单一领域的新闻上,如健康或政治。然而,社交媒体上的新闻往往来自多个领域,这给单一领域的假新闻检测方法带来了两个主要挑战:数据稀缺性:处理较小、单一领域的新闻数据集时,由于训练数据的稀缺,模型的有效性显著下降。跨领域检测的准确性下降:单一领域的假新闻检测方法在跨领域新闻数据集上的准确性大幅降低。缓解领域间模态语义偏差:通过DPLE网络提取跨领域和领域特定的知识,缓解了不同领域间文本和图像的语义差异。

weixin_41964296的博客 668

敏捷无它,唯持续改进

这个案例发生在我曾经所在的C公司,我是两进两出这个公司,这个案例主要是讲述我第二次进这个公司后一年之中所发生的一些事情,以及我的一些思考。 那一年,距离公司引入Scrum已经将近3年,喧嚣过后,Scrum和敏捷何去何从?公司经过3年变得敏捷了吗?敏捷的本质又是什么?

博文视点(北京)官方博客 2448

openclaw : 无法将“openclaw”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

本文主要介绍了openclaw : 无法将“openclaw”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

Agile框架

组件互调 框架地址:https://github.com/nandy007/project_h5 路由部分 { path: ‘/hllr’, component: HLLRPage, //设置缓存 cache:true, }, static get tag(){ return ‘hllr’; } 页面一跳转,并重新加载组件 router.go({path: ‘/selectman’, isFor...

旧事酒浓丶热茶 795

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

参加Scrum中文网8月26-27日CSM课收获

软件开发从2000年之后开始流行一种新的开发模式,本人也是关注这类的书籍,平时在项目中摸索着尝试用敏捷。但是始终没有系统的学习。因此借着最近一段时间项目不忙,系统的参加了Scrum中文网(www.scrumcn.com)的CSM课程,感受蛮多。 理解敏捷 整个培训过程中一直穿插着敏捷软件开发的原则进行讲解,这里摘录给我感触最深的几个: 我们最重要的目标,是通过持续不断地及早交付有价值的软件使...

Jason_Yin123的博客 659

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

单元测试用例_如何编写优秀的单元测试用例

优秀单元测试的定义单元测试:一段 自动化 的代码 ,这段代码调用被测试的 工作单元 ,之后对这个工作单元的 单个最终结果 的某些假设进行检验。单元测试几乎都是用 单元测试框架进行编写。单元测试容易编写,快速运行,可自动化,可靠,可读,可维护,结果稳定。集成测试:对一个工作单元进行的测试,这个测试对被测试的工作单元没有完全的控制,并使用该单元的一个或多个真实依赖物,例如数据库、系统时间、系统文件等。...

weixin_39817347的博客 949

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

用Coplien质疑为什么大多数单元测试都是浪费的

James O. Coplien在2014年撰写了引人深思的文章“ 为什么大多数单元测试都是浪费的”,并在他的Segue中进一步阐述了该主题。 我喜欢测试,但我也很重视挑战自己的观点以扩大理解范围,因此这是一本有价值的文章。 当遇到如此有争议的事情时,至关重要的是抛开一个人的情感和观点并问:“只要这是真的,我的世界观中可能需要质疑和更新?” 自己判断我的管理水平。 (注意:本文并非是他写作的...

danpu0978的博客 321

【java编程规范】阿里巴巴编程考试规范+真题答案+考试分享

真题直接在后面 也可以直接 Ctrl+F 在博文里 搜索自己的题目 先说 我不是很会 ,但是 我就看了一个小时的真题 就直接取阿里的官网去考试一遍竟然就扒着边过了 80分过满分100 我看csdn的大佬都是100分过。。。我比较菜吧,但是还是可以总结和分享一下的 资源链接 真题分享链接提取码: vtsw 我觉得pdf学起来比较舒服 其实是看的其他同学的博文 转换成了 pdf在pa...

韩旭051的博客 5万+

阿里java单元测试准则

1. 【强制】好的单元测试必须遵守AIR原则。 说明:单元测试在线上运行时,感觉像空气(AIR)一样并不存在,但在测试质量的保障上,却是非常关键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。  A:Automatic AutomaticAutomatic Automatic Automatic (自动化) 单元测试应该是全自动执行的,并且非交互式的。测试用例通常是被定期...

专注赚钱的程序员 6583

阿里代码规范测试题(免费)

阿里代码规范测试 50道题,每题2分。时间50分钟 ABC多选 1.如何处理单元测试产生的数据,下列哪些说法是正确的? ABC A .测试数据入库时加特殊前缀标识。 B .测试数据使用独立的测试库。 C .自动回滚单元测试产生的脏数据。 D .无须区别,统一在业务代码中进行判断和识别。 ABC多选 2.关于并发处理,下列哪些说法符合:ABC A .线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 B .同步处理时,能锁部分代码区块的情况下不要锁整个方法;高并发时,同步

m0_37856386的博客 6310
上一篇: 编程珠玑,字字珠玑
下一篇: 我讨厌单元测试:滕振宇谈如何进行单元测试
dingx
博客等级 码龄24年 67粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值