检查 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
我正在使用 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