Skip to content

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();
}

全局环境适合昂贵资源,例如临时测试数据库、全局日志系统、模拟设备服务。不要用它传递测试之间的隐式状态。