Google C++单元测试框架(Gtest)系列教程之四——参数化

引言

在上一篇文章中,我们学习了如何使用Gtest的测试固件(Test fixture)完成测试代码和测试数据的复用,这一节我们来学习如何使用Gtest值参数化的方法,简化函数测试;使用类型参数化的方法,简化对模板类的测试。

值参数化

假设我们要对以下函数进行测试:

// 判断n是否为质数
bool IsPrime(int n) 

假设我们要编写判定结果为false的测试案例,根据之前学习的断言和TEST()的使用方法,我们编写测试代码如下:

// Tests negative input.
TEST(IsPrimeTest, Negative) {
  EXPECT_FALSE(IsPrime(-1));
  EXPECT_FALSE(IsPrime(-2));
  EXPECT_FALSE(IsPrime(-5));
  EXPECT_FALSE(IsPrime(-100));
  EXPECT_FALSE(IsPrime(INT_MIN));
}

显然我们对“EXPECT_FALSE(IsPrime(X))”这样的语句复制粘贴了5次,但当被测数据有几十个上百个的时候,再使用复制粘帖的方式就弱爆了。下面我们来看Gtest中为解决这个问题,给我们提供的方法。
首先,我们添加一个继承自::testing::TestWithParam<T>的类,其中T就是我们被测数据的类型,针对以上函数IsPrimeTest,添加以下类:

class IsPrimeParamTest : public::testing::TestWithParam<int>
{
};

在该类中,我们可以编写SetUp()和TearDown()函数,分别完成数据初始化和数据清理,还可以添加类成员、其他类成员函数,相关的用法,可以参看Gtest Project的这个例子,这里我们仅对函数作测试,SetUp()等方法都不需要用到,IsPrimeParamTest为一个空的类。

接着我们需要使用宏TEST_P来编写相应的测试代码:

TEST_P(IsPrimeParamTest, Negative)
{
    int n =  GetParam();
    EXPECT_FALSE(IsPrime(n));
}

GetParam()方法用于获取当前参数的具体值,这段测试代码相比上面的是不是精简多了?!

最后,我们使用INSTANTIATE_TEST_CASE_P()告知Gtest我们的被测参数都有哪些:

INSTANTIATE_TEST_CASE_P(NegativeTest, IsPrimeParamTest, testing::Values(-1,-2,-5,-100,INT_MIN));

以上第一个参数为测试实例的前缀,可以随意取;第二个参数为测试类的名称;第三个参数指示被测参数,test::Values表示使用括号内的参数。运行该测试用例,得到结果如下:

Running main() from gtest_main.cc
[==========] Running 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值