GTest 是一个跨平台的 C++单元测试框架,由 google 公司发布。gtest 是为了在不同平台上为编写 **C++**单元测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化等等测试所需的宏,以及全局测试,单元测试组件。
主要特性如下所示:
- 跨平台支持:支持
Linux、Windows、MacOS等主流平台。 - 易于使用:简单直观的语法,容易上手。
- 丰富的断言:支持多种断言(如比较、布尔、字符串等)。
- 测试组织:支持分组、参数化测试。
- 灵活的报告格式:可生成
XML测试报告,方便与CI/CD集成。 - Mock 支持:通过
Google Mock实现更复杂的单元测试。
安装命令如下所示:
sudo apt-get install libgtest-dev 然后可以用下面指令验证是否安装成功:
ls /usr/include/gtest/
whereis libgtest.a二、gtest使用
1. 头文件 && 链接库
注意在编译的时候要链接库!
// 头文件:
include <gtest/gtest.h>
// makefile文件:
g++ -std=c++17 -o $@ $^ -lgtest2. 框架初始化接口
testing::InitGoogleTest(&argc, argv);3. 调用测试样例
一般我们会在程序最后才调用测试样例,故可以直接在主函数的 return 语句中调用!
...
int main()
{
...
return RUN_ALL_TESTS(); // 在程序最后进行测试样例调用
}4. TEST宏
-
TEST:主要用来创建一个简单测试, 它定义了一个测试函数, 在这个函数中可以使用任何
C++代码并且使用框架提供的断言进行检查。// 1. 同测试下多个测试样例不能同名! // 2. 两个名称都是可以用中文的,只要编译器支持正确的编码处理即可! TEST(TestSuiteName, TestName) { // 测试代码 EXPECT_TRUE(true); // 示例断言 } -
TEST_F:主要用来进行多样测试,适用于多个测试场景如果需要相同的数据配置的情况, 即相同的数据测不同的行为。
FixtureName:测试夹具类名称,继承自::testing::Test。SetUp和TearDown:分别在每个测试用例运行前和运行后执行。
// 样例示范 #include <gtest/gtest.h> class MathTestFixture : public ::testing::Test { protected: void SetUp() override { // 初始化共享资源 x = 10; y = 20; } void TearDown() override { // 清理工作 } int x; int y; }; TEST_F(MathTestFixture, Addition) { EXPECT_EQ(x + y, 30); // 检查 x + y 是否等于 30 } TEST_F(MathTestFixture, Multiplication) { EXPECT_EQ(x * y, 200); // 检查 x * y 是否等于 200 }
5. 断言宏
GTest 中的断言的宏可以分为两类:
• ASSERT_系列:如果当前点检测失败,则退出当前测试函数。
• EXPECT_系列:如果当前点检测失败,仍然继续往下执行。
下面是常用的断言:
- 基本比较:
EXPECT_EQ(val1, val2):期望 val1 == val2EXPECT_NE(val1, val2):期望 val1 != val2EXPECT_LT(val1, val2):期望 val1 < val2EXPECT_LE(val1, val2):期望 val1 <= val2EXPECT_GT(val1, val2):期望 val1 > val2EXPECT_GE(val1, val2):期望 val1 >= val2
- 布尔表达式:
EXPECT_TRUE(condition):期望 condition 为 trueEXPECT_FALSE(condition):期望 condition 为 false
- 字符串:
EXPECT_STREQ(str1, str2):期望 str1 和 str2 内容相同EXPECT_STRNE(str1, str2):期望 str1 和 str2 内容不同
- 浮点数:
EXPECT_FLOAT_EQ(val1, val2):期望 val1 和 val2 近似相等(单精度)EXPECT_DOUBLE_EQ(val1, val2):期望 val1 和 val2 近似相等(双精度)
6. 举个例子
上面 TEST_F 已经举过例子了,这里就举一下 TEST 宏的例子:
#include <iostream>
#include <string>
#include <gtest/gtest.h>
using namespace std;
int add(int a, int b)
{
return a + b;
}
TEST(测试名称, 加法用例测试) {
ASSERT_EQ(add(1, 2), 3);
ASSERT_LT(add(1, 2), 4);
ASSERT_LT(add(1, 2), 2);
ASSERT_NE(add(1, 2), 2);
cout << "执行到尾部!" << endl;
}
TEST(测试名称, 字符串拼接) {
std::string a = "Hello, ";
std::string b = "World!";
ASSERT_EQ(a + b, "Hello, World!"); // 检查字符串拼接
}
int main(int argc, char* argv[])
{
// 初始化
testing::InitGoogleTest(&argc, argv);
// 运行所有测试样例
return RUN_ALL_TESTS();
} 再写个 makefile 文件:
main : main.cc
g++ -std=c++17 -o $@ $^ -lgtest 然后执行可以得到下面的信息:
可以发现并没有执行输出语句,故没有执行到尾部,换成 EXPECT 宏则可以!