想象你是一位物业安全巡检员,负责检查一栋 12 层的住宅楼。你的巡检清单上列着每一户房门:敲开 101 室,快速扫一眼,打勾;敲开 102 室,扫一眼,打勾……结束时你自信地说:“整栋楼我都查遍了。” 可是,你真的查遍了吗?你可能只按了门铃,却没推开 301 室的门检查里面的燃气阀门;也可能从来没走到地下车库,看看那扇常闭的防火门里藏着什么。 代码覆盖率,就是软件测试领域那本“巡检清单”。它用百分比告诉你:测试用例到底跑过了多少代码,还有哪些角落依然“裸奔”没人检查。行覆盖率看的是“每个房间是否进屋”,分支覆盖率看的是“每扇门是否都推开过”,路径覆盖率则要求“所有路线组合都走一遍”。本篇将带你以巡检员的视角,搞懂这三种指标的区别、计算方法,以及如何用 coverage.py 这类工具自动生成“巡检报告”,并为 CI 流水线设置质量门禁——让“测试做得够不够”从感觉变成可量化的数字。

岗位关联

对 AI 从业者而言,代码覆盖率是判断模型服务、特征工程等核心代码测试充分性的准绳,也是守住 CI/CD 质量门禁的关键工具,学会它能让你在团队协作中拥有“量化底气”。

目录
  1. 可视化演示
  2. 1. 覆盖率是什么——同一份巡检清单
  3. 2. 行覆盖率——推开每扇门看一眼
  4. 3. 分支覆盖率——把两扇门都推开
  5. 4. 路径覆盖率——把所有路线走一遍
  6. 5. 工具应用——自动巡检记录仪
  7. 6. 实战策略——巡检清单的正确用法
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示测了多少才算够的核心机制,通过基础/核心/应用/扩展四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

测了多少才算够:代码覆盖 代码覆盖率的核心定义与测试充分 行覆盖率与语句覆盖率的计算方法 核心机制可视化 测了多少才算够整体架构与关键组件

1. 覆盖率是什么——同一份巡检清单

巡检员的清单上,每一项都代表一处“该检查的地方”:101 室的门、102 室的窗、地下车库的消防栓。清单勾掉的项越多,他越有底气说“我查得够全”。代码测试也一样,测试用例跑得再多,如果没碰到某段关键逻辑,一切等于白搭。代码覆盖率就是给“测了多少”这件事做量化——它回答一个最基本的问题:测试到底触碰过多少代码?

这个问题的通用答案是一个朴素的比例式:把“被测试接触到的代码单元”除以“所有代码单元”再换成百分比。所谓“代码单元”,可以是一行可执行语句,可以是一个 if 判定的两个出口,也可以是一条完整的状态流转路径。后面三节讲的行覆盖、分支覆盖、路径覆盖,本质是同一个公式往三个不同单位里套。

在工程实践中,覆盖率早已不是仅供阅读的数字。CI 流水线会把它设置成一道“质量门禁”:覆盖率低于 80%,构建直接失败,代码无法合并进主干。这就像物业规定“巡检清单完成率低于 80% 不许交班”——它不是纯粹的绩效展示,而是一个强制的质量底线。

把覆盖率当作巡检清单,你就理解了它的本质:它是一张“已检查位置”的地图,而非“检查质量”的证明。记住这一点,后面所有指标的优缺点都顺理成章。

覆盖率=被覆盖的代码单元代码单元总数×100%\text{覆盖率} = \frac{\text{被覆盖的代码单元}}{\text{代码单元总数}} \times 100\%
覆盖率 = 被测试碰到的代码单元 ÷ 全部代码单元。它衡量“测了多少”,不衡量“测得好不好”。
  1. 被覆盖的代码单元测试执行过程中真正跑到的行、分支或路径,它是分子,代表“已经检查过的地方”
    被覆盖的代码单元\text{被覆盖的代码单元}
  2. 代码单元总数被测代码中全部行/分支/路径的数量,它是分母,代表“整栋楼该检查的所有位置”
    代码单元总数\text{代码单元总数}
  3. 比值转百分比把分子除以分母再乘 100%,得到一个便于和阈值比较的百分数,比如 80%、95%
    ×100%\times 100\%

2. 行覆盖率——推开每扇门看一眼

巡检员检查楼层时,最省力的做法是“每间房都推开门探头看一眼”。不检查柜子,不检查床底,只要视线扫过就算完成一间。行覆盖率就是这种“探头式检查”:测试执行过程中,一行可执行代码只要被跑到一次,就算被覆盖了。

从技术上讲,行覆盖率的分子是“被执行过的可执行代码行数”。注意,空行和注释都不算,因为解释器根本不会执行它们。分母是所有可执行代码行的总数。工具会自动把两者相除算出百分比。正因为机制简单,几乎所有覆盖率工具(coverage.py、JaCoCo、Istanbul)都默认输出行覆盖率。

它最大的优点是直观、自动化成本低,跑完测试立刻出数;但它的盲区也恰恰藏在“只看行”这件事上。假设函数里写着 if user.is_vip:,下面跟着两行逻辑。只要测试用例里存在一个 VIP 用户,if 那一行就被执行了,行覆盖率满格。可如果没有任何测试把 is_vip=False 的分支走一遍,非 VIP 用户的逻辑可能早就坏掉了,行覆盖率却依然报出 95% 的高分——就像巡检员推开门探头扫一眼,却没发现房间角落已经漏水的管道。

行覆盖率就像巡检的“第一道网”:它能快速筛出完全没人测过的死亡代码,却对“逻辑分支没测全”十分迟钝。所以成熟的团队不会只看它,而会把目光投向更细的分支覆盖率。

行覆盖率=被执行行数代码总行数×100%\text{行覆盖率} = \frac{\text{被执行行数}}{\text{代码总行数}} \times 100\%
行覆盖率统计“有多少行代码被跑过”。它是最基础的指标,但也是“最粗的巡检粒径”。
  1. 被执行行数测试运行期间,解释器真正执行到的可执行代码行数量,这是“探头看到过的房间数”
    被执行行数\text{被执行行数}
  2. 代码总行数去掉空行、注释后,该文件或模块里所有可执行代码行的总和,这是“整层楼的房间总数”
    代码总行数\text{代码总行数}
  3. 相除取百分比把已执行行数除以总行数,乘 100% 得到直观分数,方便团队设定及格线
    ×100%\times 100\%

3. 分支覆盖率——把两扇门都推开

真正的安全巡检不会满足于“探头看一眼”。巡检员走到消防门面前,会用力把门推向两个方向:往里推,确认里面能打开;往外拉,确认逃生方向畅通。分支覆盖率要求的就是这种“两个方向都试一次”:每一个判定结构(if、while、三元表达式)的所有出口,都至少被覆盖一次。

以 if price > 100: 为例,它天然存在两个分支:条件为真(true)时执行降价逻辑,条件为假(false)时跳过。分支覆盖率的分子是“被执行过的分支数量”,分母是“所有分支的总数”。一个 if-else 贡献 2 个分支,一个带 elif 的多路判断每加一个 elif 就多一个出口,switch 语句则按 case 数量计数。此外,像 a and b 这种包含逻辑运算符的表达式,a 和 b 各自也会编译出独立的真/假判定,同样计入分支总数——这一点常被初看报告的人忽略。

对比上一节你会发现:行覆盖可以做到 100%,分支覆盖却可能只有 60%。因为只要测试数据总是让条件成立,false 分支就永远没触发,可那几行代码确实被执行过。分支覆盖率补上了这个洞:它逼着测试者为每个判定准备“反着来”的数据。用巡检的比喻来说,行覆盖保证你进了房间,分支覆盖保证你把每扇门都推开检查过。

分支覆盖率是行覆盖率的“升级版巡检眼”:它不满足于扫一眼,还要推拉每一扇门。对涉及大量条件判断的业务代码——比如 AI 服务里的阈值分流、特征过滤——这一指标比行覆盖率重要得多。

分支覆盖率=已执行分支数分支总数×100%\text{分支覆盖率} = \frac{\text{已执行分支数}}{\text{分支总数}} \times 100\%
分支覆盖率关注“每个判定的每个出口是否都走到过”。它比行覆盖更严苛,也更能暴露逻辑盲区。
  1. 已执行分支数测试运行期间至少走到过一次的判定出口数量,例如 if 的 true 或 false 侧
    已执行分支数\text{已执行分支数}
  2. 分支总数所有判定结构的出口之和,一个 if 算 2 个,一个 while 算 2 个,带 and 的表达式每个操作数都算一个判定
    分支总数\text{分支总数}
  3. 公式结果已执行分支数除以分支总数再乘 100%,比例越高,说明判定逻辑被验证得越全面
    ×100%\times 100\%

4. 路径覆盖率——把所有路线走一遍

最严格的巡检是什么?巡检员不光要每个房间都看,还要把“从大门走到楼顶”的所有路线组合都完整走一遍:走楼梯还是坐电梯、经过 A 走廊还是 B 走廊,每条通路都得实地踏勘。路径覆盖率正是这种“全路线演习”:它要求测试覆盖程序执行的所有可能“路径组合”。

一条路径,从函数入口开始,由沿途每个判定的结果串联而成。假如一个函数先后有两个独立 if,路径就有 4 条:if1 真→if2 真、if1 真→if2 假、if1 假→if2 真、if1 假→if2 假。如果把其中一个 if 换成 if a and b,内部还会多出若干布尔判定,路径数进一步膨胀。路径覆盖能发现分支覆盖漏掉的“分支之间相互作用”的缺陷——比如两条分支单独测都没问题,组合起来却产生状态冲突。

但代价极其昂贵:路径数随判定数指数爆炸。每增加 1 个独立判定,路径总数就翻一倍。一个包含 10 个 if 的函数,路径总数高达 1024 条,想用测试用例逐条覆盖几乎不可能。这就是为什么大型项目中,路径覆盖率通常被当作一种“参考指南”而不是硬性门禁——工程上更现实的做法是筛选“关键路径”重点覆盖,比如支付链路、模型推理主流程,而不是奢求 100%。

路径覆盖率是巡检的“终极形态”,但也是现实的“奢侈品”。聪明的巡检员会挑重点路线仔细走,而不是傻乎乎地把所有组合走完——理解了这一点,你就抓住了覆盖率实践的精髓。

路径总数=2n\text{路径总数} = 2^{n}
这里 n 是相互独立的判定点数量。n 每加 1,路径数翻倍,这就是著名的“组合爆炸”。
  1. n 的含义函数中相互独立的判定点个数,比如两个不相干的 if 就是 n=2
    nn
  2. 指数增长每个判定点有真、假两种可能,n 个判定点的组合数是 2 的 n 次方,即 2×2×…×2 一连乘 n 次
    2n2^{n}
  3. 增长率感受n=5 时路径数为 32,n=10 时为 1024,n=20 时已经超过 100 万条——所以“全覆盖”只存在于教科书
    例如:210=1024\text{例如:} 2^{10} = 1024

5. 工具应用——自动巡检记录仪

巡检员靠纸笔记录容易漏项,聪明的物业会给他配一台自动记录仪:走到哪个房间,设备自动打卡;没去过的地方,系统自动标红。coverage.py 就是 Python 生态里那台“自动巡检记录仪”。它通过 Python 的追踪机制监听代码执行过程,哪一行被跑到、哪个分支被走进,全部自动记录,最后汇总成一份带红绿高亮的“巡检报告”。

用法非常简洁:coverage run -m pytest 让测试在追踪状态下跑完,随后 coverage report 在终端输出各文件的行覆盖率与分支覆盖率,coverage html 则生成网页版报告——绿色表示已覆盖,红色表示“裸奔”的未覆盖行,点开即见。如果要看更精确的差异,coverage report -m 会额外列出缺失行号,方便你精准补测试。

比报告更重要的是“质量门禁”配置。在项目根目录放一个 .coveragerc,写 [report] fail_under = 80,再配合 shell 命令的退出码,就能实现“覆盖率低于 80%,CI 构建直接失败”。若再开启 branch = true,分支覆盖率也会一并计入考核——这就把“巡检清单完成率”从口头要求变成了机器强制执行的硬规则。

有了这台“记录仪”和这套“门禁规则”,覆盖率就从概念落地成了工程机制。下一步,就是学会合理设置那条及格线——也就是最后一个问题:到底设多少才算够?

门禁结果={通过if C≥T 不通过if C<T\text{门禁结果} = \begin{cases} \text{通过} & \text{if } C \geq T \\\ \text{不通过} & \text{if } C < T \end{cases}
C 是实际覆盖率,T 是团队设定的阈值。C ≥ T 才放行,否则构建直接失败——这就是 CI 里的“硬性质量门禁”。
  1. 实际覆盖率 Ccoverage.py 计算出的真实覆盖比例,比如 79.5%,它是门禁的“输入信号”
    CC
  2. 设定阈值 T团队在 .coveragerc 里配置的 fail_under 值,如 80%,它是“及格线”
    TT
  3. 分支判定当 C ≥ T 时门禁放行,构建成功;当 C < T 时门禁拦截,命令以非零码退出,CI 流水线随之失败
    C≥TC \geq T

6. 实战策略——巡检清单的正确用法

有经验的物业经理不会天真地要求“每处巡检项都 100% 完成”。燃气管道、消防通道必须次次满分;普通储物间看一眼就够。覆盖率目标同样讲究分层:团队可以先为全项目设定一个“基础及格线”,比如行覆盖率 80%、分支覆盖率 70%;再对核心模块(支付、鉴权、AI 推理主链路)单独立项,要求行覆盖 100%、分支覆盖 90% 以上。

让旧代码一夜之间达标并不现实。合理的落地节奏是:新代码强制过门禁,旧代码逐步提升。可以在 CI 中加入增量覆盖(diff coverage)检查,只统计本次改动涉及的行,要求改动行覆盖率达到 100%——这比盯着全项目数字更有意义,因为它把责任精确落到每个提交者头上。

最后要警惕“数字虚高”的陷阱。有些人为了把覆盖率刷上去,写了测试却故意去掉断言,或者滥用 # pragma: no cover 跳过难测分支。这就像巡检员在清单上打勾却没真正推开房门,属于自欺欺人。覆盖率是导航仪而不是终点——它告诉你“哪些地方还没测到”,但测得好不好,还得靠有效的断言和真实的业务场景。建议用“行覆盖 + 分支覆盖 + 关键路径覆盖”加权合成一个综合分数,避免被单一数字绑架。

巡检不是把清单勾满,而是让重点区域满分、次要点良好、并留出改进空间。覆盖率策略的目标从来不是“数字好看”,而是让每一次代码合并都带着足够的信心——这正是“测多少才算够”的最终答案:够到能兜住核心风险,够到每次修改都不会让坏味道悄悄溜进主干。

有效覆盖=w1⋅行覆盖+w2⋅分支覆盖+w3⋅核心路径覆盖\text{有效覆盖} = w_1 \cdot \text{行覆盖} + w_2 \cdot \text{分支覆盖} + w_3 \cdot \text{核心路径覆盖}
把三个指标按权重合成一个“综合巡检分”,权重大小根据业务场景而定,防止只看单一维度而漏掉盲区。
  1. 权重系数 w行覆盖、分支覆盖、核心路径覆盖各自的重要性占比,三者之和等于 1,比如 0.4、0.4、0.2
    w1+w2+w3=1w_1 + w_2 + w_3 = 1
  2. 三种覆盖率行覆盖看广度,分支覆盖看判定深度,核心路径覆盖看关键链路的组合完整性
    行覆盖+分支覆盖+核心路径覆盖\text{行覆盖} + \text{分支覆盖} + \text{核心路径覆盖}
  3. 加权求和三个指标乘上各自权重后相加,得到一个介于 0 到 100 之间的“有效覆盖分”,用于统一门禁
    ∑i=13wi⋅覆盖i\sum_{i=1}^{3} w_i \cdot \text{覆盖}_i

AI 应用场景

场景一:CI 流水线中的覆盖率质量门禁

阶段:模型服务测试与发布

解决的问题:AI 服务代码(特征工程、推理封装)改动频繁,传统人工 Code Review 很难发现“改了代码但没测到”的盲区。用覆盖率门禁,把“测试是否充分”变成机器强制检查。

具体案例:某 MLOps 团队在特征处理模块的 CI 中配置 fail_under = 85 且开启 branch = true,同时用增量覆盖只检查 PR 改动的行。一次提交新增了“空值兜底逻辑”却忘了写对应测试,覆盖门禁直接让流水线变红,开发者被迫补上空值分支的用例后才合入主干。

场景二:AI 模型服务的重构安全网

阶段:AI 工程化中的代码重构

解决的问题:老旧的推理服务代码没人敢动,不知道现有测试能不能兜住行为变化。覆盖率报告先画出“裸奔区域”,帮助团队决定优先补哪块测试。

具体案例:重构前先用 coverage.py 给推理服务生成 HTML 报告,发现模型后处理模块行覆盖率仅 30%。团队先为这部分补齐分支测试,把行覆盖提到 90%、分支覆盖提到 80%,再愉快地进行重构。重构后再次对比增量覆盖,确保本次改动的每行新代码都有测试用例覆盖。

Python 演示

python30 行
"""演示 coverage.py 采集代码覆盖率并生成报告"""import coverageimport sys  def discount(price, member):    """会员打 8 折,折后满 100 再减 10"""    if member:        price = price * 0.8    if price >= 100:        price -= 10    return price  def test_normal():    assert discount(200, False) == 190  def test_member():    assert discount(200, True) == 150  cov = coverage.Coverage(branch=True)cov.start()test_normal()test_member()cov.stop()cov.save()cov.report(show_missing=True, morfs=[sys.modules["__main__"]])cov.html_report(directory="coverage_html", morfs=[sys.modules["__main__"]])
目的:用 coverage.py 的 Python API 采集两个测试用例的执行轨迹,对比展示“行覆盖率 100% 但分支覆盖率只有 75%”的差异,并输出终端报告与 HTML 报告。运行前需 pip install coverage。
  1. cov = coverage.Coverage(branch=True)创建覆盖率采集器,branch=True 同时统计分支覆盖
  2. cov.start()启动“自动巡检记录仪”,开始记录每一行代码的执行状态
  3. test_normal()走一遍非会员调用路径,触发 if member 的 false 分支
  4. test_member()走一遍会员调用路径,触发 if member 的 true 分支
  5. cov.report(show_missing=True, morfs=[sys.modules["__main__"]])输出终端报告,show_missing 标注未覆盖行号
  6. cov.html_report(directory="coverage_html", ...)生成红绿高亮的网页版报告,红色即“裸奔”代码

常见误区

误区把代码覆盖率刷到 100%,我就再也不用担心线上出 bug 了,满分就是完美。

正解覆盖率 100% 只代表“所有代码行都被执行过”,不代表“所有逻辑都被验证过”。就像巡检清单全勾了,也保不齐床底藏着漏水的管道。行覆盖满分但分支覆盖只有 60% 的情况非常常见,更何况断言写得好不好直接决定测试有没有杀伤力。覆盖率衡量的是“测了多少”,不是“测得多好”。

为何常见:人的直觉容易把 100% 等同于满分、把满分等同于完美。加上工具默认展示行覆盖率,很容易产生虚假安全感。

误区CI 里只用行覆盖率做门禁就够了,分支覆盖率是锦上添花,没必要太在意。

正解行覆盖率高只能说明“代码被跑过”,却无法证明“每个判定的两个方向都被验证过”。一个 if 的两个分支,测试若只走 true 侧,行覆盖照样接近满分,但 false 侧的逻辑可能早就坏了。分支覆盖率能暴露这类盲区,两者是互补关系而非替代关系。对判定逻辑多的模块,分支覆盖率比行覆盖率更该设为硬性门禁。

为何常见:大多数 CI 模板默认配置行覆盖率的 fail_under,分支覆盖率默认不开启,开发者在默认值里待久了就会觉得“默认的才是重要的”。

误区测试里写两行 `func(1)`、`func(2)`,不写 assert 就行,反正函数被调用了,覆盖率照样涨。

正解没有断言的测试是“走过场”。函数执行了、覆盖率爬到 100%,但执行结果对不对没人关心,一旦实现被改坏,测试照样全绿。真实场景中这种“裸奔断言”被称为无效测试。覆盖率是分子,断言强度是分母,有效的测试必须两者兼备。

为何常见:CI 只卡覆盖率数字,不检查断言质量,部分开发者就钻空子刷分——这是指标被当成了目的而非导航。

误区既然覆盖率重要,那直接在 CI 里把阈值设成 100%,逼着所有模块一步到位。

正解存量代码一次性补齐测试成本极高,还可能为了凑数写一堆无效用例。更现实的做法是:新代码强制高覆盖(甚至可以要求增量覆盖 100%),旧代码从当前值逐步抬升(比如每版本提升 2 个百分点)。这好比巡检不会要求整栋楼一夜之间所有角落全翻新,而是先保障重点区域,再慢慢铺开。

为何常见:管理者容易把“高指标”等同于“高质量”,忽略了工程改进需要渐进式的路径。

面试题

Q1. 行覆盖率 90% 表示什么?

单选题 · easy

  • A.90% 的分支被测试覆盖
  • B.90% 的代码行被执行过← 正确答案
  • C.90% 的 bug 被找到了
  • D.90% 的用例通过了

答案:B。行覆盖率 = 被执行行数 / 可执行代码总行数,B 正确。A 描述的是分支覆盖率;C 混淆了缺陷检出率;D 描述的是测试通过率,与覆盖率无关。

Q2. 下列哪种做法能直接提高分支覆盖率?

单选题 · mid

  • A.增加无断言调用
  • B.覆盖 if 两个结果← 正确答案
  • C.提高单测运行速度
  • D.删除未覆盖分支

答案:B。分支覆盖率要求每个判定出口至少执行一次,B 正确。A 无断言调用只贡献行覆盖,不贡献有效测试;C 与覆盖无关;D 删除分支是改代码而非补测试,治标不治本。

Q3. 一个函数有 5 个相互独立的 if 判定,路径总数是多少?

单选题 · mid

  • A.路径共 5 条
  • B.路径共 10 条
  • C.路径共 25 条
  • D.路径共 32 条← 正确答案

答案:D。路径总数 = 2^n,n 为独立判定数。5 个 if 就是 2^5 = 32 条路径。这正是路径覆盖率的“组合爆炸”特性,也是它难以在大型工程中做到 100% 的数学根源。

Q4. 下面代码行覆盖率 100%,分支覆盖率却可能不足,原因是?

单选题 · hard

  • A.测试没执行最后一行
  • B.两个走向只测一个← 正确答案
  • C.分支覆盖率统计行数
  • D.覆盖率工具存在 bug

答案:B。代码共 3 行可执行语句,只要测试让 x > 0 为真,三行全执行,行覆盖 100%。但 if 的 false 分支(x <= 0 时跳过 y = 1)从未触发,分支覆盖只有 50%。工具统计的是分支出口而非行,所以 C 错;A 与题意相悖;D 是想当然。

Q5. coverage.py 中,coverage run 与 coverage report 的关系是?

单选题 · easy

  • A.先跑测试再生成报告← 正确答案
  • B.先看报告再决定测试
  • C.两者同时并行执行
  • D.报告与测试互不影响

答案:A。coverage run 负责采集执行轨迹,相当于巡检员的自动记录仪;coverage report 负责把记录汇总成报表。顺序必须先是 run 采集、后是 report 生成,其他选项与工具实际工作流不符。

Q6. 下列哪些属于代码覆盖率的常见指标?

多选题 · mid

  • A.行覆盖率← 正确答案
  • B.分支覆盖率← 正确答案
  • C.路径覆盖率← 正确答案
  • D.语法错误率

答案:ABC。行覆盖、分支覆盖、路径覆盖是覆盖率的三大经典指标,分别对应“行是否执行”“分支是否走全”“路径组合是否覆盖”。语法错误率属于静态检查范畴,与运行期覆盖率无关。

Q7. CI 中设置 fail_under = 80,实际覆盖率 79% 时会发生什么?

单选题 · hard

  • A.构建继续但输出警告
  • B.构建失败并阻塞合并← 正确答案
  • C.覆盖率自动补到 80%
  • D.测试用例被自动跳过

答案:B。fail_under 是硬性质量门禁,实际覆盖率低于阈值时,coverage 命令以非零状态码退出,CI 流水线随之失败,代码无法合入主干。它不会打补丁也不会跳过测试,A、C、D 均不符合机制。

Q8. 下列哪些是“有效”的覆盖率提升手段?

多选题 · hard

  • A.为 if 分支补齐测试数据← 正确答案
  • B.为异常处理写触发用例← 正确答案
  • C.去掉 assert 强行拉高通过率
  • D.滥用 pragma 跳过难测分支

答案:AB。A、B 真正填补了测试盲区,是“打开新房间”的有效动作。C 是删掉检验逻辑的作弊行为;D 用 # pragma: no cover 跳过分支只是掩盖问题,会让覆盖率数字虚高,误导后续判断。

Q9. coverage html 生成的网页报告中,红色高亮的行代表什么?

单选题 · mid

  • A.执行了多次的高风险行
  • B.未被执行的代码行← 正确答案
  • C.语法错误所在的行
  • D.性能瓶颈所在的行

答案:B。HTML 报告中红色表示“从未被测试执行到的行”,绿色表示已执行。红色区域就是需要补测试的“裸奔代码”。A 的执行次数用颜色深浅展示在已覆盖行上;C、D 与覆盖率报告无关。

Q10. 要判断“测试是否充分”,应该综合哪些信号?

多选题 · mid

  • A.行覆盖率数字← 正确答案
  • B.分支覆盖率数字← 正确答案
  • C.关键路径测试用例← 正确答案
  • D.代码行数多少

答案:ABC。测试充分性是一个多维度判断:行覆盖看广度,分支覆盖看判定深度,关键路径用例看核心链路是否兜住。三者互补,组合成“有效覆盖”才能降低盲区概率。代码行数只是项目规模描述,与测试充分性没有直接关系。