简介
Google Test (GTest) 是 Google 开发的一个用于 C++ 的开源测试框架,用于编写单元测试和功能测试。它是 Google Test Framework 的一部分,广泛用于测试 C++ 代码,它提供了丰富的断言、致命和非致命判断、参数化、死亡测试等等。GTest的特点如下:
- 开源: GTest 是一个开源项目,你可以自由使用和修改它。
- 跨平台: GTest 支持多个操作系统和编译器,包括Linux、Windows、macOS和各种C++编译器。
- 详细报告: GTest 提供详细的测试结果报告,告诉你哪些测试通过,哪些失败。
- 参数化测试: 你可以轻松地编写参数化测试来验证不同输入值的不同情况。
- 丰富断言: GTest 提供了各种断言宏,使测试编写更容易,如 ASSERT_EQ、ASSERT_TRUE、EXPECT_NE 等。
- 丰富输出: GTest 可以生成 XML 格式的输出,便于集成到持续集成工具中。
安装
通常,你需要从源代码构建 GTest。可以从 GitHub 仓库 下载源代码,然后按照其中的 README 或文档进行构建和安装。
基本用法
当使用 GTest 进行 C++ 代码测试时,首先需要安装 GTest 并创建一个测试用例。以下是一个简单的示例演示如何测试一个函数,假设你已经安装了 GTest。
让我们假设你要测试一个非常简单的函数 add,该函数接受两个整数并返回它们的和。我们将编写一个测试来验证这个函数的行为。
1、编写 C++ 代码:
// add.cpp
int add(int a, int b) {
return a + b;
}
2、编写测试代码:
// test_add.cpp
#include <gtest/gtest.h>
#include "add.h" // 引入你要测试的头文件
TEST(AddTest, PositiveNumbers) {
EXPECT_EQ(add(2, 3), 5); // 2 + 3 = 5
EXPECT_EQ(add(100, 200), 300); // 100 + 200 = 300
}
TEST(AddTest, NegativeNumbers) {
EXPECT_EQ(add(-2, -3), -5); // -2 + -3 = -5
EXPECT_EQ(add(-5, 5), 0); // -5 + 5 = 0
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
3、编译测试代码:
g++ -o test_add test_add.cpp add.cpp -lgtest -lgtest_main -pthread
4、运行测试:
./test_add
你将看到 GTest 运行测试用例,并输出测试结果报告。如果所有的测试通过,你将看到类似以下的输出:
[==========] Running 4 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 2 tests from AddTest/PositiveNumbers
[ RUN ] AddTest/PositiveNumbers/0
[ OK ] AddTest/PositiveNumbers/0 (0 ms)
[ RUN ] AddTest/PositiveNumbers/1
[ OK ] AddTest/PositiveNumbers/1 (0 ms)
[----------] 2 tests from AddTest/PositiveNumbers (0 ms total)
[----------] 2 tests from AddTest/NegativeNumbers
[ RUN ] AddTest/NegativeNumbers/0
[ OK ] AddTest/NegativeNumbers/0 (0 ms)
[ RUN ] AddTest/NegativeNumbers/1
[ OK ] AddTest/NegativeNumbers/1 (0 ms)
[----------] 2 tests from AddTest/NegativeNumbers (0 ms total)
...
[----------] Global test environment tear-down
[==========] 4 tests from 2 test cases ran. (1 ms total)
[ PASSED ] 4 tests.
如果有测试失败,你将看到相应的失败信息。
ASSERT 和 EXPECT断言
gtest 使用一系列断言的宏来检查值是否符合预期,主要分为两类:ASSERT 和 EXPECT。区别在于 ASSERT 不通过的时候会认为是一个 fatal 的错误,退出当前函数(只是函数)。而 EXPECT 失败的话会继续运行当前函数,所以对于函数内几个失败可以同时报告出来。通常我们用 EXPECT 级别的断言就好,除非你认为当前检查点失败后函数的后续检查没有意义。
使用gtest需包含头文件 gtest/gtest.h, 并链接库 gtest_main.lib 和 gtest.lib.
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | condition is true |
ASSERT_FALSE(condition); | EXPECT_FALSE(condition); | condition is false |
数值比较
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_EQ(val1, val2); | EXPECT_EQ(val1, val2); | val1 == val2 |
ASSERT_NE(val1, val2); | EXPECT_NE(val1, val2); | val1 != val2 |
ASSERT_LT(val1, val2); | EXPECT_LT(val1, val2); | val1 < val2 |
ASSERT_LE(val1, val2); | EXPECT_LE(val1, val2); | val1 <= val2 |
ASSERT_GT(val1, val2); | EXPECT_GT(val1, val2); | val1 > val2 |
ASSERT_GE(val1, val2); | EXPECT_GE(val1, val2); | val1 >= val2 |
字符串比较
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_STREQ(str1, str2); | EXPECT_STREQ(str1, _str_2); | the two C strings have the same content |
ASSERT_STRNE(str1, str2); | EXPECT_STRNE(str1, str2); | the two C strings have different content |
ASSERT_STRCASEEQ(str1, str2); | EXPECT_STRCASEEQ(str1, str2); | the two C strings have the same content, ignoring case |
ASSERT_STRCASENE(str1, str2); | EXPECT_STRCASENE(str1, str2); | the two C strings have different content, ignoring case |