在Google Test C中调试、系统函数(fopen、fclose、fread、fwrite等)和for循环。

4

我正在使用Google Test测试C代码,但是我遇到了一个问题"为系统函数编写存根",如:fopen,fclose,fread,fwrite,memcpy,memset,stat等。我不知道如何正确地编写存根以便于测试其输入/输出,而无需担心真实数据。以下是示例:

bool open_file(void)
{
   FILE *srcfd;
   FILE *destfd;
   int dataLen;
   bool retVal=false;
   char buffer[255];
   srcfd = fopen("srcFileName", "r");
    if(NULL != srcfd)
    {
        destfd = fopen("destFileName", "w+");
        if(NULL != destfd)
        {
            retVal = true;

            while ((true == retVal) &&
                    ((dataLen = fread(buffer, sizeof(char), sizeof(buffer), srcfd)) > 0))
            {
                if (fwrite(buffer, sizeof(char), dataLen, destfd) != dataLen)
                {
                    retVal = false;
                }
            }

            fclose(destfd);

        }
        else
        {
            printf("%s: Failed to create file '%s'...\n",
                    __func__, "destFileName");
        }
        fclose(srcfd);
    }
    else
    {
        printf("%s: Failed to create file '%s'...\n", __func__, "srcFileName");
    }
return retVal;
}

在你的问题中,第二点不够清晰,第四点则无法回答。询问“如何调试”过于宽泛。 - Van Tr
我的意思是,我需要一些示例以及解决方法。 - Tiến TeoCri
请提供您想要测试的代码示例和您想要存根的函数。 - Van Tr
我已经给出了一个例子。 - Tiến TeoCri
1个回答

2
你可以随意编写外部函数(存根)的定义来支持你的测试,而不必关心该函数的真正实现。
为了让你的生活更轻松,你可以使用一些已经存在的桩件框架,比如假函数框架
例如,在你的情况下,要使用 fopen 的存根来测试 bool open_file(void) 函数,你可以在你的测试文件中这样做:
#include "fff.h"
DEFINE_FFF_GLOBALS;
//fake fopen, be sure about the prototype of the faked function
FAKE_VALUE_FUNC(FILE*, fopen, const char*, const char*); 

在测试案例中:
TEST_F(Test_open_file, stub_fopen){
   //call the function under test
   open_file();
   //check number of time fopen called
   ASSERT_EQ(fopen_fake.call_count, 1);
   //check input parameter
   ASSERT_EQ(strncmp(fopen_fake.arg0_val, "destFileName", 100), 0);
}

但要明确的是,桩代码并不总是一个好的解决方案。只有当您真正不关心外部函数的实际实现,只想为测试目的获取该函数的输出时,才使用桩代码。有时候调用真实的外部函数会更好。
(我划掉了下面的文本,因为您修改了问题)
您无法从测试用例中控制被测试函数中的局部变量,您需要通过全局变量、函数输入或桩返回值来控制它...任何可以在测试用例中与其交互的接口来设置该局部变量的值。

谢谢。我已经提供了一个需要测试的示例函数。 - Tiến TeoCri
好的,我明白了,最佳答案。 - Tiến TeoCri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接