如何在单个Ceedling单元测试中验证多硬件版本驱动并合并覆盖率?
多硬件版本驱动的Ceedling单元测试与覆盖率合并方案
针对你的需求,完全可以在单个Ceedling项目中完成两个硬件版本的测试验证,并且合并覆盖率结果得到全代码库的单一报告,具体方案如下:
一、单个项目内实现多版本测试验证
Ceedling支持通过多环境编译配置,在同一个项目中针对不同硬件版本生成测试代码并执行,无需维护两个独立项目:
- 修改项目配置文件
project.yml
添加多组编译定义和测试环境,同时开启覆盖率统计:
# 定义不同硬件版本的编译宏 :defines: :common: [] :hw_version_1: - HW_VERSION_1 :hw_version_2: - HW_VERSION_2 # 配置多测试环境 :test_build: :environments: - :hw_version_1 - :hw_version_2 # 开启覆盖率统计(为后续合并做准备) :gcov: :enabled: true :gcovr: :enabled: true
- 调整单元测试代码
将不同版本的测试逻辑拆分到对应环境的测试用例中,结构更清晰:
#include "unity.h" #include "my_driver.h" // HW_VERSION_1 专属测试用例 #ifdef HW_VERSION_1 TEST_CASE("HWv1: myfunction 参数超出[0,5]范围时返回错误", "[hw1]") { check_if_param_invalid((int[]){-1, 6}); } TEST_CASE("HWv1: myfunction 合法参数调用时执行fct1", "[hw1]") { fct1_Expect(); TEST_ASSERT_TRUE(myfunction(3)); } #endif // HW_VERSION_2 专属测试用例 #ifdef HW_VERSION_2 TEST_CASE("HWv2: myfunction 参数超出[5,10]范围时返回错误", "[hw2]") { check_if_param_invalid((int[]){4, 11}); } TEST_CASE("HWv2: myfunction 合法参数调用时执行fct2", "[hw2]") { fct2_Expect(); TEST_ASSERT_TRUE(myfunction(6)); } #endif
- 执行全版本测试
运行以下命令,Ceedling会自动分别编译两个版本的代码和测试用例,并执行所有测试:
ceedling test:all
二、合并多版本覆盖率结果
默认情况下Ceedling会为每个环境生成单独的覆盖率报告,我们可以用gcovr工具合并这些结果,得到包含所有硬件分支的单一覆盖率报告:
安装gcovr
确保环境中已安装gcovr(可通过pip安装:pip install gcovr)生成合并覆盖率报告
在项目根目录执行以下命令,扫描所有测试生成的gcov文件,合并后生成HTML格式的详细覆盖率报告:
gcovr -r . --html --html-details -o build/test/reports/combined_coverage.html
- 集成到Ceedling任务(可选)
如果想一键完成测试+合并,可以在project.yml中添加自定义任务:
:tasks: :combined_coverage: - ceedling test:all - gcovr -r . --html --html-details -o build/test/reports/combined_coverage.html
之后只需运行ceedling combined_coverage即可完成所有操作。
通过以上方案,你可以在单个项目中完成两个硬件版本的测试验证,并且得到一份包含所有#ifdef分支的全代码库覆盖率报告,直观掌握整体测试质量。
内容的提问来源于stack exchange,提问作者G. B.
相关产品推荐
相关产品推荐

