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