如何使用cmocka处理静态元素?

时间:2017-02-09 13:29:52

标签: c unit-testing gcc static cmocka

我正在使用cmocka在我的C-Project上进行一些单元测试,我想知道如何处理静态的emelents。

静态元素适合我:

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

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

    现在有两个问题:

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

    2. 函数内部声明为static的变量不会在两次测试之间重置。因此fut_test_2将会失败。

    3. 如何使用上述静态元素处理这些问题?

1 个答案:

答案 0 :(得分:1)

基于@LPs评论和我自己的想法,我想总结一下可能的解决方案:

关于将函数声明为static的问题:

  1. 一种解决方案是将源文件bar.c包含在main.c的{​​{1}}测试中。
  2. 测试#include "foo.c"fut_test_2可放入fut_test_2,其中包含以下两者:测试中的函数bar.c和测试。然后可以通过将声明添加到fut

    来使测试可访问
    foo.h
  3. 关于静态变量的问题:

    1. 这不容易进行测试。唯一的可能性是通过以下方式之一扩大静态变量的可见性:
      • 将其移至fut之外
      • 全球化
      • 使用一些getter和setter方法
    2. 仅编写在测试过程中不需要重置静态变量的函数。