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

Check Unit testing in C: Best way to test static methods

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

我的解决方法一点也不理想,希望有人能指出正确的方向,告诉我如何正确地完成它。我的解决方法是简单地添加 #ifdef 宏,该宏将静态方法更改为 extern 以防我在编译时通过 -D DEBUG。

在源文件中

#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

理想情况下,不应更改源代码以满足单元测试的需要。单元测试框架,应该能够测试源代码,因为它会在生产中看起来。

谢谢

我按以下方式测试 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 变量。

是否应该测试 static 函数是有争议的,因为它们不是 public 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