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

如何使用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

我正在使用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 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方法
  • 只写在测试过程中不需要重置静态变量的函数
  • 看看第1点。关于问题2,我认为你并不幸运:变量是静态的,所以你不能重置它,因为你不能修改函数来处理重置。