如何使用cmocka处理静态元素?
我正在使用cmocka对我的C项目进行一些单元测试,我想知道如何处理静态eMelent 静态元素对我来说是:如何使用cmocka处理静态元素?,c,unit-testing,gcc,static,cmocka,C,Unit Testing,Gcc,Static,Cmocka,我正在使用cmocka对我的C项目进行一些单元测试,我想知道如何处理静态eMelent 静态元素对我来说是: 声明为静态的函数 函数中声明为静态的变量 因此,让函数fut成为我们正在测试的函数,foo成为另一个函数。两者都放在文件bar.c中: static int fut(int add) { static int sum = 0; sum += add; return sum; } int foo(int someVar){ //Some calculation on s
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);
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);
}
那么让我们继续吧,我将展示这个问题。我想通过两个独立的测试来测试正在测试的函数,这两个测试通过了add
的一些随机值。testroutines放在main.c中,如下所示:
extern int foo(int someVar);
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.cfoo.c-Icmocka
现在有两个问题:
main.c
访问声明为static的函数,因此链接器将在生成过程中停止fut_测试2
将失败如何使用上述静态元素处理这些问题?基于@LPs评论和我自己的想法,我想总结出可能的解决方案: 关于函数声明为静态的问题:
#include“foo.c”
将源文件bar.c
包含到试驾main.c
中fut_test_2
和fut_test_2
可以放在bar.c
中,其中既包含被测函数fut
又包含测试。然后,通过将声明添加到foo.h
,可以访问这些测试:
extern int foo(int someVar);
extern void fut_test_1(void **state);
extern void fut_test_2(void **state);
- 把它移到fut外面
- 全球化
- 使用一些getter和setter方法