C++ 和 Google 测试
C++ and Google Test
我正在研究 Google 测试参数化测试。然而,它们看起来真的很好,除非我错过了一个技巧,否则我看不出你如何为每个测试使用不同的测试数据集。我使用了一个我发现的例子 online 效果很好但是看起来我需要创建一个新的 class,即 FooTest1、2、3、4 等,以便为每个人提供一个 INSTANTIATE_TEST_CASE_P,如果我想提供一个 TEST_P不同的参数..我想我一定是遗漏了什么。
class FooTest: public ::testing::TestWithParam < int >{....};
TEST_P(FooTest, DoesBar)
{
ASSERT_TRUE(foo.DoesBar(GetParam());
}
INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
有人可以确认这是否可以通过不同的方式实现吗?
谢谢
不幸的是,没有简单的解决方法。
每个 INSTANTIATE_TEST_CASE_P
使用提供的测试值范围实例化一个(参数化的)测试夹具(class FooTest: public ::testing::TestWithParam < int >{....}
)(在 INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10))
的情况下,值从 1 到 9 - 请记住,不包括最终值)
每个 TEST_P
定义为使用该固定装置(例如 TEST_P(FooTest, DoesBar)
)将对值范围内的每个值执行一次(即 GetParam() 将 return 1 到 9 跨越所有执行,以 "OneToTenRange" 作为测试前缀。
您可以为同一个测试夹具添加第二个 INSTANTIATE_TEST_CASE_P
(例如 INSTANTIATE_TEST_CASE_P(TenToTwentyRange, FooTest, ::testing::Range(10, 20))
),这将导致所有使用 FooTest 夹具的测试执行该范围(在本例中为 10 到 19,也带有前缀 "TenToTwentyRange")。
如果你 NOT 想要 TEST_P 执行特定范围(或使用不同的参数),你需要创建一个单独的测试夹具并根据您的需求。翻转视角,测试fixture定义了你测试的参数运行(即什么GetParam()returns),并确保与其关联的每个TEST_P执行一次for/with 每个参数.
幸运的是,您可以使用以下技巧让事情变得更轻松:
创建一个包含所有 setup/teardown 的普通(非参数化)测试夹具。然后从中派生一个简单的参数化测试夹具并通过 INSTANTIATE_TEST_CASE_P
实例化它
class BaseTest : public ::testing::Test
{
// Do your common stuff here
}
// FooTest
class FooTest: BaseTest, testing::WithParamInterface<int>
{
FooTest() : BaseTest() {}
};
INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10))
// BarTest
class BarTest: BaseTest, testing::WithParamInterface<int>
{
BarTest() : BaseTest() {}
};
INSTANTIATE_TEST_CASE_P(TenToTwentyRange, BarTest, ::testing::Range(10, 20))
我正在研究 Google 测试参数化测试。然而,它们看起来真的很好,除非我错过了一个技巧,否则我看不出你如何为每个测试使用不同的测试数据集。我使用了一个我发现的例子 online 效果很好但是看起来我需要创建一个新的 class,即 FooTest1、2、3、4 等,以便为每个人提供一个 INSTANTIATE_TEST_CASE_P,如果我想提供一个 TEST_P不同的参数..我想我一定是遗漏了什么。
class FooTest: public ::testing::TestWithParam < int >{....};
TEST_P(FooTest, DoesBar)
{
ASSERT_TRUE(foo.DoesBar(GetParam());
}
INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
有人可以确认这是否可以通过不同的方式实现吗?
谢谢
不幸的是,没有简单的解决方法。
每个 INSTANTIATE_TEST_CASE_P
使用提供的测试值范围实例化一个(参数化的)测试夹具(class FooTest: public ::testing::TestWithParam < int >{....}
)(在 INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10))
的情况下,值从 1 到 9 - 请记住,不包括最终值)
每个 TEST_P
定义为使用该固定装置(例如 TEST_P(FooTest, DoesBar)
)将对值范围内的每个值执行一次(即 GetParam() 将 return 1 到 9 跨越所有执行,以 "OneToTenRange" 作为测试前缀。
您可以为同一个测试夹具添加第二个 INSTANTIATE_TEST_CASE_P
(例如 INSTANTIATE_TEST_CASE_P(TenToTwentyRange, FooTest, ::testing::Range(10, 20))
),这将导致所有使用 FooTest 夹具的测试执行该范围(在本例中为 10 到 19,也带有前缀 "TenToTwentyRange")。
如果你 NOT 想要 TEST_P 执行特定范围(或使用不同的参数),你需要创建一个单独的测试夹具并根据您的需求。翻转视角,测试fixture定义了你测试的参数运行(即什么GetParam()returns),并确保与其关联的每个TEST_P执行一次for/with 每个参数.
幸运的是,您可以使用以下技巧让事情变得更轻松:
创建一个包含所有 setup/teardown 的普通(非参数化)测试夹具。然后从中派生一个简单的参数化测试夹具并通过 INSTANTIATE_TEST_CASE_P
class BaseTest : public ::testing::Test
{
// Do your common stuff here
}
// FooTest
class FooTest: BaseTest, testing::WithParamInterface<int>
{
FooTest() : BaseTest() {}
};
INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10))
// BarTest
class BarTest: BaseTest, testing::WithParamInterface<int>
{
BarTest() : BaseTest() {}
};
INSTANTIATE_TEST_CASE_P(TenToTwentyRange, BarTest, ::testing::Range(10, 20))