GoogleTest初探(2)

2022-12-24,

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

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

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

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

//MyClass.hpp
enum class CalculateType : int
{
add = ,
minus = ,
plus = ,
divide =
}; class MyClass
{
public:
int calculate(int a, int b, CalculateType type)
{
int c = ;
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{, , CalculateType::add},
MyTestData{, , CalculateType::minus},
MyTestData{, , CalculateType::plus},
MyTestData{, , 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

GoogleTest初探(2)的相关教程结束。

《GoogleTest初探(2).doc》

下载本文的Word格式文档,以方便收藏与打印。