单元测试开发指南
本指南旨在帮助开发者为
virt-awaresched项目编写高质量的 C++ 单元测试(Unit Test, UT)。我们将介绍整体测试框架、环境搭建、用例编写规范以及运行与覆盖率分析方法,确保代码质量可控、可维护。
测试框架说明
我们采用 Google Test (GTest) 作为核心单元测试框架,并结合 MockCpp 实现对外部依赖的行为模拟,以支持复杂模块的隔离测试。
技术栈
表 1 工具用途说明
| 工具 | 用途 |
|---|---|
| GoogleTest | C++ 单元测试框架,提供断言、测试套件管理等功能。 |
| MockCpp | 轻量级 C++ Mock 框架,用于接口打桩与行为验证。 |
| CMake | 构建系统,自动化编译与链接测试目标。 |
| Bash Script | 封装构建脚本 (build.sh),简化操作流程。 |
编译构建
单元测试使用cmake进行构建和管理,详细内容在test目录下可以进行查看。
环境准备
-
开发环境搭建参考《构建指导》。
-
推荐在
openEuler Linux (ARM64)下执行项目构建,进入vir-awaresched所在目录。 -
执行以下命令:
bash build.sh test
增加单元测试用例
场景一:向已有测试文件补充用例
背景设定
开发者想针对当前的业务代码
src/vasd/cluster_sched/cluster_sched.cpp中的UpdateDomainInfo函数添加测试用例,当前在test/vasd/cluster_sched/test_cluster_sched.cpp已经存在部分用例。
新增测试代码
在test/vasd/cluster_sched/test_cluster_sched.cpp中新增如下代码:
TEST_F(TestClusterSched, testUpdateDomainInfo1)
{
MOCKER_CPP(&LibvirtHelper::GetVmInfoList, VasRet(LibvirtHelper::*)(VmInfoMap &))
.stubs()
.will(invoke(GetVmInfoListMockSuccess));
MOCKER(&ClusterSched::SelectVmNuma).stubs().will(returnValue(VAS_OK));
MOCKER(&ClusterSched::Alloc).stubs().will(returnValue(VAS_ERROR)).then(returnValue(VAS_OK));
MOCKER(&ClusterSched::Assign).stubs().will(returnValue(VAS_ERROR)).then(returnValue(VAS_OK));
std::string domainKey = uuid01 + "_0";
EXPECT_EQ(ClusterSched::GetInstance().UpdateDomainInfosAndSched(), VAS_OK);
EXPECT_FALSE(ClusterSched::GetInstance().domainMap_[domainKey].isReScheded);
EXPECT_EQ(ClusterSched::GetInstance().UpdateDomainInfosAndSched(), VAS_OK);
EXPECT_FALSE(ClusterSched::GetInstance().domainMap_[domainKey].isReScheded);
EXPECT_EQ(ClusterSched::GetInstance().UpdateDomainInfosAndSched(), VAS_OK);
EXPECT_TRUE(ClusterSched::GetInstance().domainMap_[domainKey].isReScheded);
}
验证用例
在virt-aware目录下对用例进行用例验证。
执行以下命令:
bash build.sh test -- --gtest_filter="TestClusterSched.testUpdateDomainInfo1"
其中,TestClusterSched为**TestSuite名,testUpdateDomainInfo1为TestName**。
场景二:为新业务模块创建全新单元测试
背景设定
开发者在当前项目基础上,增加了新的业务功能,希望对新的业务代码编写对应的单元测试。以本项目的
api模块为例,开发者完成了api模块,代码位于src/vasd/api,目前需要进行单元测试。
查找模块名
查看src/vasd/api下日志模块的CMakeLists库名为api。
增加模块UT目录
在 test/vasd目录下新建 api目录,并创建CMakeLists.txt文件,在CMakeLists.txt文件中加入如下内容:
add_ut(ubse_log)
在 test目录下CMakeLists.txt文件中添加如下内容:

开发UT代码
在test/api目录下新建测试文件test_api.h和test_api.cpp,完成对具体的业务代码的测试,在TestApi测试套中写了一个测试用例. 详细测试代码, 请参考test/vasd/api/。
运行模块的UT代码
在virt-awaresched目录下, 运行bash build.sh test -- --gtest_filter="TestApi.*"查看用例运行情况。