2024年C C++最全GoogleTest测试框架介绍(二)_setup() test_f(),C C++开发者必看避坑指南

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

本系列文章主要介绍 GoogleTest(也称“GTest”)测试框架的相关知识,同时通过一些示例程序介绍 GoogleTest 测试框架的使用方法。

本文为系列文章的第二篇,主要通过一些示例程序介绍 GoogleTest 测试框架的使用方法。

1 TEST()宏

TEST() 宏的第一个参数是 Test Case 的名称,第二个参数是(隶属于第一个 Test Case 参数的)Test 的名称。一个测试的完整名称包括 Test Case 名称及 Test 的名称,不同 Test CaseTest 名称可以相同。

GoogleTest 根据 Test Case 对测试结果进行分组,所以一些相关的 test 应当放入同一个 Test Case 中。

使用 TEST() 宏来编写一个测试程序,示例代码(gtest_test1.cpp)的内容如下:

#include "gtest/gtest.h"

// 此函数用于判断入参是否为正整数:如果是,则返回0;否则,返回-1
int Positive(int nNum)
{
    if (nNum > 0)
    {
        return 0;
    }
    else
    {
        return -1;
    }
}

// 测试入参2是否为正整数
TEST(PositiveTest, HandlesPositiveInput)
{
    EXPECT_EQ(Positive(2), 0);
}

// 测试入参0是否为正整数
TEST(PositiveTest, HandlesZeroInput)
{
    EXPECT_EQ(Positive(0), -1);
}

// 测试入参-2是否为正整数
TEST(PositiveTest, HandlesNegativeInput)
{
    EXPECT_EQ(Positive(-2), -1);
}

int main(int argc, char **argv)
{
    // 分析gtest程序的命令行参数
    testing::InitGoogleTest(&argc, argv);

    // 调用RUN_ALL_TESTS()运行所有测试用例
    // main函数返回RUN_ALL_TESTS()的运行结果
    return RUN_ALL_TESTS();
}


在上述代码中,我们编写了三个 test,分别为:HandlesPositiveInput、HandlesZeroInput 和 HandlesNegativeInput,这三个 test 都属于同一个 Test Case(PositiveTest)。

编译并执行上述代码,结果如下:

2 TEST_F()宏

当我们想让多个 test 使用同一套数据配置时,就需要用到 Test Fixtures 了。

Test Fixtures 的用法相对复杂一些,创建 fixture 的具体方法如下:

  1. 派生一个继承 ::testing::Test 的类,并将该类中的一些内容声明为 protected 类型,以便在子类中进行访问;
  2. 根据实际情况,编写默认的构造函数或SetUp()函数,来为每个 test 准备所需内容;
  3. 根据实际情况,编写默认的析构函数或TearDown()函数,来释放SetUp()中分配的资源;
  4. 根据实际情况,定义 test 共享的子程序。

当使用 fixture 时,我们使用 TEST_F() 宏代替 TEST() 宏,TEST_F() 允许我们在 Test Fixture 中访问对象和子程序。

注意:TEST_F() 的第一个参数(即 Test Case 的名称)必须是 Test Fixture 类的名字。

对于 TEST_F() 定义的每个 test,GoogleTest 将会在运行时创建一个新的 Test Fixture,并立即通过 SetUp() 对其进行初始化,然后运行 test,之后通过调用 TearDown() 进行数据清理,最后删除 Test Fixture。需要注意的是,同一个 Test Case 中不同的 test 具有不同的 Test Fixture 对象,并且 GoogleTest 每次创建新的 Test Fixture 前都会先删除之前的 Test Fixture。多个 test 不会重用相同的 Test Fixture,某个 test 对 fixture 进行的修改对其他 test 无影响。

使用 TEST_F() 宏来编写一个测试程序,示例代码(gtest_test2.cpp)的内容如下:

#include "gtest/gtest.h"

// 定义测试类FooTest
class FooTest: public testing::Test {
protected:
    // Code here will be called immediately after the constructor (right before each test)
    void SetUp()
    {
        m_nTarget = 5;
    }

    // Code here will be called immediately after each test (right before the destructor)
    void TearDown()
    {
    }

public:
    int IsLargeThan5(const int & nNum);
    int m_nTarget;
};

// 判断入参是否大于5:如果是,则返回0;否则返回-1
int FooTest::IsLargeThan5(const int & nNum)
{
    if (nNum > m_nTarget)
    {
        return 0;
    }
    else
    {
        return -1;
    }
}


![img](https://img-blog.csdnimg.cn/img_convert/2916c05950b27ccd0c17bcbfa2f9a7f9.png)
![img](https://img-blog.csdnimg.cn/img_convert/d5b7361e9e36302b7e23a5a97ea8a786.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值