概述:Google Test 测试框架备忘
前言
Google Test(gtest)是 Google 开发的 C++ 单元测试框架,配合 Google Mock(gmock)可进行打桩、行为验证、依赖注入式测试。本页主要记录如何对 DLL / 动态库进行单元测试的两种方式。
基础断言速查
| 断言 | 说明 |
|---|---|
EXPECT_EQ(a, b) | 相等(失败不终止,继续执行) |
EXPECT_NE(a, b) | 不相等 |
ASSERT_EQ(a, b) | 相等(失败即终止当前用例) |
EXPECT_TRUE(x) | 为真 |
EXPECT_FALSE(x) | 为假 |
EXPECT_THROW(expr, type) | 期望抛出指定异常 |
SUCCEED() / FAIL() | 强制成功 / 失败 |
EXPECT_*失败后继续执行用于收集更多信息,ASSERT_*失败后直接返回,适合后续步骤依赖前置断言的情况。
如何搭建测试工程
- 引入 gtest(源码编译或 vcpkg/conan 安装)。
- 新建测试项目,链接 gtest 库。
- 编写
TEST(TestSuite, TestName) { ... }测试用例。 - 通过
RUN_ALL_TESTS()运行,或使用 vscode-test-adapter / CLion / VS 测试资源管理器。
cpp
#include <gtest/gtest.h>
TEST(MathTest, Add) {
EXPECT_EQ(1 + 1, 2);
}
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}如何测试DLL文件
隐式步骤加载
步骤
- 在测试项目中配置动态库的头文件路径和导入库(.lib文件)。
- 直接调用
DLL导出的函数,Google Test用例编写与普通函数测试无异
cpp
#include "dll_header.h" // DLL的头文件
TEST(DllTest, BasicFunction) {
EXPECT_EQ(dll_add(2, 3), 5); // 直接调用DLL函数
}适用场景:DLL已明确导出符号,且测试环境能正确加载依赖项。
显式步骤加载
- 灵活但复杂
步骤
- 使用
LoadLibrary(Windows)或dlopen(Linux)加载DLL。 - 通过
GetProcAddress或dlsym获取函数指针并调用。
cpp
TEST(DllTest, DynamicLoad) {
HINSTANCE hDll = LoadLibrary(L"mylib.dll");
ASSERT_NE(hDll, nullptr) << "DLL加载失败";
auto func = (int(*)(int, int))GetProcAddress(hDll, "dll_add");
ASSERT_NE(func, nullptr) << "函数未找到";
EXPECT_EQ(func(2, 3), 5);
FreeLibrary(hDll);
}注:示例中的
dll_add为示意导出函数名,实际使用时需替换为被测 DLL 的真实导出符号。
两种方式对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| 隐式加载 | 简单、类型安全、可直接调用 | 需配置头文件和导入库;依赖项缺失时无法加载 |
| 显式加载 | 灵活、可运行时按需加载 | 需手动管理生命周期、类型不安全 |