分配参数用于测试目的

Assigning argv for testing purpose

本文关键字:测试 用于 参数 分配      更新时间:2023-10-16

我必须修改以前编写的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 编辑器。

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

这样,生产实施和测试是明确分离的,无需使用黑客来提供测试数据等。

如果你的 argv 可以是 const,你可以创建一个新的argv并像这样替换源。


int main (int argc, const char *argv[]) 
{
    // To do testing just uncomment the below line.
#define TESTING
#ifdef TESTING
    const char* args[]={
       "arg 1","arg 2","arg 3",nullptr
    };
    argc = sizeof(args)/sizeof(char*);
    argv = args;
#endif
}

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

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

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

请注意,从自身调用main的行为(即使是间接的;即通过另一个函数)在C++中是未定义的。因此,不要创建执行此操作的解决方案。

为了进行测试,我使用 Boost 中提供的套件。请参阅 www.boost.org。

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