如何对涉及 IO 的 c 函数进行单元测试? [英] How to unit test c functions involving IO?

查看:24
本文介绍了如何对涉及 IO 的 c 函数进行单元测试?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在为涉及 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:

  1. 使用预处理器,例如在您的测试文件中.

  1. 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()
    

  • 对于 12 点,我建议使用您自己的函数而不是 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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆