我正在使用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
理想情况下,源代码不应更改以适合单元测试。单元测试框架必须能够测试在生产环境中使用的源代码。
谢谢
答案 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
变量。