我的老板告诉我为我写的小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'。
答案 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的一部分,这意味着您没有测试原始主函数。)