我正在使用cmocka在我的C-Project上进行一些单元测试,我想知道如何处理静态的emelents。
静态元素适合我:
因此,让函数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
的一些随机值。 testroutines放在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
现在有两个问题:
无法从main.c
访问声明为static的函数,因此链接器将在构建过程中停止。
函数内部声明为static的变量不会在两次测试之间重置。因此fut_test_2
将会失败。
如何使用上述静态元素处理这些问题?
答案 0 :(得分:1)
基于@LPs评论和我自己的想法,我想总结一下可能的解决方案:
关于将函数声明为static的问题:
bar.c
包含在main.c
的{{1}}测试中。测试#include "foo.c"
和fut_test_2
可放入fut_test_2
,其中包含以下两者:测试中的函数bar.c
和测试。然后可以通过将声明添加到fut
:
foo.h
关于静态变量的问题: