Создание тестов во время выполнения (тест 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, вы можете получить список файловой системы в тестовом проводнике, например, так: