Создание тестов во время выполнения (тест Google)

У меня есть Parser, который должен быть проверен. В этом Парсере есть много тестовых входных файлов. Ожидаемое поведение Parser проверяется путем сравнения вывода Parser с соответствующими прегенерированными файлами.

В настоящее время я обрабатываю файл YAML в тесте для получения входных файлов, ожидаемых файлов и их описания (в случае отказа это описание будет напечатано).

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

Итак, мне нужно сформировать следующий код в тесте:

TEST(General, GeneralTestCase)
{
   test_parameters = yaml_conf.get_parameters("General", "GeneralTestCase");
   g_parser.parse(test_parameters);

   ASSERT_TRUE(g_env.parsed_as_expected()) << g_env.get_description("General", "GeneralTestCase");
}

TEST(Special, SpecialTestCase1)
{
   test_parameters = yaml_conf.get_parameters("Special", "SpecialTestCase1");
   g_parser.parse(test_parameters);

   ASSERT_TRUE(g_env.parsed_as_expected()) << g_env.get_description("Special", "SpecialTestCase1");
}

TEST(Special, SpecialTestCase2)
{
   test_parameters = yaml_conf.get_parameters("Special", "SpecialTestCase2");
   g_parser.parse(test_parameters);

   ASSERT_TRUE(g_env.parsed_as_expected()) << g_env.get_description("Special", "SpecialTestCase2");
}

Легко видеть повторение кода. Поэтому я считаю, что есть способ автоматизировать эти тесты.

Заранее спасибо.

Ответ 1

Используйте параметризованные тесты:

typedef std::pair<std::string, std::string> TestParam;

class ParserTest : public testing::TestWithParam<TestParam> {};

TEST_P(ParserTest, ParsesAsExpected) {
   test_parameters = yaml_conf.get_parameters(GetParam().first,
                                              GetParam().second);
   g_parser.parse(test_parameters);
   ASSERT_TRUE(g_env.parsed_as_expected());
}

INSTANTIATE_TEST_CASE_P(
    GeneralAndSpecial,
    ParserTest,
    testing::Values(
        TestParam("General", "GeneralTestCase")
        TestParam("Special", "SpecialTestCase1")
        TestParam("Special", "SpecialTestCase2")));

Вы можете прочитать список тестовых случаев с диска и вернуть его в виде вектора:

std::vector<TestParam> ReadTestCasesFromDisk() { ... }

INSTANTIATE_TEST_CASE_P(
    GeneralAndSpecial,  // Instantiation name can be chosen arbitrarily.
    ParserTest,
    testing::ValuesIn(ReadTestCasesFromDisk()));

Ответ 2

Я добавил два класса DynamicTestInfo и ScriptBasedTestInfo а также функцию RegisterDynamicTest в unit тест Google. Требуется, по крайней мере, С++ 17 (не анализировался бэкпортинг в С++ 11 или С++ 14) - он позволяет динамически/во время выполнения создавать модульные тесты Google немного проще, чем текущие API Google.

Например, использование может быть что-то вроде этого:

https://github.com/tapika/cppscriptcore/blob/f6823b76a3bbc0ed41b4f3cf05bc89fe32697277/SolutionProjectModel/cppexec/cppexec.cpp#L156

Но для этого требуется модифицированный тест Google, посмотрите этот файл, например:

https://github.com/tapika/cppscriptcore/blob/f6823b76a3bbc0ed41b4f3cf05bc89fe32697277/SolutionProjectModel/logTesting/gtest/gtest.h#L819

Я попытаюсь объединить изменения в официальном репозитории Google Test.

Я также изменил то, как тесты передаются в пользовательское приложение (с использованием <loc>), но для этого требуется модифицированный адаптер тестирования Google для Visual Studio, для получения дополнительной информации см. Следующее видео на YouTube для более подробного объяснения того, как все это работает.

https://www.youtube.com/watch?v=-miGEb7M3V8

Используя более новую GTA, вы можете получить список файловой системы в тестовом проводнике, например, так:

enter image description here