在C中检查单元测试:测试静态方法的最佳方法

时间:2018-11-04 22:18:21

标签: c unit-testing static-methods

我正在使用Check框架对C代码进行单元测试,但是我找不到测试静态方法的正确方法。

我的工作方式根本不是理想的选择,并且希望有人能为我指出正确执行方法的正确方向。我的解决方法是简单地添加#ifdef宏,以防万一我在编译时通过-D DEBUG时将静态方法更改为extern。

在源文件中

#ifdef DEBUG
unsigned ds_roundup_to_prime (const unsigned bsize) {
#else
static inline unsigned ds_roundup_to_prime (const unsigned bsize) {
#endif

在头文件中,我

#ifdef DEBUG
unsigned ds_roundup_to_prime (const unsigned bsize);
#endif

理想情况下,源代码不应更改以适合单元测试。单元测试框架必须能够测试在生产环境中使用的源代码。

谢谢

2 个答案:

答案 0 :(得分:4)

static函数是否应进行测试尚有争议,因为它们不属于公共API。

我通过包含被测单元而不是与之链接来测试static功能:

foo.c (被测单元)

static int foo(int x)
{
    return x;
}

/* ... */

test_foo.c

#include "foo.c"

void test_foo(void)
{
    assert( foo(42) == 42 );
}

int main(void)
{
    test_foo();
}

仅编译该测试:

$ gcc -Wall -Werror -o test_foo test_foo.c
$ ./test_foo

答案 1 :(得分:1)

我以以下方式测试static功能。

我有一个名为utility.h的头文件。它具有以下定义:

#ifdef UNIT_TEST
  #define UTILITY_STATIC(DECLARATION) extern DECLARATION; DECLARATION
#else
  #define UTILITY_STATIC(DECLARATION) static DECLARATION
#endif

每个具有要测试功能的源文件都这样声明:

#include "utility.h"
UTILITY_STATIC(void function(void));
UTILITY_STATIC(void function(void))
{
}

我还有一个用于单元测试可执行文件的附加头文件(例如test_helper.h),其行如下:

extern void function(void);

通过这种方式,测试可以访问function,而没有define UNIT_TEST的源文件则不能。

注意

这也可以用于static变量。