简介

  • gtest库笔记

C++ gtest是什么

gtest 是 Google Test 的简称,是一个由Google开发的C++测试框架。它用于编写和运行C++单元测试,旨在帮助开发人员进行测试驱动开发(TDD)和进行单元测试。以下是对 gtest 的一些主要特点和用法的简要说明:

主要特点:

  1. 模块化框架: gtest 提供了一个模块化的测试框架,可以轻松地编写和组织测试用例。

  2. 测试用例: 通过定义测试用例,可以将一组相关的测试组织在一起。每个测试用例可以包含多个测试。

  3. 断言: gtest 提供了一系列的断言宏,用于判断测试条件是否为真。例如,ASSERT_EQ 用于判断两个值是否相等,ASSERT_TRUE 用于判断条件是否为真等。

  4. 丰富的输出: 在测试运行时,gtest 提供详细的输出,显示测试通过或失败的信息,以及失败时的具体条件和值。

  5. 测试夹具(Fixture): 可以使用测试夹具在多个测试之间共享共同的设置和状态。测试夹具提供了 SetUp()TearDown() 方法,分别在测试开始和结束时执行。

  6. 参数化测试: gtest 支持参数化测试,允许使用不同的输入参数运行相同的测试用例。

使用方法:

  1. 安装 gtest 下载 gtest 源代码,编译生成库文件,并将其集成到你的项目中。或者,可以使用包管理工具(如CMake、Conan等)直接获取 gtest

  2. 编写测试用例: 创建一个或多个测试文件,定义测试用例和测试函数。在测试函数中使用 gtest 提供的断言宏进行测试。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    #include <gtest/gtest.h>
    
    TEST(MyTestSuite, MyTestCase) {
        ASSERT_EQ(2 + 2, 4);
    }
    
    TEST(MyTestSuite, AnotherTestCase) {
        ASSERT_TRUE(true);
    }
    
  3. 运行测试: 使用测试框架运行测试。测试框架会执行所有测试用例,并输出测试结果。

    1
    2
    3
    4
    
    int main(int argc, char **argv) {
        ::testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    }
    
  4. 查看测试结果: 测试框架会输出详细的测试结果,显示每个测试用例的执行情况。

gtest 是一个强大而灵活的测试框架,被广泛用于C++项目中的单元测试。它可以帮助开发人员确保代码的质量,检测潜在的问题,并提供可靠的单元测试基础。

C++ gtest库 详解

Google Test(gtest)是一个C++的单元测试框架,由Google开发。它允许你编写测试,进行断言和生成测试报告。以下是对gtest库的详细解释:

安装 gtest:

  1. 源代码下载:Google Test GitHub 下载最新的源代码。

  2. 编译 gtest: 使用CMake工具构建gtest库。在下载的gtest目录中创建一个build目录,进入该目录并运行:

    1
    2
    
     cmake ..
     make
    

    这将生成libgtest.a和libgtest_main.a库文件。

  3. 集成到项目: 将生成的库文件集成到你的C++项目中,并包含gtest头文件。你可以将gtest的 include 目录添加到你的项目中,同时链接到生成的库文件。

编写测试用例:

  1. 包含头文件: 在测试文件中,首先包含gtest头文件:

    1
    
     #include <gtest/gtest.h>
    
  2. 定义测试用例: 使用TEST宏定义测试用例:

    1
    2
    3
    4
    
     TEST(TestSuiteName, TestName) {
         // Your test logic and assertions go here
         ASSERT_EQ(2 + 2, 4);
     }
    
  3. 运行测试: 在主函数中调用 ::testing::InitGoogleTest 初始化gtest,并运行所有测试用例:

    1
    2
    3
    4
    
     int main(int argc, char **argv) {
         ::testing::InitGoogleTest(&argc, argv);
         return RUN_ALL_TESTS();
     }
    

常用断言宏:

  • ASSERT_TRUE(condition):如果条件为真,测试通过。
  • ASSERT_FALSE(condition):如果条件为假,测试通过。
  • ASSERT_EQ(expected, actual):如果两个值相等,测试通过。
  • ASSERT_NE(val1, val2):如果两个值不相等,测试通过。
  • ASSERT_LT(val1, val2):如果第一个值小于第二个值,测试通过。
  • ASSERT_LE(val1, val2):如果第一个值小于或等于第二个值,测试通过。
  • ASSERT_GT(val1, val2):如果第一个值大于第二个值,测试通过。
  • ASSERT_GE(val1, val2):如果第一个值大于或等于第二个值,测试通过。

测试夹具(Fixture):

测试夹具允许你在多个测试之间共享设置和状态。使用 TEST_F 宏定义测试用例,其中 F 表示测试夹具的名称:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyTestFixture : public ::testing::Test {
protected:
    void SetUp() override {
        // 在测试用例执行前调用
    }

    void TearDown() override {
        // 在测试用例执行后调用
    }
};

TEST_F(MyTestFixture, TestName) {
    // Your test logic and assertions go here
    ASSERT_EQ(2 + 2, 4);
}

参数化测试:

gtest支持参数化测试,允许你以不同的参数运行相同的测试用例。使用 INSTANTIATE_TEST_SUITE_P 宏定义参数化测试:

1
2
3
4
5
6
7
8
9
class MyParameterizedTest : public ::testing::TestWithParam<int> {};

INSTANTIATE_TEST_SUITE_P(MyTestSuite, MyParameterizedTest, ::testing::Values(1, 2, 3));

TEST_P(MyParameterizedTest, TestName) {
    int value = GetParam();
    // Your test logic and assertions go here
    ASSERT_GT(value, 0);
}

总结:

gtest 是一个强大的C++单元测试框架,提供了丰富的功能,使得编写、运行和维护测试用例变得相对简单。通过良好的集成和文档,gtest被广泛用于C++项目的测试中。