我有一个软件(C++),它通过 googletest 进行了过度测试。
INSTANTIATE_TEST_SUITE_P
电话。
有一个我想重用的特定值生成器,它应该不会影响测试结果,但我发现它确实会影响测试结果。如果有帮助的话,可以将其视为随机种子。
所以有很多变化
INSTANTIATE_TEST_SUITE_P( foo, foo, ::testing::Values(0,42,4711))
INSTANTIATE_TEST_SUITE_P( bar, bar, ::testing::Values(0,42,4711))
INSTANTIATE_TEST_SUITE_P( foobar, foobar,
::testing::Combine(
::testing::Range(1,3),
::testing::Values(0,42,4711))
在任意数量的测试文件中
我正在寻找一种方法将
::testing::Values(0,42,4711)
变成一个我可以重复使用的“名称”(我已经做好准备,但对它是文字、左值等的讲座并不真正感兴趣)。
曾几何时,它会是
#define WITH_THE_ANNOYING_ONES ::testing::Values(0,42,4711)
,这会将我的测试变成
INSTANTIATE_TEST_SUITE_P( foo, foo, WITH_THE_ANNOYING_ONES )
INSTANTIATE_TEST_SUITE_P( bar, bar, WITH_THE_ANNOYING_ONES )
INSTANTIATE_TEST_SUITE_P( foobar, foobar,
::testing::Combine(
::testing::Range(1,3),
WITH_THE_ANNOYING_ONES)
constexpr WITH_THE_ANNOYING_ONES = ::testing::Values(0,42,4711);
对我不起作用
有没有不使用 gtests
::internal
的东西或宏的解决方案?
您可以通过多种方式做到这一点:
class Foo: public ::testing::TestWithParam<int> {};
TEST_P(Foo, testsBar) {}
TEST_P(Foo, testsBaz) {}
// below line will instantiate both testsBar and testsBaz with the same data
INSTANTIATE_TEST_SUITE_P( fooParameterisedTests, Foo, ::testing::Values(0,42,4711));
const auto WITH_THE_ANNOYING_ONES = ::testing::Values(0,42,4711);
您的尝试失败了,因为缺少
auto
并且生成器不是 constexpr
本身,因此变量也不能是 constexpr
。普通的旧const
就可以了,除非您需要将其放在头文件中以在多个文件之间共享 - 然后它会变得更多参与。
ValuesIn
生成器constexpr std::array WITH_THE_ANNOYING_ONES {0,42,4711};
INSTANTIATE_TEST_SUITE_P( foo, foo, ::testing::ValuesIn(WITH_THE_ANNOYING_ONES));
当您选择容器时,适用正常容器限制(例如,
std::vector
不能是 constexpr
,但 std::array
可以)。