我正在使用 cmocka 对我的 C 项目进行一些单元测试,我想知道如何处理静态元素。
静态元素适合我:
- 声明为静态的函数
- 声明为静态的函数内的变量
所以让这个函数fut
成为我们被测试的函数,并foo
成为另一个函数。两者都放在文件中bar.c
:
static int fut(int add) {
static int sum = 0;
sum += add;
return sum;
}
int foo(int someVar){
//Some calculation on someVar...
someVar = someVar * 42;
//call subRoutine
return fut(someVar);
}
让 foo.h 看起来像这样:
extern int foo(int someVar);
所以让我们继续,我将展示问题。我想通过两个独立的测试来测试被测函数,这些测试传递了一些随机值add
。测试例程放在 main.c 中,如下所示:
void fut_test_1(void **state) {
int ret;
ret = fut(15);
assert_int_equal(ret, 15);
ret = fut(21);
assert_int_equal(ret, 36);
}
void fut_test_2(void **state) {
int ret;
ret = fut(32);
assert_int_equal(ret, 32);
ret = fut(17);
assert_int_equal(ret, 49);
}
现在我可以尝试使用以下代码编译单元测试: gcc main.c foo.c -Icmocka
现在有两个问题:
声明为 static 的函数无法从 访问
main.c
,因此链接器将在构建过程中停止。函数内部声明为静态的变量不会在两次测试之间重置。所以
fut_test_2
会失败。
如何处理上述静态元素的这些问题?