如何使用 GTest 测试命令行选项解析器

How to test a command line options parser using GTest

我正在为我的应用程序开发一个命令行选项处理器。我决定使用 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 手册内容如下:

The ::testing::InitGoogleTest() function parses the command line for googletest flags, and removes all recognized flags. This allows the user to control a test program's behavior via various flags, which we'll cover in the AdvancedGuide. You must call this function before calling RUN_ALL_TESTS(), or the flags won't be properly initialized.

但是这样一来,我就可以只测试一个序列了。我想针对不同的选项多次执行此操作。我该怎么做?

有没有更好的策略来实现这个?我可以使用测试装置来做到这一点吗?

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

Value-parameterized tests allow you to test your code with different parameters without writing multiple copies of the same test. This is useful in a number of situations, for example:

  • You have a piece of code whose behavior is affected by one or more command-line flags.
  • You want to test different implementations of an OO interface.
  • You want to make sure your code performs correctly for various values of those flags.

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

完整的代码示例显示在 link 到 Google 测试 GitHub 文档中,但这里有一个简要概述:

  • 创建测试 class 继承 testing::TestWithParam<T>.
  • 使用 TEST_P 并在其中使用 GetParam() 方法访问参数值。
  • 您可以使用 INSTANTIATE_TEST_SUITE_P 实例化您的测试。使用 testing::Values 方法提供值。