Google 测试 C 中的调试、系统函数(fopen、fclose、fread、fwrite、...)和 for 循环
Debug, System functions (fopen,fclose,fread,fwrite,...) and for loop in Google Test C
我正在使用 Google Test 来测试 C 代码,但我遇到了问题 Write Stub for system functions like: fopen,fclose,fread,fwrite,memcpy ,memset,stat,...我不知道如何 Stub 它的 input/output 正确地方便测试而不必关心真实数据。示例如下:
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;
}
您始终可以编写自己的外部函数(存根)定义来支持您的测试,而无需关心函数的实际实现。
为了让您的生活更轻松,您可以使用一些已经存在的存根框架,例如 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);
}
但请注意,存根并不总是一个好的解决方案,只有当您真的不关心外部函数的实际实现并且您只想将该函数的输出用于测试目的时才使用存根。有时,调用真正的外部函数会更好。
(我把下面的文字划掉是因为你修改了你的问题)
你不能从你的测试用例中控制被测函数中的局部变量,你需要通过全局变量,函数输入或存根 return 值来控制它......无论接口设置您可以在测试用例中与之交互的局部变量的值。
我正在使用 Google Test 来测试 C 代码,但我遇到了问题 Write Stub for system functions like: fopen,fclose,fread,fwrite,memcpy ,memset,stat,...我不知道如何 Stub 它的 input/output 正确地方便测试而不必关心真实数据。示例如下:
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;
}
您始终可以编写自己的外部函数(存根)定义来支持您的测试,而无需关心函数的实际实现。
为了让您的生活更轻松,您可以使用一些已经存在的存根框架,例如 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);
}
但请注意,存根并不总是一个好的解决方案,只有当您真的不关心外部函数的实际实现并且您只想将该函数的输出用于测试目的时才使用存根。有时,调用真正的外部函数会更好。
(我把下面的文字划掉是因为你修改了你的问题)
你不能从你的测试用例中控制被测函数中的局部变量,你需要通过全局变量,函数输入或存根 return 值来控制它......无论接口设置您可以在测试用例中与之交互的局部变量的值。