【问题标题】:How to test a command line options parser using GTest如何使用 GTest 测试命令行选项解析器
【发布时间】:2020-07-23 09:48:40
【问题描述】:

我正在为我的应用程序开发一个命令行选项处理器。我决定使用 GTest 来测试它。它的实现如下所示:

int main(int argv, char **argv)
{
    if (!ProcessOptions(argc, argv)
    {
        return 1;
    }

    // Some more code here
    
    return 0;
}

int ProcessOptions(int argc, char **argv)
{
    for (int i = 1; i < argc; ++i)
    {
        CheckOption(argv[i]);

        CheckArgument();

        if (Success)
        {
            EnableOption();
        }
    }
}

代码按预期运行,但问题是:我想通过提供不同的选项(有效和无效)来使用 GTest 对其进行测试。 GTest 手册内容如下:

::testing::InitGoogleTest() 函数解析命令行 googletest 标志,并删除所有可识别的标志。这允许 用户通过各种标志来控制测试程序的行为,其中 我们将在 AdvancedGuide 中介绍。您必须先调用此函数 调用RUN_ALL_TESTS(),否则标志将无法正确初始化。

但是这样,我将只能测试一个序列。我想为不同的选项多次执行此操作。我该怎么做?

有没有更好的策略来实现这一目标?我可以使用测试夹具来做到这一点吗?

【问题讨论】:

  • 你会有不止一项测试。其中一些会通过有效的选项。其中一些会传递无效的选项。有什么问题?您能向我们展示您目前的测试代码吗?

标签: c++ parsing googletest


【解决方案1】:

你考虑过value-parameterized test吗?它们听起来非常适合您的情况:

值参数化测试允许您使用不同的参数测试您的代码,而无需编写同一测试的多个副本。这在许多情况下都很有用,例如:

  • 您有一段代码的行为受一个或多个命令行标志的影响。
  • 您想要测试 OO 接口的不同实现。
  • 您希望确保您的代码针对这些标志的各种值正确执行。

您可以编写一个或多个测试来定义命令行参数解析器的预期行为,然后以这种方式将命令行标志传递给它。

Google Test GitHub 文档的链接中显示了完整的代码示例,但这里有一个简短的概述:

  • 创建一个继承testing::TestWithParam&lt;T&gt;的测试类。
  • 使用TEST_P 和其中的GetParam() 方法来访问参数值。
  • 您可以使用INSTANTIATE_TEST_SUITE_P 实例化您的测试。使用testing::Values 方法提供值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 2013-05-16
    • 2015-02-28
    • 1970-01-01
    • 2016-07-05
    • 2012-08-18
    • 2012-09-27
    • 2013-03-06
    相关资源
    最近更新 更多