19.1 单元测试框架
目录
- 19.1.1 TF-A测试体系概述
- 19.1.2 测试环境搭建
- 基础依赖
- 编译测试套件
- 测试执行示例
- 19.1.3 核心测试框架解析
- 测试用例结构
- 常用断言宏
- 19.1.4 典型测试场景实现
- 1. SMC处理测试
- 2. MMU配置测试
- 3. 电源管理测试
- 19.1.5 Mock框架使用
- 硬件寄存器模拟
- 19.1.6 测试覆盖率分析
- 生成覆盖率报告
- 覆盖率提升建议
- 19.1.7 最佳实践
19.1.1 TF-A测试体系概述
ARM Trusted Firmware-A采用分层测试策略:
- 单元测试:针对独立模块的隔离测试(本章重点)
- 集成测试:验证组件间交互(见19.2节)
- 系统级测试:完整启动链验证
测试框架特点:
- 基于CppUTest(轻量级C/C++单元测试框架)
- 支持模拟执行环境(Mock环境)
- 与Jenkins CI系统集成
19.1.2 测试环境搭建
基础依赖
# 安装CppUTest
sudo apt-get install cpputest
编译测试套件
# 在TF-A根目录执行
make PLAT=fvp TEST_GROUP=unit-tests all
测试执行示例
./build/fvp/release/tests/unit/<test_binary>
19.1.3 核心测试框架解析
测试用例结构
#include <CppUTest/TestHarness.h>
#include "module_under_test.h"TEST_GROUP(TestGroupName) {void setup() { /* 初始化代码 */ }void teardown() { /* 清理代码 */ }
};TEST(TestGroupName, TestCaseName) {// 测试断言CHECK_EQUAL(expected, actual);
}
常用断言宏
宏类型 | 示例 | 说明 |
---|---|---|
基本检查 | CHECK(condition) | 布尔条件检查 |
相等检查 | CHECK_EQUAL(a, b) | 值相等检查(不比较类型) |
内存比较 | MEMCMP_EQUAL(a, b, len) | 内存区域比较 |
异常检查 | CHECK_THROWS(expr, exc) | 异常抛出检查 |
19.1.4 典型测试场景实现
1. SMC处理测试
TEST(SmcHandlerTests, ValidSmcCall) {smc_args_t args = {.fid = PSCI_CPU_ON};int ret = handle_smc(&args);CHECK_EQUAL(PSCI_SUCCESS, ret);
}
2. MMU配置测试
TEST(MmuTests, TranslationTableSetup) {mmu_context_t ctx;init_mmu_tables(&ctx);CHECK_TRUE(check_table_alignment(ctx.ttbr0));
}
3. 电源管理测试
TEST(PscsiTests, CpuSuspendValidation) {uint32_t power_state = make_psci_power_state(...);CHECK_EQUAL(0, validate_power_state(power_state));
}
19.1.5 Mock框架使用
硬件寄存器模拟
#include <CppUTestExt/MockSupport.h>// 测试代码中模拟寄存器读操作
uint32_t mock_read_reg(uint32_t addr) {return mock().actualCall("read_reg").withParameter("addr", addr).returnUnsignedIntValue();
}// 测试用例中设置预期行为
TEST(GpioTests, PinSetTest) {mock().expectOneCall("read_reg").withParameter("addr", GPIO_BASE).andReturnValue(0x0);gpio_set_pin(5);// 验证后续行为...
}
19.1.6 测试覆盖率分析
生成覆盖率报告
# 使用gcov和lcov
make PLAT=fvp COVERAGE=on tests
lcov --capture --directory ./ --output-file coverage.info
genhtml coverage.info --output-directory cov_report
覆盖率提升建议
- 边界条件测试(如空指针、非法参数)
- 错误路径测试(所有错误返回分支)
- 状态转换测试(特别是状态机模块)
19.1.7 最佳实践
- 测试隔离原则:每个测试用例应独立运行
- 测试可重复性:不依赖外部环境状态
- 失败信息明确:断言消息应包含足够调试信息
- 测试分级:
- Level 1:核心功能验证(必须通过)
- Level 2:边界条件测试(release前必须通过)
- Level 3:性能/压力测试(定期执行)
注:TF-A的单元测试代码位于
/tests/unit
目录,建议结合具体平台代码阅读测试案例