我是C ++单元测试的新手。我正在使用googletest对包含linux系统调用的源执行单元测试(对覆盖率报告使用gcovr)。为了测试它们,我想到了两种方法
1。使用** LD_PRELOAD (通过对自己的系统调用的实现(例如写,读等)进行挂起)**
2。使用--wrap 链接器选项将实际的系统调用包装到我的存根实现中。
使用选项2几乎是不可行的,因为使用的系统调用数量更多(打开,写入,读取,fseek,套接字等等),因此我想到了使用方法1。
但是,我无法使用方法1生成覆盖率报告(我确实使用--coverage选项编译存根库)。当我看到strace时,它被锁定了。我不知道如何解决这个问题。因此,我想到了保留系统调用,而不是创建虚拟设备文件并对其进行处理。 (例如:/ sys / devices / system / cpu1 / online-> / home / user / dummy / cpu / online)。
现在,我想模拟从写入系统调用到此文件的错误情况,但它似乎不起作用(例如,我已经使用fcntl函数设置了虚拟文件的O_NONBLOCK标志)。
我需要有关
的建议1。使用方法1,如何生成覆盖率报告?
2。如果无法做到这一点,那么如何将虚拟文件的属性设置为与设备文件相同。
只是我的代码的快照: openstub.c
#include <sys/types.h>
#include <sys/stat.h>
int open(const char *pathname, int flags, mode_t mode)
{
if(mode ==1)
{
return 1;
}
else
{
return 0;
}
}
usingopen.c
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char dummypath[]="dummypath";
int filehandle;
filehandle = open(dummypath,O_WRONLY);
if(0>filehandle)
printf("i am NOT using stubs\n");
else if(filehandle ==1) {
printf("I am using stub\n");
}
else
{
printf("I am using stub with Not the WRITE mode\n");
}
}
编译命令:
gcc -shared -fPIC -ftest-coverage -fprofile-arcs openstub.c -o openstub.so
使用open
gcc -ftest-coverage -fprofile-arcs -o usingopen usingopen.c
gcovr -f usingopen
(在LD_PRELOAD设置为openstub.so之后卡住了)
谢谢您的建议!