如何使用 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
方法提供值。
我正在为我的应用程序开发一个命令行选项处理器。我决定使用 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 callingRUN_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
方法提供值。