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))