Тест Google. Параметрированные тесты, в которых используется существующий класс test fixture?

У меня есть класс test test, который в настоящее время используется многими тестами.

#include <gtest/gtest.h>
class MyFixtureTest : public ::testing::Test {
  void SetUp() { ... }
};

Я хотел бы создать параметризованный тест, который также использует все, что может предложить MyFixtureTest, без необходимости изменять все мои существующие тесты.

Как это сделать?

Я нашел похожие обсуждения в Интернете, но не полностью понял их ответы.

Ответ 1

Проблема в том, что для регулярных тестов ваше оборудование должно быть получено из теста:: Test и для параметризованных тестов, оно должно быть получено из тестирования:: TestWithParam < > .

Чтобы это учесть, вам нужно будет изменить класс вашего прибора, чтобы работать с вашим типом параметра

template <class T> class MyFixtureBase : public T {
  void SetUp() { ... };
  // Put the rest of your original MyFixtureTest here.
};

// This will work with your non-parameterized tests.
class MyFixtureTest : public MyFixtureBase<testing::Test> {};

// This will be the fixture for all your parameterized tests.
// Just substitute the actual type of your parameters for MyParameterType.
class MyParamFixtureTest : public MyFixtureBase<
    testing::TestWithParam<MyParameterType> > {};

Таким образом, вы можете сохранить все существующие тесты без изменений при создании параметризованных тестов с помощью

TEST_P(MyParamFixtureTest, MyTestName) { ... }

Ответ 2

Этот вопрос теперь дан в документации Google Test по адресу https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#how-to-write-value-parameterized-tests (answer от VladLosev технически корректен, но, возможно, немного больше работы)

В частности, если вы хотите добавить параметры к уже существующему классу приборов, вы можете сделать

class MyFixtureTest : public ::testing::Test {
  ...
};
class MyParamFixtureTest : public MyFixtureTest,
                           public ::testing::WithParamInterface<MyParameterType> {
  ...
};

TEST_P(MyParamFixtureTest, MyTestName) { ... }

Ответ 3

Если вы создаете новое устройство, которое является производным от этого общего, и чем создаете свои параметризованные тесты для этого производного класса, это поможет вам решить вашу проблему?

Из Google Test wiki page: "В Google Test вы делитесь опытом между тестовыми примерами, помещая общую логику в базовое тестовое устройство, а затем извлекая из этой базы отдельное приспособление для каждого тестового примера, который хочет использовать эту общую логику".