我有一个解析器需要测试。这个解析器有很多测试输入文件。通过将解析器的输出与相应的预生成文件进行比较来测试解析器的预期行为。
目前我正在测试中处理 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");
}
很容易看出代码的重复。所以我觉得有一种方法可以使这些测试自动化。
提前致谢。
最佳答案
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")));
您可以从磁盘读取测试用例列表并将其作为 vector 返回:
std::vector<TestParam> ReadTestCasesFromDisk() { ... }
INSTANTIATE_TEST_CASE_P(
GeneralAndSpecial, // Instantiation name can be chosen arbitrarily.
ParserTest,
testing::ValuesIn(ReadTestCasesFromDisk()));
关于c++ - 在运行时创建测试(谷歌测试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19160244/