У меня есть программное обеспечение (С++), которое тщательно тестировалось с помощью 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)
в «имя», которое можно будет использовать повторно (я готов, но не очень заинтересован в лекциях о том, что оно будет буквальным, lvalue и т. д.).
Когда-то это было бы #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
может).