可重用::testing::gtest中的值生成器

问题描述 投票:0回答:1

我有一个软件(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
的东西或宏的解决方案?

c++ c++14 googletest
1个回答
0
投票

您可以通过多种方式做到这一点:

  1. 如果可能,重用实例化
    如果您有多个使用相同数据的测试,并且更重要的是,这些测试彼此相关,只需将它们分组在一个类固定装置中
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)); 
  1. 直接存储参数生成器
const auto WITH_THE_ANNOYING_ONES = ::testing::Values(0,42,4711);

您的尝试失败了,因为缺少

auto
并且生成器不是
constexpr
本身,因此变量也不能是
constexpr
。普通的旧
const
就可以了,除非您需要将其放在头文件中以在多个文件之间共享 - 然后它会变得更多参与

  1. 将值存储在任何容器中并使用
    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
可以)。

© www.soinside.com 2019 - 2024. All rights reserved.