从c中的简单单元测试开始

时间:2010-06-30 11:24:48

标签: c linux unit-testing

我的老板告诉我为我写的小c文件(foo.c)编写单元测试。我在网上看了很多关于单元测试的背景知识,比如只测试一个函数并使测试完全自动化,但我没有找到任何关于如何实现实际单元测试的教程。我尝试了以下方法,但失败了。

    /*foo.c*/
    #include foo.h
    #if UNIT_TESTING
    #define main example_main
    #endif

    int foo1(...){...}
    int foo2(...){...}

    int main(int argc,char **argv) {
        foo1(...);
        foo2(...);
    }



    /*test_foo.c*/
    #include "foo.h"

    void main(int argc,char **argv) {

        int i = example_main(argc,argv);
        return;
    }



    /*foo.h*/
    int example_main(int argc,char **argv);

作为cmd,我使用:

gcc -Wall -pedantic foo.c test_foo.c -DUNIT_TEST=1 -o test_foo.out

我得到以下错误:

test_foo.c: warning: return type of ‘main’ is not ‘int’
test_foo.c: In function ‘main’:
test_foo.c warning: unused variable ‘i’
/tmp/ccbnW95J.o: In function `main':
test_foo.c: multiple definition of `main'
/tmp/ccIeuSor.o:foo.c:(.text+0x538b): first defined here
/tmp/ccbnW95J.o: In function `main':
test_foo.c:(.text+0x17): undefined reference to `example_main'
collect2: ld returned 1 exit status

我做错了什么?或者你会推荐另一种单元测试方法。

谢谢!

[更新] 更正了我的代码中的拼写错误并发布了更新的错误消息

[更新/澄清] 我应该使用cmockery所以我尝试了cmockery网站上的'calculator.c'示例,但无法运行它。在我的阅读中,我得到的印象是单元测试不依赖于框架。所以我想从一个非常简单的例子开始。 "#if UNIT_TESTING #define main example_main"来自cmockry'manual'。

5 个答案:

答案 0 :(得分:8)

单元测试不仅是编写和运行测试用例,还包括报告。我强烈建议你使用像cunit这样的框架。除此之外,单元测试最好在构建continuous integration进程后运行,以便在开发过程中尽早发出更改。使用cunit,您可以生成可以在Web服务器中分析和显示的XML报告(大多数时候在XSLT的帮助下)。做自己的怪癖会有效,但是当你为测试添加越来越多的功能时,你将重新发明轮子,除非你使用一些既定的框架。

另一个评论:我永远不会混合生产代码和测试代码。使用单独的项目,否则您将难以跟踪源代码存储库中的实际产品更改,并通过大量测试更改来填充您的历史记录。

答案 1 :(得分:3)

我认为你应该使用单元测试框架而不是在简单的C中编写自己的测试。看看this list

答案 2 :(得分:1)

也许是关于失踪';'在main()函数的最后一个字符串中:

int main(int argc,char **argv) {
        foo1(...);
        foo2(...)
    }

答案 3 :(得分:1)

我想你想要一个分号......

/*foo.h*/
int example_main(int argc,char **argv);

答案 4 :(得分:0)

这个问题看起来真的是关于构建测试代码和现有库。

您所遵循的示例是否尝试使用主要功能测试程序?为什么这个例子没有错误“主要'的多重定义”?

一种解决方案是将被测软件(SUT)中的主要功能与程序的其余部分分开,并且不在测试项目构建中包含SUT的主要功能。 (当然,这意味着原始主函数不再是SUT的一部分,这意味着您没有测试原始主函数。)