GoogleTest初探(2)

前面的随笔介绍了Google Test中的基本测试单元TEST和测试夹具TEST_F,此篇介绍区别于这两种测试的参数化测试TEST_P

当待测试方法的行为取决于传入的参数时,而且这些参数的不同组合有多种, 而你又不想为此写多个相类似的test case时,可以用value-parameterized Test

value-parameterized Test 允许你可以使用不同的参数测试代码, 而无需编写同一测试的多个副本

下面举个例子,待测方法:

//MyClass.hpp
enum class CalculateType : int
{
    add = 1,
    minus = 2,
    plus = 3,
    divide = 4
};

class MyClass
{
public:
    int calculate(int a, int b, CalculateType type)
    {
        int c = 0;
        switch (type)
        {
            case CalculateType::add:
                c = a + b;
                break;
            case CalculateType::minus:
                c = a - b;
                break;
            case CalculateType::plus:
                c = a * b;
                break;
            case CalculateType::divide:
                c = a / b;
                break;
        }
        return c;
    }
};

测试:

//myGtest.cpp
#include <gtest/gtest.h>
#include "MyClass.hpp"

using namespace std;

struct MyTestData
{
    int a;
    int b;
    CalculateType type;
};


class TestMyClass : public ::testing::Test,
                    public ::testing::WithParamInterface<MyTestData>
{
public:
    MyClass myclass;
};

TEST_P(TestMyClass, norml)
{
    int a = GetParam().a;
    int b = GetParam().b;
    int re = myclass.calculate(a, b, GetParam().type);
    switch (GetParam().type)
    {
        case CalculateType::add:
            EXPECT_EQ(a + b, re);
            break;
        case CalculateType::minus:
            EXPECT_EQ(a - b, re);
            break;
        case CalculateType::plus:
            EXPECT_EQ(a * b, re);
            break;
        case CalculateType::divide:
            EXPECT_EQ(a / b, re);
            break;
    }
}

INSTANTIATE_TEST_SUITE_P(TestMyClassParams,
                        TestMyClass,
                        ::testing::Values(
                            MyTestData{1, 2, CalculateType::add},
                            MyTestData{4, 3, CalculateType::minus},
                            MyTestData{5, 6, CalculateType::plus},
                            MyTestData{8, 2, CalculateType::divide}
                        ));

编译

g++ myGtest.cpp -lgtest -lpthread -o myGtest

运行结果:

 从运行结果来看,最终在跑测试时是跑了四遍。

首先,写value-parameterized Test 时,你的测试类要同时继承::testing::Test和::testing::WithParamInterface<T>,或者直接继承::testing::TestWithParam<T>(其实它也是继承了前两者,不过写起来方便了)

   其中T是你测试时想传入的参数类型(如果是多个参数,可以定义一个结构体)。

其次,在写测试时,需要使用TEST_P这个宏,在测试case中可以用GetParam()来得到传入的参数。

最后,使用INSTANTIATE_TEST_SUITE_P来初始化你想传入的参数集合。你可以使用参数生成器来完成。参数生成器:(用的时候记得加namespace ::testing)

参考链接: https://github.com/google/googletest/blob/master/googletest/docs/advanced.md

原文地址:https://www.cnblogs.com/duan-shui-liu/p/10755298.html