C ++和Google测试

尤斯

我正在研究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)); 

有人可以确认是否可以通过其他方式实现吗?

谢谢

CharonX

不幸的是,这没有简单的方法。

每个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章