知识卡片

用单元测试覆盖率作为异常处理质量的可操作代理指标

普通读书笔记卡

内容

代码真正运行的环境里充满了各种异常:服务器死机、网络超时、用户胡乱操作、恶意攻击,但新手程序员普遍缺乏处理异常的意识。判断一段代码的异常处理能力,一个直接、有效的第一手依据是单元测试的覆盖率——原因在于大部分异常场景很难在开发或测试环境里被自然复现,即使有专业测试团队,也很难在集成测试环境中模拟出所有真实会发生的异常情况;而单元测试恰好擅长做这件事,可以相对简单地针对性构造各种异常输入和边界条件。基于这个逻辑,如果一个模块的单元测试覆盖率连50%都不到,就很难相信这些代码真的认真考虑过异常情况的处理——即使代码里确实写了一些异常处理分支,这些分支既然没有被单元测试覆盖过、没有被真正验证过是否正确,又怎么能指望它们在真实生产环境出问题的那一刻,能够按预期正常工作呢?这个案例给出了一条把”异常处理质量”这个原本抽象、难以直接评价的问题,转化成一个具体可测量指标的思路:与其试图逐行阅读代码去判断”这里的异常处理写得够不够全面、够不够正确”(这本身需要很高的经验和耐心),不如换一个更容易观测、且和真正想评价的目标高度相关的代理指标(单元测试覆盖率)——覆盖率低这个信号本身,几乎可以直接推断出”这些异常处理分支大概率没有被真正验证过”这个结论,不需要真的逐行去审查每一条异常处理逻辑的正确性。这种”找一个更容易测量、又和目标高度相关的代理指标”的思路,对很多难以直接量化的质量维度都有参考价值。

参考来源

- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.6 系统运维之评价代码优劣的方法"节,"5.6.1 什么是好代码"(源文件:_epub-src/OEBPS/Text/Chapter5_6_2.xhtml) - 结论依据:原文说明"我对一段代码异常处理能力的第一印象来自于单元测试的覆盖率……如果一个模块的单元测试覆盖率连50%都不到,很难想象这些代码考虑过异常情况下的处理,即使考虑了,这些异常处理的分支都没有被验证过,怎么指望在实际运行环境中出现问题时表现良好呢",直接支撑本卡片结论。 - 原始内容:我对一段代码异常处理能力的第一印象来自于单元测试的覆盖率……如果一个模块的单元测试覆盖率连50%都不到,很难想象这些代码考虑过异常情况下的处理,即使考虑了,这些异常处理的分支都没有被验证过,怎么指望在实际运行环境中出现问题时表现良好呢。