Google Test(简称 gtest)是 Google 开发的一个 C++ 测试框架,用于编写和运行单元测试。它提供了丰富的断言、测试夹具和测试套件功能,广泛应用于 C++ 项目的测试中。以下是 gtest 框架的详细介绍和使用方法:
1. gtest 的特点
- 简单易用:提供清晰的 API,易于编写和维护测试用例。
- 丰富的断言:支持多种断言类型(如
ASSERT_*
和EXPECT_*
)。 - 测试夹具:支持共享测试环境和资源。
- 参数化测试:支持通过参数化测试减少重复代码。
- 测试发现:自动发现和运行测试用例。
- 跨平台支持:支持 Windows、Linux 和 macOS。
2. 安装 gtest
(1) 使用包管理器安装
- Ubuntu/Debian:
sudo apt install libgtest-dev
- macOS:
brew install googletest
(2) 源码编译安装
- 下载 gtest 源码:
git clone https://github.com/google/googletest.git
- 编译并安装:
cd googletest mkdir build cd build cmake .. make sudo make install
3. 编写测试用例
(1) 基本测试用例
#include <gtest/gtest.h>// 测试函数
int Add(int a, int b) {return a + b;
}// 测试用例
TEST(AddTest, HandlesPositiveInput) {EXPECT_EQ(Add(1, 2), 3);EXPECT_EQ(Add(10, 20), 30);
}TEST(AddTest, HandlesNegativeInput) {EXPECT_EQ(Add(-1, -2), -3);EXPECT_EQ(Add(-10, -20), -30);
}
(2) 测试夹具
测试夹具用于共享测试环境和资源。
#include <gtest/gtest.h>class MyFixture : public ::testing::Test {
protected:void SetUp() override {// 初始化资源value = 42;}void TearDown() override {// 释放资源}int value;
};TEST_F(MyFixture, Test1) {EXPECT_EQ(value, 42);
}TEST_F(MyFixture, Test2) {value += 1;EXPECT_EQ(value, 43);
}
(3) 参数化测试
参数化测试可以减少重复代码。
#include <gtest/gtest.h>// 测试函数
int Multiply(int a, int b) {return a * b;
}// 参数化测试
class MultiplyTest : public ::testing::TestWithParam<std::tuple<int, int, int>> {};TEST_P(MultiplyTest, HandlesVariousInput) {int a = std::get<0>(GetParam());int b = std::get<1>(GetParam());int expected = std::get<2>(GetParam());EXPECT_EQ(Multiply(a, b), expected);
}INSTANTIATE_TEST_SUITE_P(MultiplyTestSuite,MultiplyTest,::testing::Values(std::make_tuple(2, 3, 6),std::make_tuple(4, 5, 20),std::make_tuple(-1, -1, 1))
);
4. 运行测试
(1) 编译测试代码
g++ -std=c++11 -isystem /path/to/gtest/include -pthread test.cpp /path/to/gtest/libgtest.a /path/to/gtest/libgtest_main.a -o test
(2) 运行测试
./test
(3) 输出示例
[==========] Running 3 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 2 tests from AddTest
[ RUN ] AddTest.HandlesPositiveInput
[ OK ] AddTest.HandlesPositiveInput (0 ms)
[ RUN ] AddTest.HandlesNegativeInput
[ OK ] AddTest.HandlesNegativeInput (0 ms)
[----------] 1 test from MyFixture
[ RUN ] MyFixture.Test1
[ OK ] MyFixture.Test1 (0 ms)
[----------] Global test environment tear-down
[==========] 3 tests from 2 test suites ran. (0 ms total)
[ PASSED ] 3 tests.
5. 常用断言
- 布尔值检查:
EXPECT_TRUE(condition)
:条件为真。EXPECT_FALSE(condition)
:条件为假。
- 数值比较:
EXPECT_EQ(val1, val2)
:等于。EXPECT_NE(val1, val2)
:不等于。EXPECT_LT(val1, val2)
:小于。EXPECT_LE(val1, val2)
:小于等于。EXPECT_GT(val1, val2)
:大于。EXPECT_GE(val1, val2)
:大于等于。
- 字符串比较:
EXPECT_STREQ(str1, str2)
:字符串相等。EXPECT_STRNE(str1, str2)
:字符串不相等。
- 异常检查:
EXPECT_THROW(statement, exception_type)
:抛出指定异常。EXPECT_NO_THROW(statement)
:不抛出异常。
6. 高级功能
(1) 测试套件
将多个测试用例组织成测试套件。
TEST(TestSuiteName, TestName1) {// 测试代码
}TEST(TestSuiteName, TestName2) {// 测试代码
}
(2) 测试过滤
运行指定的测试用例或测试套件。
./test --gtest_filter=TestSuiteName.TestName1
(3) 测试重复
重复运行测试用例。
./test --gtest_repeat=10
(4) 测试输出
生成 XML 格式的测试报告。
./test --gtest_output=xml:report.xml
总结
gtest 是一个功能强大且易于使用的 C++ 测试框架,支持单元测试、测试夹具、参数化测试等多种功能。通过掌握 gtest 的基本用法和高级功能,可以高效地编写和运行测试用例,确保代码的质量和可靠性。