为测试目的分配argv

时间:2017-01-11 09:48:44

标签: c++

我必须修改以前编写的C ++代码,并且程序需要一些命令行参数。 其他人将进行审查,并将测试此代码,以减轻它们,我写了这个......

int main (int argc, char *argv[]) 
{
    // To do testing just uncomment the below line.
#define TESTING
#ifdef TESTING  
    argc = ARGUMENT_COUNT;
    argv[1] = new char[strlen(INPUT_FILE) + 1 ];
    strcpy(argv[1], INPUT_FILE);
    argv[2] = new char[strlen(MERGE_FILE) + 1 ];
    strcpy(argv[2], MERGE_FILE);
    .
    .
    .
#endif

我的问题:还有其他更好的方法来处理这种类型的测试,其中涉及命令行,并且在任何地方都使用相同的变量argv

注意:我没有IDE支持。我在远程服务器上使用vi编辑器。

4 个答案:

答案 0 :(得分:2)

将处理命令行参数的代码放入一个单独的函数中,甚至可以放在存储值的类中的方法中,并将它们提供给应用程序。
然后,从main()函数调用此函数/方法。最后,实现带有测试用例/函数的测试程序,测试用例/函数也用准备好的测试数据调用函数并检查预期结果。

这样,生产实现和测试明确分开,无需使用hack来提供测试数据等。

答案 1 :(得分:0)

C ++标准确实允许您更改argcargv。不要忘记释放您使用new[]分配的内存。

但更好的选择是通过IDE或启动脚本传递参数,而不是以这种方式破解代码。

请注意,从C ++中调用main的行为(甚至间接地,即通过另一个函数)是 undefined 。因此,不要创建一个能够做到这一点的解决方案。

为了测试,我使用Boost中提供的套件。见www.boost.org。

答案 2 :(得分:0)

如果你的argv可以是const,你可以创建一个新的[Conditional("Awesome text")] class MyClass { [ConditionField] bool Initialized; [Init] void Init() { Initialized = true; } void Method1() { //do stuff; } } 并像这样替换原点。

argv

如果是测试建议,使用测试框架是更好的选择。

答案 3 :(得分:0)

首先,我会使用测试框架,但如果我要进行自己的测试,我可能会抽象命令行参数。创建一个解析和保存参数的类。使用依赖注入将argv或测试数据发送到构造函数。