我试图使用谷歌测试来测试C代码,但我遇到了一些问题,写存根系统功能,如:fopen,fclose,fread,fwrite,memcpy,memset,stat,...我不知道如何正确地将它们存根以覆盖函数中需要测试的所有分支。
例如,我有一个函数,如何测试它的存根fopen,fclose,fwrite,fread?只有存根,而不是模拟。
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *f;
//initialize the arr1 with values
int arr1[5]={1,2,3,4,5};
int arr2[5];
int i=0;
//open the file for write operation
if((f=fopen("includehelp.txt","w"))==NULL){
//if the file does not exist print the string
printf("Cannot open the file...");
exit(1);
}
//write the values on the file
if((fwrite(arr1,sizeof(int),5,f))!=5){
printf("File write error....\n");
}
//close the file
fclose(f);
//open the file for read operation
if((f=fopen("includehelp.txt","r"))==NULL){
//if the file does not exist print the string
printf("Cannot open the file...");
exit(1);
}
//read the values from the file and store it into the array
if((fread(arr2,sizeof(int),5,f))!=5){
printf("File write error....\n");
}
fclose(f);
printf("The array content is-\n");
for(i=0;i<5;i++){
printf("%d\n",arr2[i]);
}
return 0;
}
1条答案
按热度按时间f2uvfpb91#
sample.c
中的file()
函数调用fopen()
。在一个完全不同的文件(* 编译单元 *)中将fopen
定义为其他内容不会改变这一点。你不能简单地模仿一个自由函数。
你可以修改
file()
函数,让它接受一个指向fopen()
函数的指针。然后在测试中,你在调用file()
函数时提供一个指向模拟函数的指针。这是一种 * 依赖注入 * 的形式。另一个选择是使用条件编译。
使用依赖注入的示例:
然后在测试代码中:
如果使用了许多要模拟的系统函数,还可以创建一个包含指向所有相关函数的指针的结构。
这里的前提是,如果你想测试你的代码,你需要编写 * 可测试的代码 *。依赖注入是实现这一点的一种方法。