如何在C中伪造用户输入

时间:2011-07-25 01:19:54

标签: c testing input

我希望简单的问题。我有一个函数,它一直提示输入用户输入(字符),并在某些条件下发现输入有效时返回一个字符。我正在为这个和其他类似的函数编写测试,但不知道如何伪造用户输入。顺便说一下,我正在使用scanf()来获取用户输入。

6 个答案:

答案 0 :(得分:4)

您可以使用freopen更改标准输入的行为以从文件中读取。将测试输入放在一个文件中,然后在测试前调用它。

freopen("filename", "r", stdin);

答案 1 :(得分:1)

如果您使用的是unix或cygwin,则可以调用可执行文件并要求它将文本文件用作stdin。例如:

bash$ ./a.out < input_file

答案 2 :(得分:1)

您可以执行类似

的操作

echo -e "Test string\nAnother string" | ./a.out

echo命令的字符串应该是程序所需的序列

cat test_str_file | ./a.out

文件test_str_file应包含程序所需序列中的测试字符串

另一方面,您可以简单地用一些虚拟部分替换代码的输入部分。如果您有一个单独的输入模块,则将其替换为虚拟。

答案 3 :(得分:0)

将验证移至另一个功能。并独立测试。或者伪造用户输入重构剩余部分以获取一个函数指针,该函数指针被回调以收集一些字母。这应该是一个简单的假。

我很长时间没有写过C,但也可以使用

/* test this independentaly */
int isvalid(char* chars){ 
  /* do stuff and return result */
}

/*real function */
char* getinput() {
  scanf(....)
  return stuff_from_scanf;
}



/*fake/mock function */
char* getinputFake(char * testString) {
   return testString;
}


test() {
 int result = isvalue(getinputFake("test data"));
 /* rest of test */
}

您不需要测试scanf函数,但是您可以用fscanf替换它并使用类似的字符传入流

标准输入

char* getinput(FILE * stream) {
   fscanf(stream....)
   return stuff_from_fscanf;
}


test() {
 FILE * stream = .....; /*create a dummy stream say from */
 int result = isvalue(getinput(stream);
 /* rest of test */
}

答案 4 :(得分:0)

为什么不用默认值调用函数?

答案 5 :(得分:0)

这是一个非常天真的解决方案,但它可能会做你想要的:

char getFakeUserInput()
{
    static char* fakeInput = "This is some user input\n";
    static int pos = 0;

    if(pos >= strlen(fakeInput))
        return '\0';

    return fakeInput[pos++]
}