Google Test: параметризованные тесты, использующие существующий класс тестовых приспособлений?

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

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

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

Как я могу это сделать?

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


person des4maisons    schedule 30.06.2010    source источник


Ответы (3)


Проблема в том, что для обычных тестов ваша фикстура должна быть производной от testing::Test, а для параметризованных тестов она должна быть производной от testing::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) { ... }
person VladLosev    schedule 14.07.2010
comment
Пришлось использовать это решение, так как у меня действительно старая версия gtest, которая не поддерживает WithParamInterface; - person Arthur Silva; 17.06.2020

Теперь ответ на этот вопрос содержится в документация Google Test (ответ от Влада Лосева технически правильный, но, возможно, немного больше работы)

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

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

TEST_P(MyParamFixtureTest, MyTestName) { ... }
person mabraham    schedule 14.01.2014
comment
Это определенно кажется чище и меньше работы по сравнению с тем, что предложил ВладЛосев (что технически правильно и, возможно, из того времени, когда ParamInterface не был доступен) - person sanchitarora; 09.01.2015
comment
Не забывайте, что если вы определяете SetUp() в MyParamFixtureTest, он должен вызвать MyFixtureTest::SetUp(), иначе установка базового класса никогда не запустится. - person DBedrenko; 02.01.2018
comment
Как создать экземпляр MyParamFixtureTest с правильным параметром типа MyParameterType? - person liv2hak; 13.09.2019

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

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

person ratkok    schedule 02.07.2010
comment
Спасибо за ответ. Моя проблема заключается в том, что параметризованная тестовая фикстура должна наследоваться от ::testing::TestWithParam, тогда как моя текущая фикстура наследуется только от ::testing::Test. Кроме того, тесты, использующие параметризованные тесты, объявляются с помощью TEST_P вместо TEST_F. Любые идеи, как разрешить различия? - person des4maisons; 14.07.2010