一、GTest介绍
1.1 测试用例(Test Case)和 测试(Test):
-
TEST(): 宏,用于定义一个独立的测试。
-
测试套件名(Test Suite Name): 逻辑上的一组相关测试的集合(例如,
LinkedListTest,MathUtilsTest)。 -
测试名(Test Name): 单个测试的具体名称(例如,
InsertAtHead,AdditionOverflows)。 -
语法:
TEST(TestSuiteName, TestName) { ... test body ... }
1.2 断言(Assertions):
-
ASSERT_*: 如果断言失败,当前函数会立即返回(
ASSERT_EQ失败后,后面的语句不会执行)。-
ASSERT_TRUE(condition): 验证条件为真。 -
ASSERT_EQ(val1, val2): 验证两个值相等。 -
ASSERT_STREQ(str1, str2): 验证两个 C 字符串相等。 -
ASSERT_NE,ASSERT_LT,ASSERT_GE等。
-
-
EXPECT_*: 如果断言失败,测试会继续运行,并最终报告所有失败。这通常更受欢迎,因为它能一次运行显示所有问题。
-
EXPECT_TRUE(condition) -
EXPECT_EQ(val1, val2) -
EXPECT_STREQ(str1, str2) -
等等。
-
1.3 测试固件(Test Fixtures):
用于多个测试之间共享相同的配置和资源。对于测试需要初始化/清理的 C 结构体非常有用。
-
创建一个继承自
::testing::Test的类。 -
在类中定义你需要共享的变量(例如,一个
struct MyStruct*)。 -
重写
SetUp()方法(类似构造函数)进行初始化。 -
重写
TearDown()方法(类似析构函数)进行清理。 -
使用
TEST_F()宏来编写测试,它可以访问 fixture 中的成员。
1.4 打桩方法:链接时打桩(最常用、最推荐)
-
不将真实的实现文件编译并链接到测试可执行文件中。
-
在你的测试文件(
test_database.cpp)中,重新定义(rewrite) 你需要打桩的函数。 -
可能遇到的问题:函数重定义,解决方法:链接装饰器(推荐):在打桩函数前加前缀__wrap_,在测试文件对应的CMakeLists.txt文件中添加:
target_link_options(target PRIVATE
# "LINKER:--allow-multiple-definition"
"LINKER:--wrap=打桩函数名称"
)
- 打桩函数模板(可选,用于需要精确返回值,通过队列实现):
template <typename T> class IgnoreAndReturn_Mock { public: std::queue<T> returnValues; int callCount; // 重置mock状态 void reset() { while (!returnValues.empty()) returnValues.pop(); callCount = 0; } // 设置返回值序列 void setReturnSequence(const std::vector<T>& values) { reset(); for (const T& val : values) { returnValues.push(val); } } };打桩模板类使用方法:
//创建打桩模板类对象 IgnoreAndReturn_Mock<bool> test_Mock; //桩函数 extern "C" bool __wrap_test() { if (test_Mock.returnValues.empty()) { ADD_FAILURE() << "error,returnValues is empty"; } test_Mock.callCount++; int result = test_Mock.returnValues.front(); test_Mock.returnValues.pop(); return result; } //使用过程,在测试用例中调用被测函数前,先对桩模板对象进行重置和设置期望返回值序列 test_Mock.reset(); test_Mock.setReturnSequence({False,False,False,False,False,False});
1.5 对比Ceedling测试工具
核心区别:一体化框架 vs. 组合式组件
-
Ceedling:是一个一体化的、高度集成的测试框架和构建系统。它本身不是测试框架,而是一个用Ruby构建的“元工具”(metatool)。它集成了:
-
Unity:一个极简的、纯C的单元测试框架(提供断言、测试运行)。
-
CMock:一个强大的自动打桩(Mock)工具。
-
CException:可选,用于异常处理。
Ceedling为你安排好了一切:目录结构、构建过程(调用底层的GCC等编译器)、运行测试、生成报告。你只需要遵循它的规则。
-
-
Gtest:是Google开发的一个功能强大的C++单元测试框架。它专注于一件事:提供丰富的断言、测试固件、组织测试用例。它不处理C语言的打桩(你需要自己手动或借助其他工具),也不强制规定你的项目结构或构建系统(通常与CMake/Makefile结合使用)。
总体而言,Ceedling更容易上手,更方便打桩,但仅仅支持纯C语言项目,GTest基于CMake工具,灵活性更高,但打桩比较麻烦,支持C/C++。
如果想了解Ceedling的使用方法,可以参考:
2368



被折叠的 条评论
为什么被折叠?



