我正在研究Google测试的参数化测试。但是,它们看起来确实不错,除非我没有什么窍门,否则我看不到您如何为每个测试使用不同的测试数据集。.我使用了一个网上发现的示例,虽然效果很好,但看起来像我如果我想为每个带有不同参数的TEST_P提供一个INSTANTIATE_TEST_CASE_P,则需要创建一个新类,即FooTest1、2、3、4等,以便为每个提供一个INSTANTIATE_TEST_CASE_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()将在所有执行中返回1到9,其中“ OneToTenRange”作为测试前缀)。
您可以INSTANTIATE_TEST_CASE_P
为同一测试夹具(例如INSTANTIATE_TEST_CASE_P(TenToTwentyRange, FooTest, ::testing::Range(10, 20))
)添加一秒钟,这也会导致所有使用FooTest夹具的测试都执行该范围(在这种情况下为10到19,带有前缀“ TenToTwentyRange”)。
如果您不希望TEST_P执行特定范围(或使用不同的参数),则需要创建一个单独的测试夹具,并根据需要实例化该夹具。翻转透视图,测试装置定义了您运行的测试的参数(即GetParam()返回的值),并确保与每个参数关联的每个TEST_P都执行一次。
幸运的是,您可以使用以下技巧使事情变得更轻松:
创建一个包含所有设置/拆卸的标准(非参数化)测试夹具。然后从中导出一个基本参数化的测试夹具,并通过实例化它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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句