我的gtest上有一些功能,如下所示。 (不要介意语法)
TEST(HotelTest, test1)
{
MyObj obj;
int a = obj.doStuff(1);
EXPECT_EQ(test1, a);
}
TEST(HotelTest, test2)
{
MyObj obj;
int a = obj.doStuff(2);
EXPECT_EQ(test2, a);
}
TEST(HotelTest, test3)
{
MyObj obj;
int a = obj.doStuff(3);
EXPECT_EQ(test3, a);
}
TEST(HotelTest, test4)
{
MyObj obj;
int a = obj.doStuff(4);
EXPECT_EQ(test4, a);
}
正如您所看到的,在整个函数中都有重复的代码。
问题: 有什么方法可以避免这种情况吗?我的意思是......像内联函数那样我可以将重复的代码存储在另一个地方,然后只是调用?
P.S。我真的需要有不同的TEST
函数。这个例子只是为了说明问题。
提前致谢:)
答案 0 :(得分:2)
至少,您可以使用test fixtures。
这样可以避免在每种情况下重复MyObj obj;
行:
class HotelTest : public ::testing::Test {
protected:
MyObj obj;
};
TEST_F(HotelTest, test1) {
int a = obj.doStuff(1);
EXPECT_EQ(test1, a);
}
TEST_F(HotelTest, test2) {
int a = obj.doStuff(2);
EXPECT_EQ(test2, a);
}
如果您对obj.doStuff
的调用比单个命令更复杂,您也可以将它们包装在灯具的功能中:
class HotelTest : public ::testing::Test {
protected:
int doStuff(int i) { return obj.doStuff(i); }
MyObj obj;
};
TEST_F(HotelTest, test1) {
EXPECT_EQ(test1, doStuff(1));
}
TEST_F(HotelTest, test2) {
EXPECT_EQ(test2, doStuff(2));
}
最后,您可以使用更高级的value-parameterised tests。此示例将运行测试用例四次。在第一次迭代GetParam()
将产生1
,在第二次2
上产生{依据4
指定的::testing::Range(1, 5)
。
class HotelTest : public ::testing::TestWithParam<int> {
protected:
int doStuff(int i) { return obj.doStuff(i); }
MyObj obj;
};
TEST_P(HotelTest, test) {
EXPECT_EQ(testx, doStuff(GetParam()));
}
INSTANTIATE_TEST_CASE_P(AllHotelTests, HotelTest, ::testing::Range(1, 5));