GTest编译和使用

本文介绍了如何编译并使用Google Test进行单元测试,包括基础用法、自定义测试套件初始化函数、断言技巧,以及参数管理和全局设置。详细解读了SetUpTestCase、TearDownTestCase、SetUp和TearDown的使用,并展示了如何通过GTest进行复杂测试用例的组织。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 初体验

  • 编译googletest
    • 下载googletest https://github.com/google/googletest
    • cd googletest
    • mkdir build 建编译目录
    • cd build
    • cmake .. 生成makefile
    • make 编译后生成libgmock.a libgmock_main.a libgtest.a libgtest_main.a
    • sudo make install 将头文件导入到/usr/local/include, 静态库导入到/usr/local/lib64
  • 使用
    • 创建main文件
      #include <gtest/gtest.h>
      #include <iostream>
      
      using namespace std;
      
      int add(int a, int b)
      {
          return a + b;
      }
      // 注意使用TEST
      TEST(testTT2, abc) 
      {
          EXPECT_EQ(add(2,3), 5);
      }
      
      int main() 
      {
          testing::InitGoogleTest();
          return RUN_ALL_TESTS();
      }
      
    • g++编译:g++ test2.cc -o out1 -lgtest -lpthread
    • cmake编译
      cmake_minimum_required(VERSION 3.14.1)
      project(gtest_project)
      
      find_package(GTest CONFIG REQUIRED)
      
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -g -Wall -O0")
      
      #link_directories(/usr/local/lib64)
      #include_directories(/usr/local/include)
      
      set(SRC test2.cc)
      add_executable(out1 ${SRC})
      target_link_libraries(out1 gtest pthread) # 链接gtest
      
    • 执行生成的可执行文件 ./out1
      在这里插入图片描述

2. Gtest功能函数解释

2.1 初始化SetUpTestCase/TearDownTestCase,SetUp/TearDown

以下函数使用需要定义测试套类继承::testing::Test,重新对应函数,使用TEST_F代替上面的TESTTEST_F: Test fixture, 多个测试用例需要用相同数据配置时,可以声明一个类继承Test,在类中定义数据,然后使用类名作为TEST_F的测试套名; TEST可以不自定义类,但同时也没法重载初始化函数)

  • SetUpTestCase:static测试套级别,运行测试套第一个用例前执行
  • TearDownTestCase: static 测试套级别,运行测试套最后一个用例后执行
  • SetUp:virtual 测试套中每个测试用例开始时执行
  • TearDown:virtrual 测试套中每个测试用例运行后执行
class TestSuit1 : public ::testing::Test {
public:
    static void TearDownTestCase() 
    {
        std::cout << "TearDownTestCase" << std::endl;
    }
    static void SetUpTestCase() 
    {
        std::cout << "SetUpTestCase" << std::endl;
    }

    virtual void SetUp()
    {
        std::cout << "SetUp" << std::endl;
    }
    virtual void TearDown()
    {
        std::cout << "TearDown" << std::endl;
    }
};

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

// 注意TEST_F
TEST_F(TestSuit1, testCase1) 
{
    std::cout << testFunc(1, 3) << std::endl;;
    
}

TEST_F(TestSuit1, testCase2) 
{
    std::cout << testFunc(2, 3) << std::endl;;
}

在这里插入图片描述

  • 备注:
    • 另外一种方法实现全局SetUpTearDown,也就是全局的测试用例在执行前后都会执行的函数
    • 使用:
      • 自定义类继承::testing::Environment, 在类中重写SetUpTearDown方法,定义类对象
      • RUN_ALL_TESTS前调用testing::AddGlobalTestEnvironment注册全局环境
      class MyEnvironment : public testing::Environment;
      
      ::testing::AddGlobalTestEnvironment(new MyEnvironment());
      RUN_ALL_TESTS();
      
2.2 断言
  • 布尔断言:单参断言
    • ASSERT_TRUE、ASSERT_FALSE、EXPECT_TRUE、EXPECT_FALSE
  • 数值断言:双参
    • ASSERT_EQ、ASSERT_NE、ASSERT_LT、ASSERT_LE、ASSERT_GT、ASSERT_GE
    • EXPECT_EQ、EXPECT_NE、EXPECT_LT、EXPECT_LE、EXPECT_GT、EXPECT_GE
  • 字符串断言
    • ASSERT_STREQ、ASSERT_STRCASEEQ
2.3 运行参数
  • 过滤只跑某些测试套:--gtest_filter=只需要运行的用例名正则*

  • 不执行但列出测试用例:--gtest_list_tests =

  • 返回结果:--gtest_output=xml/json 按照xml或者json格式返回结果

    • --gtest_output=json:/ussr/local 指定格式和目录
  • 备注:参数生效前提是在RUN_ALL_TESTS要继承main函数的argc和argv


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值