BTC TestStack · 用例

代码覆盖率分析

我的所有代码都经过测试了吗?

代码覆盖率

limiter.c

1int clamp(int v) {
2 if (v > 5)
3 return MAX;
4 return v;
5}
语句
100%
判定
100%
MC/DC
100%

在后台自动更新,无需单独执行测量流程。

挑战

低效的覆盖率测量方式。

基于插桩的覆盖率测量会给工作流程的每个环节增加负担。您需要的指标绝非一键可得——必须以反复重新运行测试为代价。

仅为测量而运行全部测试

插桩代码只能报告实际执行到的部分,因此,要获得指标就必须执行整个测试套件——即使您只关注一个函数。

更改一项测试,重新运行所有测试

每次修改测试都会使汇总结果失效。要再次信任该指标,就必须重新执行整个测试套件——每次迭代都要重复付出这一成本。

然后在生产代码上再次执行此操作

插桩会改变二进制文件,因此在插桩代码上得到的结果不能计作交付代码的结果。要证明未插桩生产代码的覆盖率,就必须再次执行全部测试——工作量翻倍。

集成 · 自动化 · 已认证

覆盖率是结果,而不是一项额外任务。

每当创建、修改或删除测试用例时,BTC TestStack 都会在后台计算并更新覆盖率。覆盖率按子函数和子系统计算,因此您关注的任意子集均可一键查看覆盖率——无需重新运行,也无需单独执行报告步骤。

01

自动更新

覆盖率在后台更新,无需插桩步骤,也无需专门执行测量流程。

02

按子函数和子系统

结果可细化到各个子函数和子系统,而不只是整个构建的一项汇总指标。

03

任意子集,一键查看

选择一个范围,即可立即查看其覆盖率。由于数据已经存在,筛选不会触发再次执行。

04

每个目标都可追溯到其测试

对于每个覆盖目标,您会立即看到覆盖它的测试用例列表——无需手动交叉引用来确定哪个测试达到了哪个目标。

四类覆盖目标

所有需要测量的指标,集中在一处。

结构指标、稳健性、值域检查和自定义目标——各类覆盖率并列呈现,并始终保持最新。

结构覆盖率

统一计算功能安全证据所需的全套结构指标。

语句(STM)判定/分支(D)条件(C)MC/DC函数 + 函数调用Switch / case关系运算符
ISO 26262-6 · 表 12 和 15
单元级语句、分支和 MC/DC 覆盖率,以及集成级函数和函数调用覆盖率。

稳健性目标

各类运行时错误都被视为覆盖目标:BTC TestStack 要么证明代码能够抵御这些错误,要么生成可触发故障的测试。

  • 除以零
  • 向下转型(有损窄化转换)
  • 数组访问越界
ISO 26262-6 · 稳健性测试
有助于实现无运行时错误并支持稳健性验证(表 13)。

值域检查

定义或导入每个接口对象的有效值和值域,BTC TestStack 随后会直接跟踪这些值域的覆盖率。

ISO 26262-6 · 表 10
自动跟踪等价类覆盖和边界值分析。

用户定义的覆盖目标

借助可访问所有接口变量的编辑器,您可以将任意目标表示为布尔表达式或数学表达式,然后测量测试是否达到该目标。

ISO 26262 · 项目特定目标
安全计划中定义的、标准表格之外的其他覆盖目标。
智能测试生成

当覆盖率尚不完整时,BTC TestStack 会帮助您补齐缺口。模型检验算法无需猜测输入,而是推导出达到 100% 结构覆盖率所需的最小、最短测试用例集。

它可直接访问输入和标定值;如果某个目标无法达到,则会返回该目标不可达的数学证明,使您可以将其归为死代码,而无需继续追查。

随机工具猜测。 模型检验证明。
model_check · generate
100%已达到的结构覆盖率
已验证
生成的最小测试集
TC_01v = 4 → 分支为假
TC_02v = 6 → 分支为真
TC_03v = 5 → 边界
1 个目标经证明不可达 · 标记为死代码
核心优势

覆盖率分析能为团队带来什么。

01

始终保持最新状态

后台更新使指标始终保持最新——无需再记得单独执行测量流程。

02

在所需范围查看覆盖率

提供每个子函数和每个子系统的结果——任意子集的覆盖率均可一键查看。

03

完整的指标范围

结构覆盖、稳健性、值域和用户自定义目标——全部汇集在一份报告中,无需使用四种工具。

04

证明目标不可达

无法达到的目标会经证明为不可达,并标记为死代码——无需再徒劳追查。

查看您自己的代码是否达到 100% 覆盖率。

评估许可证包含由我们的工程师参与的启动研讨会——选取您的一个实际软件单元,完成端到端设置。