我正在查看Google Test参数化测试。他们看起来真的很好,但是,除非我错过了一个技巧,我不能看到你如何使用一个不同的测试数据集为每个测试..我用了一个例子,我发现online工作得很好,但看起来我需要创建一个新的类,即。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));
有谁能证实这是否可以以不同的方式实现?
谢谢
1条答案
按热度按时间83qze16e1#
不幸的是,没有简单的方法可以解决这个问题。
每个
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 fixture的测试也执行该范围(在本例中为10到19,前缀为 “TenToTwentyRange”)。如果您不希望TEST_P执行特定的范围(或使用不同的参数),则需要创建一个单独的测试夹具,并根据您的需要示例化它。翻转透视图,测试夹具定义您运行的测试的参数(即GetParam()返回什么),并确保与之相关联的每个TEST_P针对/利用每个参数执行一次。
幸运的是,您可以使用以下技巧来使事情变得更容易:
创建一个包含所有设置/拆卸的正常(非参数化)测试夹具。然后从中派生一个基本的参数化测试夹具,并通过
INSTANTIATE_TEST_CASE_P
示例化它