GoogleTest API 说明
GoogleTest API 可以按“定义测试、表达断言、控制运行、扩展报告”四类理解。
定义测试
| API | 用途 |
|---|---|
TEST(SuiteName, TestName) |
定义普通测试 |
TEST_F(FixtureName, TestName) |
使用测试夹具 |
TEST_P(FixtureName, TestName) |
定义值参数化测试 |
INSTANTIATE_TEST_SUITE_P |
实例化值参数化测试 |
TYPED_TEST_SUITE |
定义类型参数化测试类型集合 |
TYPED_TEST |
定义类型参数化测试 |
布尔与比较断言
| 断言 | 说明 |
|---|---|
EXPECT_TRUE(condition) |
条件为真 |
EXPECT_FALSE(condition) |
条件为假 |
EXPECT_EQ(a, b) |
相等 |
EXPECT_NE(a, b) |
不相等 |
EXPECT_LT(a, b) |
小于 |
EXPECT_LE(a, b) |
小于等于 |
EXPECT_GT(a, b) |
大于 |
EXPECT_GE(a, b) |
大于等于 |
优先使用专用比较断言,而不是 EXPECT_TRUE(a == b)。专用断言能输出左右值,失败信息更清楚。
字符串断言
| 断言 | 说明 |
|---|---|
EXPECT_STREQ(a, b) |
C 字符串内容相等 |
EXPECT_STRNE(a, b) |
C 字符串内容不等 |
EXPECT_STRCASEEQ(a, b) |
忽略大小写相等 |
EXPECT_STRCASENE(a, b) |
忽略大小写不等 |
std::string 通常直接使用 EXPECT_EQ。
浮点断言
浮点数不适合直接使用 EXPECT_EQ,应考虑误差。
TEST(FloatTest, ComparesWithTolerance) {
const double value = 0.1 + 0.2;
EXPECT_NEAR(value, 0.3, 1e-12);
}
| 断言 | 说明 |
|---|---|
EXPECT_FLOAT_EQ(a, b) |
单精度近似相等 |
EXPECT_DOUBLE_EQ(a, b) |
双精度近似相等 |
EXPECT_NEAR(a, b, abs_error) |
指定绝对误差 |
异常断言
#include <stdexcept>
int ParsePositive(const std::string& text) {
int value = std::stoi(text);
if (value <= 0) {
throw std::invalid_argument("value must be positive");
}
return value;
}
TEST(ParseTest, ThrowsWhenValueIsNotPositive) {
EXPECT_THROW(ParsePositive("0"), std::invalid_argument);
EXPECT_NO_THROW(ParsePositive("42"));
}
| 断言 | 说明 |
|---|---|
EXPECT_THROW(statement, exception_type) |
期望抛出指定异常 |
EXPECT_ANY_THROW(statement) |
期望抛出任意异常 |
EXPECT_NO_THROW(statement) |
期望不抛异常 |
显式成功与失败
| API | 说明 |
|---|---|
SUCCEED() |
显式记录成功点 |
FAIL() |
致命失败并返回 |
ADD_FAILURE() |
非致命失败 |
GTEST_SKIP() |
跳过当前测试 |
TEST(DeviceTest, SkipsWhenDeviceUnavailable) {
const bool has_device = false;
if (!has_device) {
GTEST_SKIP() << "device is not connected";
}
}
自定义失败信息
断言支持使用流操作符追加上下文。
EXPECT_EQ(actual_size, expected_size)
<< "buffer name: " << buffer_name;
谓词断言
当判断逻辑复杂时,可以使用谓词断言返回更清楚的错误信息。
::testing::AssertionResult IsValidPort(int port) {
if (port >= 1 && port <= 65535) {
return ::testing::AssertionSuccess();
}
return ::testing::AssertionFailure() << "invalid port: " << port;
}
TEST(NetworkTest, ValidatesPort) {
EXPECT_TRUE(IsValidPort(8080));
}
匹配器
GoogleTest 和 GoogleMock 提供匹配器风格断言。常见写法如下:
#include <gmock/gmock.h>
TEST(ContainerTest, ContainsExpectedValues) {
std::vector<int> values = {1, 2, 3};
EXPECT_THAT(values, ::testing::ElementsAre(1, 2, 3));
EXPECT_THAT(values, ::testing::Contains(2));
}
| 匹配器 | 说明 |
|---|---|
Eq(value) |
相等 |
Ne(value) |
不相等 |
Contains(value) |
容器包含值 |
ElementsAre(...) |
容器元素逐个匹配 |
UnorderedElementsAre(...) |
容器元素无序匹配 |
HasSubstr(text) |
字符串包含子串 |
StartsWith(text) |
字符串前缀 |
EndsWith(text) |
字符串后缀 |
运行控制 API
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
多数工程可以直接链接 GTest::gtest_main,不必手写 main。需要自定义日志、全局环境或命令行参数解析时,再手写 main。
全局环境
class GlobalEnvironment : public ::testing::Environment {
public:
void SetUp() override {
// 初始化全局资源
}
void TearDown() override {
// 释放全局资源
}
};
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
::testing::AddGlobalTestEnvironment(new GlobalEnvironment);
return RUN_ALL_TESTS();
}
全局环境适合昂贵资源,例如临时测试数据库、全局日志系统、模拟设备服务。不要用它传递测试之间的隐式状态。