如何用cmocka处理静态元素?
How to handle static elements with cmocka?
我正在使用 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
现在有两个问题:
无法从 main.c
访问声明为静态的函数,因此链接器将在构建过程中停止。
函数内声明为静态的变量不会在两次测试之间被重置。所以 fut_test_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方法
- 只编写在测试过程中不需要重置静态变量的函数。
我正在使用 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
现在有两个问题:
无法从
main.c
访问声明为静态的函数,因此链接器将在构建过程中停止。函数内声明为静态的变量不会在两次测试之间被重置。所以
fut_test_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方法
- 只编写在测试过程中不需要重置静态变量的函数。