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

gtest - How to run the same code in the beginning of some functions

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

提前致谢:)

至少,你可以使用 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));