gtest - 如何在某些函数的开头运行相同的代码

时间:2015-06-23 15:17:23

标签: global googletest gmock

我的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函数。这个例子只是为了说明问题。

提前致谢:)

1 个答案:

答案 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));