Google Test: параметризованные тесты, которые используют существующий класс тестовых приборов? - PullRequest
16 голосов
/ 30 июня 2010

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

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

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

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

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

Ответы [ 3 ]

37 голосов
/ 14 января 2014

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

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

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

TEST_P(MyParamFixtureTest, MyTestName) { ... }
20 голосов
/ 15 июля 2010

Проблема в том, что для регулярных тестов ваш прибор должен быть получен из тестирования :: 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) { ... }
0 голосов
/ 02 июля 2010

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

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

...