高品质的音视频能力是怎样的? | Qcon 全球软件开发大会·上海站邀请函 了解详情
写点什么

测试覆盖率强迫症

  • 2010-07-02
  • 本文字数:1955 字

    阅读完需:约 6 分钟

我曾经服务于这样的客户,开发团队由于需求不明晰,验收条件缺乏,导致返工严重;知识分享的缺乏,导致人员间不能相互替换,工作无法合理分配,进度缓慢;架构划分的不合理,又没有频繁的在各团队间进行集成,导致发布难度大,周期长。内忧外患下,团队领导人却仅对于测试覆盖率表现出异乎寻常的热情,与之形成鲜明对比的是对于其它的问题冷漠和麻木。人们似乎很容易犯这样的错误,由于不确定应该做什么,或者不知道如何去做最重要的事情,最终将注意力放在了易于提升的次等重要的事情上。

很多团队的领袖不遗余力地提升测试覆盖率,以至于患上了“测试覆盖率大于 90 强迫症”,89.99% 的测试覆盖率也会让他们寝食难安,并发明了自动化测试覆盖率检查工具 (当测试覆盖率达不到 90%,测试便会失败) 来减轻自己的症状。在我看来,这一强迫症的病因在于对项目控制的力不从心引发的压力无法排除,加强对于测试覆盖率 (或者项目其它生命体征) 的要求从技术决策变成了心理上的减压渠道。面对可能的项目失败,他蛮可以说:“技术职位上我尽了最大的努力,看看测试覆盖率!项目的失败应归罪于愚蠢的合同 (销售),不清晰的需求 (业务分析师),又或者是不切实际的进度安排 (项目管理者)。”

抛开管理因素不谈, 从技术上讲,高测试覆盖率和高质量的软件能够被等同起来么?看看下面的例子:

复制代码
public class Calculator {
public static Decimal Divide(Decimal operand1, Decimal operand2) {
operand1.Divide(operand2)
}
}
[Test]
public void two_divide_one_should_return_two() {
Assert.AreEqual(2, Calculator.Divid(2, 1));
}

NCover 会告诉我们测试已经完全覆盖了功能 (测试覆盖率 100%)。可事实果真如此么?现有的测试至少不能回答系统在如下情况下对于“除法”这个功能的期待是什么?

  • 除数为 Null
  • 被除数为 Null
  • 被除数为 0

测试覆盖率仅仅能够告诉团队什么没有被测试,根本就回答不了软件是否经过了有效测试!

舌苔厚重反映的是消化问题,治疗方案当然不是刷刷舌头这么简单,同样,测试覆盖率低的病灶常常是:

  • 团队成员没有写测试的习惯,没有意识到写测试的重要性,不想写
  • 代码难于测试,不会写
  • 赶进度,没有时间写

相对于提升测试覆盖率,这些问题解决起来就要复杂的多,也棘手的多。我不确定特定环境上述问题的解决问题是什么,但是我很确定补测试不是良方,它往往会催生出没有 Assert 的畸形测试以及大量针对 getter/setter 的无用测试

检查覆盖率得到好的结果可以增强团队信心,巩固测试实践;而得到坏的结果则需要综合分析,找到原因,制定改进方案。这是团队积累经验,提升能力的一种有效途径,单纯要求提高覆盖率则是头疼医头,脚疼医脚的可笑方法。测试不是为了代码需要被测试的需求而存在,它存在的原因是市场需要以低成本生产高质量软件。补测试无法满足测试实践的内在需求。在我看来,利用覆盖率的分析结果在团队中引发一个话题,讨论系统模型的可测试性、设计的合理性,并藉此改善产品才是更加可取的做法,单纯追求覆盖率常常反映出团队将流程和目标混淆起来,甚至误将流程当作了目标。

如果不再要求所有的组件必须被覆盖,我们就必须回答一个新的问题:“哪些组件应该被覆盖? 多少覆盖率比较合适?”。以我的经验,在考虑测试策略时至少需要参考业务价值,功能变化趋势以及缺陷率这三个因素:业务价值是核心,讨论清楚业务流程和价值,优先针对高业务价值的功能分析和设计测试。其次是根据组件的变化趋势有重点的投资测试。系统中一定存在常常变化的组件,对于这些组件多投入一些测试有助于减少破坏已完成功能的风险,并进而提高团队的信心。Bug 则是另一个风向标,向我们指明系统的哪些部分比较薄弱。对 Bug 进行一下分类整理,我们就能很容易的发现系统的这些薄弱区域;在这些区域添加测试、修补有缺陷的功能,将有助于提高产品的质量。

去解决数据掩盖之下的问题难度更大也更令人恐惧,没人清楚我们可以走多远,但重要的是我们已经出发。恐惧和无所适从是因为我们所面对的新领域再没有绝对的对错,再没有容易做出的决策,我们需要更多经验,承担更多的风险,它迫使我们驶出了心理舒适区,开始在心理学习区锻炼自我,挑战自我,只有这样数据强迫症才会被清除治愈。

关于作者

胡凯, ThoughtWorks 公司的敏捷咨询师,官方认证的 Spring Framework 讲师,近 2 年一直从事持续集成工具 Cruise 以 及 CruiseControl 的设计开发工作。 创造和参与了开源测试框架 junit-ext ,网格测试工具 test-load-balancer 以及用于分析 CruiseControl 构建的报表工具 iAnalyse , 对于 Web 开发,敏捷实践,开源软件与社区活动有浓厚的兴趣,可以访问他的个人博客进行更多的了解。


给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2010-07-02 03:275611

评论

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

取代FMEA风险评估:如何在敏捷世界中管理风险

龙智—DevSecOps解决方案

风险管理 FMEA

如何为你的听众设计一张精密的地图

将军-技术演讲力教练

控制台彩色输出

FunTester

Java 测试框架 Groovy FunTester Jansi

愿当传播通信技术火种的普罗米修斯

融云 RongCloud

通信云 技术大会

低代码平台是伪需求?不好意思,你的同行已经靠它完成转型升级了!

J2PaaS低代码平台

低代码 低代码开发 低代码开发平台 低代码平台

Flutter 2 渲染原理和如何实现视频渲染

声网

flutter 大前端 音视频

探秘持久内存(PMem)中无锁实现多线程安全的持久化数据结构

第四范式开发者社区

持久内存 PMem 多线程安全

如何用会声会影制作简约的倒计时片头?

懒得勤快

想在 KubeSphere 中进行自定义监控?来瞧瞧这

Apache APISIX 中文社区

云原生 API网关 监控工具 KubeSphere Apache APISIX

复杂场景下,通信云服务商如何赋能开发者

融云 RongCloud

音视频 通信云 语音社交

如何对Android 11进行网络状态监听

Changing Lin

12月日更

EasyRecovery如何恢复md文件

淋雨

Camtasia

网络安全之SQL注入深入分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 SQL注入

基于RPA的自动化优先,正在成为广大组织的主流管理思维

王吉伟频道

RPA 机器人流程自动化 业务流程管理 自动化优先 业务流程自动化

6.《重学JAVA》--数据类型

杨鹏Geek

Java 25 周年 28天写作 12月日更

基于云的技术架构设计实践 - 第3篇

hackstoic

签约计划第二季 业务安全

大数据中心通过Perforce软件版本管理系统助力动力系统开发

龙智—DevSecOps解决方案

perforce 混合动力

为什么说泛娱乐出海离不开这家公司

融云 RongCloud

音视频 通信云 社交 泛娱乐 出海

搭积木一样实现语音社交软件开发

融云 RongCloud

开发者 通信云 语音社交

如何处理工作与生活之间的冲突?

石云升

28天写作 职场经验 12月日更

【技术干货】前端性能优化——快速定位代码bug

云智慧AIOps社区

开源 大前端 技术分享 技术干货

风口之下,音视频应用出海的三大机遇

融云 RongCloud

音视频 通信 出海

前端领域的数据状态统一管理机制

鲸品堂

大前端

清空数组的几个方式

CRMEB

焱融 YRCloudFile 连获两项重量级认证,展现强劲存储实力!

焱融科技

云计算 分布式 云原生 高性能 文件存储

架构实战营4期第一模块作业

jialuooooo

架构实战营

直播:开发者如何抵达元宇宙

融云 RongCloud

开发者 元宇宙

视镜:华为云媒体质量管理最新实践

华为云开发者联盟

音视频 华为云 媒体质量 视镜

Java 面向对象精讲【下】

XiaoLin_Java

面向对象 12月日更

nginx负载均衡策略你知道多少?

恒生LIGHT云社区

负载均衡 服务器 ngnix

测试覆盖率强迫症_Java_胡凯_InfoQ精选文章