c - 如何用cmocka处理静态元素?

标签 c unit-testing gcc static cmocka

我正在使用 cmocka 对我的 C 项目进行一些单元测试,我想知道如何处理静态元素。

静态元素适合我:

  1. 声明为静态的函数
  2. 声明为静态的函数内的变量

因此让函数 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

现在有两个问题:

  1. 无法从 main.c 访问声明为静态的函数,因此链接器将在构建过程中停止。

  2. 函数内声明为静态的变量不会在两次测试之间被重置。所以 fut_test_2 会失败。

如何处理提到的静态元素的这些问题?

最佳答案

根据@LPs 的评论和我自己的想法,我想得出可能的解决方案:

关于函数声明为静态的问题一:

  1. 一个解决方案是包含源文件 bar.c进入试驾main.c通过 #include "foo.c" .
  2. 测试 fut_test_2fut_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);
    

关于静态变量的问题:

  1. 这对测试来说并不容易。唯一的可能性是通过以下方式之一扩大静态变量的可见性:
    • 将它移到 fut 之外
    • 全局推广
    • 使用一些getter和setter方法
  2. 只编写在测试过程中不需要重置静态变量的函数。

关于c - 如何用cmocka处理静态元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42138037/

相关文章:

c++ - ld 报告缺少符号,但符号似乎存在

c - 程序收到信号 SIGSEGV,段错误,./sysdeps/ieee754/dbl-64/e_log.c : No such file or directory

c# - P/调用一个传递给 StringBuilder 的函数

python - 来自 Django 测试的错误 404?

c++ - 编译要在 C++ 版本中链接的 C 库...是否需要指定 C++ 标准?

linux - 符号查找错误: undefined symbol: _ZNSt8messagesIwE2idE

c - 在c中打印垃圾值而不是数组中的最大值

c - 免疫调试器错误 : "access violation when reading [90909090]"

c# - Nunit 使用 TestCaseSource 运行 TestCase,第一次迭代没有参数?为什么?

python - Python 单元测试中具有可变值的字典?