玩转Google单元测试框架gtest系列之四:参数化

发表于:2010-4-02 14:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:CoderZh    来源:www.cnblogs.com/coderzh

  一、前言

  在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法,然后编写在测试案例调用它。即使使用了通用方法,这样的工作也是有很多重复性的,程序员都懒,都希望能够少写代码,多复用代码。Google的程序员也一样,他们考虑到了这个问题,并且提供了一个灵活的参数化测试的方案。

  二、旧的方案

  为了对比,我还是把旧的方案提一下。首先我先把被测函数IsPrime帖过来(在gtest的example1.cc中),这个函数是用来判断传入的数值是否为质数的。

// Returns true iff n is a prime number.
bool IsPrime(int n)
{
    
// Trivial case 1: small numbers
    if (n <= 1return false;

    
// Trivial case 2: even numbers
    if (n % 2 == 0return n == 2;

    
// Now, we have that n is odd and n >= 3.

    
// Try to divide n by every odd number i, starting from 3
    for (int i = 3; ; i += 2) {
        
// We only have to try i up to the squre root of n
        if (i > n/i) break;

        
// Now, we have i <= n/i < n.
        
// If n is divisible by i, n is not prime.
        if (n % i == 0return false;
    }
    
// n has no integer factor in the range (1, n), and thus is prime.
    return true;
}

  假如我要编写判断结果为True的测试案例,我需要传入一系列数值让函数IsPrime去判断是否为True(当然,即使传入再多值也无法确保函数正确,呵呵),因此我需要这样编写如下的测试案例:

TEST(IsPrimeTest, HandleTrueReturn)
{
    EXPECT_TRUE(IsPrime(
3));
    EXPECT_TRUE(IsPrime(
5));
    EXPECT_TRUE(IsPrime(
11));
    EXPECT_TRUE(IsPrime(
23));
    EXPECT_TRUE(IsPrime(
17));
}

  我们注意到,在这个测试案例中,我至少复制粘贴了4次,假如参数有50个,100个,怎么办?同时,上面的写法产生的是1个测试案例,里面有5个检查点,假如我要把5个检查变成5个单独的案例,将会更加累人。

  接下来,就来看看gtest是如何为我们解决这些问题的。

  三、使用参数化后的方案

  1. 告诉gtest你的参数类型是什么

  你必须添加一个类,继承testing::TestWithParam<T>,其中T就是你需要参数化的参数类型,比如上面的例子,我需要参数化一个int型的参数。

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

};

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号