【问题标题】:how to test static functions of C using google test如何使用谷歌测试测试C的静态函数
【发布时间】:2015-11-12 17:04:33
【问题描述】:

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

【问题讨论】:

  • #include 源文件而不是头文件。

标签: c googletest static-functions


【解决方案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】:

实现此目的的一种方法是将#include C 源文件添加到您的测试源中。然后,static 函数与测试代码属于同一个翻译单元,可以从中调用:

#include "test.c"

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

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

【讨论】:

    【解决方案3】:

    static 函数的可见性仅限于翻译单元。

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

    直接的方法是注释掉函数的 static 修饰符以用于测试目的。

    【讨论】:

    • 考虑到通常的项目有数十甚至数百甚至数千个编译单元,注释掉 static 关键字并不是一个非常实用的方法。
    猜你喜欢
    • 2022-07-27
    • 2010-10-10
    • 2022-12-10
    • 1970-01-01
    • 2015-10-17
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多