答案内容由AI生成,仅供参考:
五、总结与建议
| 项目 | 建议 |
|---|---|
使用 --coverage_exclude 排除 |
|
| 必须编写 UT,确保覆盖率达标 | |
| 主动说明屏蔽原因及范围 | |
| 支持人工审核与临时放行机制 |
点击此处查看详细分析解答
Lua和C混合组件的新增代码覆盖率检查处理方案
当在 storage 组件的 sml 层新增大量 C 代码时,由于无法为这些 C 代码编写单元测试(UT),会导致新增代码的覆盖率不达标,从而影响代码合并门禁通过。以下是从架构机制、工具支持和实践流程三个层面提供的完整解决方案。
一、问题背景分析
在 storage 组件中,SML(System Management Library)层通常包含大量与硬件直接交互的 C/C++ 代码。这类代码具有以下特点:
- 难以进行单元测试:依赖底层硬件或系统资源,难以在 UT 环境中模拟。
- 属于基础适配代码:如驱动封装、寄存器访问、芯片通信等,逻辑简单但不可或缺。
- 占比较高:一次提交可能新增数百行 C 代码,显著拉低整体增量覆盖率。
因此,若强制要求所有新增 C 代码都必须被 UT 覆盖,则会严重阻碍正常开发流程。
二、解决方案:代码屏蔽机制(Code Exclusion)
openUBMC 的 CI 门禁系统支持通过 代码屏蔽(Code Exclusion)机制 来合理排除某些无法测试的代码区域,避免其影响覆盖率统计结果。
1. 什么是代码屏蔽?
代码屏蔽是指在覆盖率分析阶段,将指定文件或代码段排除在覆盖率计算之外。这适用于:
- 自动生成的代码
- 硬件相关驱动代码
- 适配性封装代码
- 第三方库代码
参考链接:openLiBing
该页面展示了某次 MR 提交中的覆盖率检查报告,其中明确列出了需要“代码屏蔽审核”的内容。
2. 如何配置代码屏蔽?
方法一:使用 --coverage_exclude 参数(推荐)
在执行 bingo test 命令时,可通过 --coverage_exclude 参数指定一个白名单文件,列出不需要参与覆盖率统计的源码路径。
bingo test -ut -cov --coverage_exclude ./coverage_exclude.txt
其中 coverage_exclude.txt 示例内容如下:
# 排除 sml 层的 C/C++ 源文件
src/lualib_src/1_sml/*.cpp
src/lualib_src/1_sml/*.c
src/lualib_src/1_sml/*.h
此方式可在本地测试和 CI 流程中统一应用,确保覆盖率报告不包含这些文件。
方法二:在构建配置中声明排除规则
在组件的 test 配置节中定义 coverage_exclude 字段(取决于项目配置结构):
test:
coverage_exclude:
- "src/lualib_src/1_sml/**/*.c"
- "src/lualib_src/1_sml/**/*.cpp"
CI 系统会自动读取该配置并在生成覆盖率报告时跳过指定路径。
三、门禁流程中的应对策略
1. 主动申报 + 审核机制
当提交包含大量不可测 C 代码时,应遵循以下流程:
-
在 PR/MR 描述中说明情况:
- 明确指出新增了哪些 C 代码
- 说明为何无法编写 UT(如依赖硬件、仅做封装等)
- 提供
coverage_exclude.txt文件路径
-
提交代码屏蔽申请:
- CI 系统检测到覆盖率不足后,自动生成屏蔽待审核项
- 相关负责人需登录 openLibing 平台查看并审批
-
审批通过后门禁放行:
- 审批完成后,系统将临时允许本次 PR 的覆盖率不达标
- 或自动加载屏蔽规则重新生成覆盖率报告
2. 保证其他部分的高覆盖率
尽管 C 代码可以被排除,但仍需确保其他可测部分(尤其是 Lua 层逻辑)具有较高的测试覆盖率。
建议做法:
- 为 Lua 调用接口编写完整的 UT 和 IT
- 使用
luacov工具验证 Lua 代码覆盖率是否达到标准(如 ≥80%) - 在
temp/coverage/luacov.report.html中查看详细报告
四、参考案例:storage 组件实践
根据您提供的提交记录:
【修改描述】sml库代码移到storage仓-storage-AtomGit | GitCode
该提交涉及将 SML 库从独立仓库迁移至 storage 组件,必然引入大量原有 C/C++ 代码。
正确处理方式应为:
- 创建
coverage_exclude.txt文件,排除src/lualib_src/1_sml/下的所有.c/.cpp文件 - 在
bingo test中启用--coverage_exclude - 在 MR 描述中注明:“SML 层 C 代码已屏蔽,因依赖硬件环境无法 UT”
- 提交后等待门禁系统触发审批流程,并由负责人完成审核
五、总结与建议
| 项目 | 建议 |
|---|---|
使用 --coverage_exclude 排除 |
|
| 必须编写 UT,确保覆盖率达标 | |
| 主动说明屏蔽原因及范围 | |
| 支持人工审核与临时放行机制 |
最终建议命令
# 执行带排除规则的覆盖率测试
bingo test -ut -cov --coverage_exclude ./coverage_exclude.txt
并通过门禁平台完成代码屏蔽审核,即可顺利通过覆盖率门禁检查。
相关链接: