如何对涉及 IO 的 c 函数进行单元测试? [英] How to unit test c functions involving IO?
问题描述
我在为涉及 IO 操作的 C 函数编写单元测试时遇到问题.例如,下面是我编写的从控制台获取用户输入字符串的代码.我不知道如何使用 getchar() 函数自动测试用户输入.
I am facing problems in writing unit tests to C functions which involve IO operation. For example, below is the code I wrote to get an input string from the user from console. I do not know as to how to automate testing user input using getchar() function.
char * GetStringFromConsole()
{
char *strToReturn = NULL;
int len = 128;
strToReturn = (char*)malloc(len);
if (strToReturn)
{
int ch;
char *ptr = strToReturn;
int counter = 0;
for (; ;)
{
ch = getchar();
counter++;
if (counter == len)
{
strToReturn = realloc(strToReturn, len*=2 );
ptr = strToReturn + counter-1;
}
if ((ch != EOF) && (ch != '
') && (counter < len))
{
*ptr++ = ch;
}
else
{
break;
}
}
*ptr = ' ';
}
return strToReturn;
}
推荐答案
Mock getchar
:
使用预处理器,例如在您的测试文件中.
Utilizing preprocessor, e.g. in your test file.
#define getchar mock_getchar
#include "GetStringFromConsole.h"
...
const char* mock_getchar_data_ptr;
char mock_getchar()
{
return *mock_getchar_data_ptr++;
}
...
// in test function
mock_getchar_data_ptr = "hello!
";
YourAssertEquals("hello", GetStringFromConsole());
替换链接器的符号(在我看来更难),例如在源 .c 文件中的某处定义自己的 getchar
而不是链接到 stdlib(例如 Windows 上的 msvcrt)
Substitute symbol for the linker(harder, in my opinion), e.g. define your own getchar
somewhere in your source .c files instead of linking to a stdlib(e.g. msvcrt on windows)
修改被测函数以接受返回char
的函数,最佳选择(恕我直言) - 与stdlib没有冲突.并通过从测试代码中的 1 点传递类似 mock_getchar
的东西来设置测试.
Modify function under test to accept a function returning char
, best choice(IMHO) - no conflicts with stdlib. And setup a test by passing a thingy like mock_getchar
from point 1 in test code.
typedef char (*getchartype)();
char * GetStringFromConsole(getchartype mygetchar)
{
...
c = mygetchar()
对于 1 和 2 点,我建议使用您自己的函数而不是 getchar
(例如 mygetchar
>) - 这样您就可以模拟/替换它,而不会与 std 包含/库发生冲突.
For points 1 and 2 I'd propose to use your own function instead of getchar
(e.g. mygetchar
) - this way you could mock/substitute it without facing conflicts with std includes/libs.
这篇关于如何对涉及 IO 的 c 函数进行单元测试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!