将数组传递给 gtest 中的参数化测试

Passing an array to parameterized test in gtest

gtest 中的参数化测试允许您使用不同的参数测试您的代码,而无需编写同一测试的多个副本。seen here

我看过传值的例子,std::pair,std::tuple等

但我不确定如何将 array/initializer_list 传递到测试中。

预期是这样的:

INSTANTIATE_TEST_SUITE_P(Sample, FooTest,
                         testing::Values({1,23,53},{534,34,456));

可能吗?如果是怎么办?

您可以传递任何您想要的类型作为参数。当您从 class 模板 WithParamInterface(或 TestWithParam)继承测试夹具 a 时,您提供参数类型:

class FooTest: public TestWithParam<std::array<int, 3>>
//class FooTest: public TestWithParam<std::vector<int>>
//class FooTest: public TestWithParam<std::initializer_list<int>> //I'm not sure if this is a good idea, initializer_list has weird lifetime management
{};

INSTANTIATE_TEST_SUITE_P(Sample, FooTest,
                         testing::Values(std::array<int, 3>{1,23,53},
                                         std::array<int, 3>{534,34,456});

See it online.
您不能使用裸 brace-init 列表并让编译器推断类型,因为 ::testing::Values() 接受模板参数并且编译器不知道该模板参数应该成为什么类型。

假设我们有 class BarTest: public TestWithParam<std::string>。对于 ::testing::Values,我们可以传递实际的 std::string 对象 ::testing::Values(std::string{"asdf"}, "qwer"s) 或可隐式转换为 std::string 的对象,例如字符串文字:::testing::Values("zxcv")。后者将推断类型为 const char*,而实际的 std::string 在 GoogleTest 代码中构造得更深。