如何使用谷歌测试测试C的静态功能

时间:2015-08-19 11:54:44

标签: c googletest static-functions

我有一个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测试那些静态函数?

3 个答案:

答案 0 :(得分:2)

实现此目的的一种方法是将{C}源文件#include放入测试源。然后,static函数是与测试代码相同的翻译单元的一部分,可以从中调用:

#include "test.c"

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

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

答案 1 :(得分:1)

我知道要使用google test测试一个函数,它必须对测试代码可见。静态函数仅对当前编译单元可见。

解决这个问题的一种方法是"删除"用于测试目的的静态属性:

#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

答案 2 :(得分:-1)

static功能使其可见性仅限于翻译单元。

AFAIK,对于googletest,您需要从单独的测试文件调用测试中的函数,该文件包含用TEST()编写的测试代码。如果被测函数是static,则无法直接从TEST() MACRO调用中测试它。

直接的方法是,为测试目的注释掉static修饰符。