将数组传递给 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 代码中构造得更深。
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 代码中构造得更深。