2017-02-09 46 views
1

我正在使用cmocka在我的C-Project上做一些单元测试,我想知道如何处理静态多边形。如何使用cmocka处理静态元素?

静态元素对我来说:声明为static

  • 变量函数内部

    1. 功能被声明为static

    因此,让功能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访问,所以链接器将在构建过程中停止。

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

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

  • +1

    看看[这个SO问题](http://stackoverflow.com/questions/593414/how-to-test-a-static-function)关于点1.关于问题2我认为你是没有幸运:变量是静态的,所以你不能重置它,只要你不能修改函数来处理重置。 – LPs

    回答

    1

    基于@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. 只写入不需要在测试过程中重置的静态变量的函数。