当前位置: 首页 > article >正文

C++ gtest框架

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) 源码编译安装
  1. 下载 gtest 源码:
    git clone https://github.com/google/googletest.git
    
  2. 编译并安装:
    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 的基本用法和高级功能,可以高效地编写和运行测试用例,确保代码的质量和可靠性。


http://www.kler.cn/a/563683.html

相关文章:

  • 【react】TypeScript在react中的使用
  • kafka的ACL配置的sasl.kerberos.principal.to.local.rules配置解释
  • 简单易懂,解析Go语言中的struct结构体
  • Spring 源码硬核解析系列专题(五):Spring Boot 自动装配的原理
  • Fiddler在Windows下抓包Https
  • 支持自动化数据回放
  • spirng相关面试题
  • 云原生(五十七) | 阿里云CDN基本概念
  • 力扣LeetCode:1472 设计浏览器历史记录
  • Ubuntu 下 nginx-1.24.0 源码分析 - pool->cleanup
  • Graph and GNN——图的表示与图神经网络的介绍与应用
  • 青少年编程与数学 02-010 C++程序设计基础 11课题、程序结构
  • 手机放兜里,支付宝“碰一下”被盗刷?
  • Selenium八大元素定位方式
  • Docker 基本概念[SpringBoot之Docker实战系列] - 第536篇
  • 机试刷题_NC52 有效括号序列【python】
  • 基于 Python 的网络监控系统开发全解
  • 【我的 PWN 学习手札】IO_FILE 之 利用IO_validate_vtable劫持程序流
  • Linux(Centos 7.6)命令详解:uniq
  • 从 0 到 1,用 Python 构建超实用 Web 实时聊天应用