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));
我的 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));