Тест 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 вы делитесь опытом между тестовыми примерами, помещая общую логику в базовое тестовое устройство, а затем извлекая из этой базы отдельное приспособление для каждого тестового примера, который хочет использовать эту общую логику".