【问题标题】:Debug, System functions (fopen,fclose,fread,fwrite,...) and for loop in Google Test CGoogle Test C 中的调试、系统函数(fopen、fclose、fread、fwrite、...)和 for 循环
【发布时间】:2020-01-01 05:02:36
【问题描述】:

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

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;
}

【问题讨论】:

  • 在您的问题中,第2点不清楚,第4点无法回答,问“我如何调试”太宽泛了。
  • 我的意思是,我需要一些示例和解决方法
  • 给出你想要测试的代码和你想要存根的函数的例子。
  • 我举了个例子

标签: c unit-testing googletest


【解决方案1】:

您始终可以编写自己的外部函数(存根)定义来支持您的测试,而无需关心函数的实际实现。

为了让您的生活更轻松,您可以使用一些已经存在的存根框架,例如Fake Function Framework

在你的例子中,要使用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);
}

但要清楚,存根并不总是一个好的解决方案,只有当您真的不关心外部函数的实际实现并且只希望该函数的输出用于测试目的时才使用存根。有时,调用真正的外部函数会更好。

(因为你修改了你的问题,所以我打了下面的文字)

您无法从测试用例控制被测函数中的局部变量,您需要通过全局变量、函数输入或存根返回值来控制它...为该局部变量设置值的任何接口您可以在测试用例中与之交互。

【讨论】:

  • 谢谢。我给出了一个需要测试的示例函数
  • 好的。我知道了,最佳答案
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2011-04-25
  • 2020-12-14
  • 2016-12-29
  • 1970-01-01
相关资源
最近更新 更多