Z
ZHANK
编程在线教程C++ 教程Google Test 单元测试
工程与工具

Google Test 单元测试

gtest 断言/期望、TEST_F 夹具、参数化测试、Mock 模拟

Google Test 单元测试

Google Test 是 C++ 最流行的测试框架——丰富的断言、TEST_F 夹具、参数化测试。

学完本章你将: 掌握 gtest 断言/期望、TEST_F 夹具、参数化测试。


基本测试

cpp
#include <gtest/gtest.h>

int add(int a, int b) { return a + b; }

TEST(AddTest, PositiveNumbers) {
    EXPECT_EQ(add(2, 3), 5);
    EXPECT_GT(add(5, 5), 0);  // > 0
}

TEST(AddTest, Zero) {
    EXPECT_EQ(add(0, 0), 0);
    EXPECT_EQ(add(0, 5), 5);
}
bash
g++ -std=c++17 test.cpp -lgtest -lgtest_main -pthread -o test
./test

TEST_F 夹具 —— 共享初始化

cpp
class DatabaseTest : public ::testing::Test {
protected:
    void SetUp() override {
        // 每个测试前执行
        db = std::make_unique<Database>(":memory:");
        db->initialize();
    }
    void TearDown() override { db.reset(); }
    std::unique_ptr<Database> db;
};

TEST_F(DatabaseTest, InsertAndQuery) {
    db->insert("key1", "value1");
    EXPECT_EQ(db->query("key1"), "value1");
}

参数化测试

cpp
class AddParamTest : public ::testing::TestWithParam<std::tuple<int, int, int>> {};

TEST_P(AddParamTest, Works) {
    auto [a, b, expected] = GetParam();
    EXPECT_EQ(add(a, b), expected);
}

INSTANTIATE_TEST_SUITE_P(Values, AddParamTest, ::testing::Values(
    std::tuple{2, 3, 5},
    std::tuple{0, 0, 0},
    std::tuple{-1, 1, 0}
));