如何使用Google Test测试C的静态函数

wbgh16ku  于 2023-04-05  发布在  Go
关注(0)|答案(3)|浏览(271)

我有一个C文件包含了一些静态函数,如何用google test来测试那些静态函数?
头文件:

test.h
int accessData();

源文件:

test.c
static int value;
static int getData()
{
   return value;
}

int accessData()
{
    if(value != 0)
    {
       return getData();
    }
    return 0;
}

静态函数被全局函数调用,但是如何使用google test测试那些静态函数呢?

vu8f3i0k

vu8f3i0k1#

我知道要用google test测试一个函数,它必须对测试代码可见。一个静态函数只对当前编译单元可见。
解决这个问题的一种方法是为了测试的目的“移除”static属性:

#ifndef GOOGLE_TEST
# define STATIC static
#else
# define STATIC
#endif

STATIC int getData();

如果这产生了冲突,例如因为在许多源文件中有一个getData()函数,您可以创建简单的容器函数:

static int getData(<arglist>);

#ifdef GOOGLE_TEST
int myModule_getData(<arglist>) {return(getData(<arglist>);}
...
#endif
7rtdyuoh

7rtdyuoh2#

一种实现方法是将C源文件#include到测试源中(如果它只使用有效的C++的C子集)。然后,static函数与测试代码属于同一个翻译单元,并且可以从中调用:

#include "test.c"

/* here follow the tests of getData() */

这样做的缺点是test.c中的所有内容都要重新编译,这对构建时间有明显的影响。如果这是一个问题,你可以考虑将要测试的静态函数提取到它们自己的源文件中(例如test_p.c,其中_p意味着私有/内部)。然后从test.c和你的单元测试中提取#include "test_p.c"

34gzjxbg

34gzjxbg3#

static函数的可见性仅限于转换单元。
AFAIK,对于googletest,您需要从包含使用TEST()编写的测试代码的单独测试文件中调用被测函数。如果被测函数是static,则无法直接从TEST() MACRO调用进行测试。
直接的方法是注解掉函数的static修饰符,以用于测试目的。

相关问题