13

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

目前我正在测试中处理 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");
}

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

提前致谢。

4

2 回答 2

19

使用值参数化测试

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()));
于 2013-10-03T18:21:25.353 回答
1

我在谷歌单元测试中添加了两个类DynamicTestInfo和函数。它至少需要 C++17(尚未分析向后移植到 C++11 或 C++14)——它允许动态创建谷歌单元测试/在运行时比当前的谷歌 API 稍微简单一些。ScriptBasedTestInfoRegisterDynamicTest

例如用法可能是这样的:

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

但这需要修改谷歌测试,例如看这个文件:

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

我将尝试将更改合并到官方谷歌测试存储库。

我还更改了向用户应用程序报告测试的方式(使用<loc>标签),但需要修改用于 Visual Studio 的谷歌测试适配器,有关更多信息,请参阅以下 youtube 视频以了解更多说明如何工作。

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

使用较新的 GTA,您可以在测试资源管理器中获取文件系统列表,例如:

在此处输入图像描述

于 2019-05-12T08:21:05.767 回答