gtest总结
发布日期:2021-05-10 04:59:58 浏览次数:22 分类:精选文章

本文共 2972 字,大约阅读时间需要 9 分钟。

Google C++ 测试框架(gtest)总结

gtest(Google Test)是一个强大的C++测试框架,由Google推出,广泛应用于软件开发领域。gtest 提供了两种主要库:gtest 和 gtest_main,分别适用于不同的测试场景。以下是gtest 的核心知识和使用技巧的总结。


gtest 基本使用

gtest 提供了两种主要的测试库:

  • gtest.lib

    当依赖gtest.lib 时,需要自定义测试程序的入口函数 main。开发者需实现 main 函数,引入gtest 的环境并运行所有测试案例。

    int main(int argc, char* argv[]){
    testing::AddGlobalTestEnvironment(new FooEnvironment);
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
    }
  • gtest_main.lib

    当依赖gtest_main.lib 时,gtest 为测试程序提供一个默认的入口函数 main,无需手动编写 main 函数即可实现。只需在链接时添加依赖,编译时使用 -l gtest\_main

  • 此外,gtest 提供了两个主要组件:

    • gtest:用于定义和执行测试案例。
    • gmock:用于单元测试中的动态 Mock 类编写。

    gmock 编写

    gmock 是gtest 的补充库,主要用于创建和验证 Mock 对象。以下是常用功能的总结:

  • 创建 Mock 类

    Mock 类需继承自gtest 的抽象 AbstractMock 类。可以通过 MOCK_METHOD 宏定义 Mock 类中的虚函数。

  • 定义和验证方法

    使用 EXPECT_CALL 宏定义 Mock 方法的预期调用方式,确保测试方法按照预期执行。

  • 参数化方法

    当需要测试多种输入参数时,可以采用参数化测试的方式,减少代码冗余。例如:

    class TestSquare : public testing::TestWithParam
    {
    protected:
    int square(int a) { return a * a; }
    int a;
    };
    TEST_P(TestSquare, case1) {
    a = GetParam();
    EXPECT_EQ(a * a, square(a));
    }
    INSTANTIATE_TEST_CASE_P(Square, TestSquare, testing::Values(1, 2, 3, 4));

  • 事件机制

    gtest 提供了丰富的事件机制,允许在测试案例执行前后自定义操作。事件分为全局事件和非全局事件两种。

    全局事件

    • 全局事件需继承自 testing::Environment 并实现 SetUp()TearDown() 方法。

      • SetUp():在所有测试案例执行前运行。
      • TearDown():在所有测试案例执行后运行。

      示例代码:

      class FooEnvironment : public testing::Environment {
      public:
      virtual void SetUp();
      virtual void TearDown();
      };
      void FooEnvironment::SetUp() {
      std::cout << "Foo FooEnvironment SetUP" << std::endl;
      }
      void FooEnvironment::TearDown() {
      std::cout << "Foo FooEnvironment TearDown" << std::endl;
      }

    死亡测试

    死亡测试用于验证程序在异常(如内存泄漏、指针错误等)时的崩溃模式。gtest 提供以下宏和功能:

    • ASSERT_DEATHEXPECT\_DEATH

      用于验证程序在处理错误时是否按预期退出。

    • _EXIT macro

      用于自定义退出函数,验证程序的退出代码和异常类型。

      示例代码:

      void func(int c) {
      if (c <= 0)
      _exit(1);
      else
      _exit(2);
      }
      TEST(ExitDeathTest, Demo) {
      EXPECT_EXIT(func(-1), testing::ExitedWithCode(1), "");
      }
      TEST(Exit2DeathTest, Demo2) {
      EXPECT_EXIT(func(1), testing::ExitedWithCode(1), "");
      }

    死亡测试在测试运行时会优先执行,返回结果为绿色“RUN”或红色“failed to die”。


    运行参数

    gtest 提供多种运行参数,支持通过命令行配置测试案例的行为:

  • 系统环境变量

    测试程序可通过环境变量获取配置信息。

  • 命令行参数

    支持多种命令行选项,如 --gtest_list_tests--gtest_filter,后者支持使用通配符筛选测试案例。

  • 添加 compiler 标记

    在代码中使用 #define 指令可自定义测试行为。

  • 输出设置

    支持颜色输出、测试时间追踪,以及自定义结果存储路径等。


  • 自定义测试类

    gtest 支持自定义测试类,用户可通过继承 testing::Test 类实现自定义功能。以下是一个示例:

    class MyTestClass : public ::testing::Test {
    public:
    MyTestClass() {}
    virtual ~MyTestClass() {}
    virtual void SetUp() {
    pCal = std::unique_ptr
    (new Cal());
    }
    virtual void TearDown() {}
    public:
    std::unique_ptr
    pCal;
    };
    TEST_F(MyTestClass, test_add) {
    pCal->setA(2);
    pCal->setB(3);
    EXPECT_TRUE(pCal->add() == 5);
    }
    TEST_F(MyTestClass, test_sub) {
    pCal->setA(2);
    pCal->setB(3);
    EXPECT_TRUE(pCal->sub() == -1);
    }

    此外,gtest 提供了多种高级特性,如单元测试框架和异常处理。


    结论

    gtest 是一个功能强大的C++测试框架,支持模块化测试、参数化、事件处理、死亡测试和自定义测试类等功能。通过合理使用gtest 和 gmock,可以依据测试需求编写高效、可靠的测试代码。

    上一篇:EtherCAT寻址方式
    下一篇:关于用户态和内核态内存拷贝的思考

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年05月04日 12时20分59秒