在运行时创建测试(谷歌测试)

Pix*_*xar 11 c++ automation automated-tests googletest

我有一个必须进行测试的Parser.这个Parser有很多测试输入文件.通过比较解析器的输出与相应的预生成文件来测试解析器的预期行为.

目前我在测试中处理YAML文件以获取输入文件,预期文件及其描述(如果失败,将打印此描述).

还应该在同一输入上测试Parser的参数.

所以,我需要在测试中形成以下代码:

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");
}
Run Code Online (Sandbox Code Playgroud)

很容易看到代码的重复.所以我觉得有一种方法可以自动化这些测试.

提前致谢.

Vla*_*sev 17

使用值参数化测试:

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")));
Run Code Online (Sandbox Code Playgroud)

您可以从磁盘读取测试用例列表并将其作为向量返回:

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

INSTANTIATE_TEST_CASE_P(
    GeneralAndSpecial,  // Instantiation name can be chosen arbitrarily.
    ParserTest,
    testing::ValuesIn(ReadTestCasesFromDisk()));
Run Code Online (Sandbox Code Playgroud)