诸多 C 单元测试工具测评报告.docx
- 文档编号:7950251
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:17
- 大小:94.97KB
诸多 C 单元测试工具测评报告.docx
《诸多 C 单元测试工具测评报告.docx》由会员分享,可在线阅读,更多相关《诸多 C 单元测试工具测评报告.docx(17页珍藏版)》请在冰豆网上搜索。
诸多C单元测试工具测评报告
诸多C单元测试工具测评报告
黄硕2013年6月24日
1.概念简介
单元测试1存在的目的即在于使程序员对自己的代码负责,让代码整洁无错,这样大型的软件开发才不会bug,错误盘根错节。
理不出个头绪出来。
●TestSuite2(测试套件)定义的一组测试用例,中间用precondition,postcondition相连。
用来测试软件一个方面的特性是否达到要求。
●TestFixture3(测试夹具)一种控制好的测试情境,控制好的输入输出参数,控制好的数据。
在xUnit里被定义为四步
⏹Setup建立起TestFixture所需的测试环境,初始化一切该初始化的IO、参数、线程、内存、硬件等等
⏹Exercise进行实际的测试操作
⏹Verify验证测试结果
⏹TearDown瓦解、清理、删除建立起来的TestFixture
●TestCase(测试用例)
●MockFunction(仿真函数)当使用一些库函数的时,有写情况下无法调用一些尚未存在或者不方便调用的函数,那么就写一些仿真函数来辅助测试。
●Precondition(前提条件)一步测试的前提条件,例如内存、数据、指针、数据结构甚至是硬件的状态。
●Postcondition(后置条件)一步测试的后置条件,如返回值、内存、数据、指针、数据结构甚至是硬件的状态。
用来提供给下一阶段的测试或验证。
本测试报告的目的是对几种单元测试的框架进行横向对比,本测试报告包含少量用法的简介。
如需学习测试框架请参考各个官网的教学文献。
1.cmockery
1.1简介
cmockery是一个相对来说功能、使用难度、学习难度很低的开源单元测试框架。
有点像opmock2,但是他没有测试用例生成器。
但是功能上更加强化了。
之前的opmock2只能做assertion的验证,而cmockery可以生成exception,内存泄露,实参与形参的匹配,mockfunction返回值的匹配。
1.2平台
cmockery支持Windows,Unix,Linux和Mac,同时支持32位与64位操作系统。
cmockery支持precondition和postcondition。
即允许用户撰写setup和teardown方法。
可以说测试的功能的覆盖已经很全面了。
提供了rpm和deb的安装包,源代码还有Windows上的Makefile。
cmockery支持老的c编译器,最新的C11的编译器功能很多没有被收录进去。
cmockery只需要Link到CStandardLibrary即可运行。
支持的编译器根据环境使用的编译器为准。
1.3用法简析
运行的方法和opmock2类似,是把测试的方法注册在一个类似于堆栈的结构里。
例如:
constUnitTesttests[]={
unit_test(leak_memory_test),
unit_test(buffer_overflow_test),
unit_test(buffer_underflow_test),
};
returnrun_tests(tests);
不同的是cmockery把每一轮运行的状态保存了下来,用来支持postcondition和precondition的建立。
详细的使用方法请参考4
1.4评价
试用起来感觉比opmock2要好很多。
毕竟他包含了更多的测试方法、宏使得可以更全面的测试代码。
另外cmockery是Google自家专用框架。
但是opmock2所有的弊端cmockery并没有全面修正。
比如:
1.没有IDE整合
2.没有自动输出保存结果
1.5总结
cmockery有更大的潜力和发展空间,cmockery比起opmock2更适合我们的测试需求。
但是如果要想运用的很好很轻松仍需自己撰写插件。
下载请见5
2.CTest
2.1简介
不用于维基百科标注的CTest其实是一个CMake内嵌的程序,用来提供测试CMakebuild出来的软件。
2.2平台
支持Windows,Unix,Mac,Linux32位或64位
2.3用法简析
在运行CMakegeneratedbuildtree的时候,开启ENABLE_TEST和ADD_TEST宏,CTest将会自动运行测试并且记录测试结果到XML文件。
2.4评价
CTest是一个运行测试的机制,其并不具备单元测试的框架、方法、环境的集成。
2.5总结
目前对于我们来说没有实际用途。
3.Check
3.1简介
Check是C单元测试中的大牌,诸多著名开源项目都在用Check6。
例如GNUPDF,OpenSync,GStreamer等等。
Check是完全免费并且开源的。
Check严格支持xUnit并可以自己定义宏。
Check不光支持普通的assert,同时可以检查内存泄露,pthread相关的以及LinuxKernelAPI返回的一系列Signal。
3.2平台
在平台上Check支持Linux/Unix居多,但是提供了源代码。
理论上可以在Windows商运行。
支持的编译器根据环境使用的编译器为准。
Check本事采用C编写。
3.3用法分析
用户需要#include
最简单的用例如下所示:
START_TEST(test_name)
{
/*unittestcode*/
}
END_TEST
用户需要自己编写makefile来编译测试用例,makefile的语法如下:
TESTS=check_money
check_PROGRAMS=check_money
check_money_SOURCES=check_money.c
$(top_builddir)/src/money.h
check_money_CFLAGS=@CHECK_CFLAGS@
check_money_LDADD=$(top_builddir)/src/libmoney.la@CHECK_LIBS@
Makefile将会被编译成为Makefile.in。
然后使用autoreconf--install,
./configure和make来进行编译。
用户通过suite_create来建立测试套件,并协调永利之间的关系:
START_TEST(test_money_create)
{
Money*m;
m=money_create(5,"USD");
ck_assert_int_eq(money_amount(m),5);
ck_assert_str_eq(money_currency(m),"USD");
money_free(m);
}
END_TEST
Suite*
money_suite(void)
{
Suite*s=suite_create("Money");
/*Coretestcase*/
TCase*tc_core=tcase_create("Core");
tcase_add_test(tc_core,test_money_create);
suite_add_tcase(s,tc_core);
returns;
}
其中的tcase_add_test函数注册测试用例,而suite_add_tcase函数是把测试用例整合到测试套件里。
Check与众不同的一点是支持输出更详细的结果报告。
需要调用SRunner函数。
输出的报告范例如下:
Runningsuite(s):
Money
0%:
Checks:
1,Failures:
1,Errors:
0
check_money.c:
9:
F:
Core:
test_money_create:
0:
Assertion'money_amount(m)==5'failed:
money_amount(m)==0,5==5
FAIL:
check_money
===============================================
1of1testfailed
Pleasereporttocheck-develAT
===============================================
3.4评价
Check的功能很强大,有一系列的assert和验证机制。
不光可以验证是否相等更可以比大小。
但是Check没有自动生成测试用例、头文件的机制。
没有IDE的整合,没有自动测试检测。
需要手动注册测试用例。
3.5总结
Check比opmock2好很多,功能更实用。
感觉也比cmockery好用。
比AceUnit不差。
而且是开源,完全可以根据自己的需求修改宏的定义和检测机制。
4.AceUnit
4.1简介
AceUnit是一个基于Java的免费C单元测试框架。
AceUnit不是开源的,但是免费。
AceUnit的开发和维护比较频繁,最后一次维护是2013年6月15日。
4.2平台
AceUnit是基于JavaSE6.0,AceUnit可以运行在任何平台。
AceUnit的开发者称会在未来推出用C写的版本7。
支持C89和C99两种编译器标准。
4.3用法分析
AceUnit完全仿照JUnit来实现C语言的单元测试。
JUnit是Java开发的一个最通用的单元测试标准。
被几乎所有开发Java的大型企业应用,Oracle、PayPal、ebay、Amazon等等。
AceUnit可以自动化生成测试用例的头文件,但是要事先自己写好代码文件的所有方法。
例如测试的文件叫做Test.c。
当Test.h不存在时将#include“Test.h”放入“Test.c”内之后执行
java-jarAceUnit.jarTest>Test.h
这样省去了自己写头文件的时间。
实际上用起AceUnit感觉AceUnit其实和Check差不多。
实际的范例语法如下所示:
A_TestvoidtestCompareInt(){
intn1;
intn2;
n1=0;
n2=0;
assertEquals("Comparingtwoequalnumbersmustreturn0.",0,compareInt(&0,&1));
n1=1;
n2=2;
assertTrue("Comparing1with2mustreturnavalue<0.",compareInt(&n1,&n2)<0);
n1=2;
n2=1;
assertTrue("Comparing2with1mustreturnavalue>0.",compareInt(&n1,&n2)>0);
}
AceUnit支持precondition和postcondition。
需要在写测试方法时注明在返回值处定义。
返回值type
用途
A_Test
测试普通用例专用
A_Before
测试Precondition,每个用例一次
A_After
测试Postcondition,每个用例一次
A_BeforeClass
测试Precondition,所有用例只有一次
A_AfterClass
测试Postcondition,所有用例只有一次
A_Ignore
被忽略的用例,AceUnit不会执行
表格1
除了在正常的PC下进行测试,AceUnit还支持在嵌入式的环境下运行。
测试用例的执行不需要像check,opmock2和cmockery一样需要手动注册到main函数里。
AceUnit可以自动识别和执行所有的测试用例。
4.4评价
AceUnit的优点在于:
1.自动生成头文件
2.有一套很严格的语法用来写单元测试
3.类似于JUnit的测试概念,有一套很完善的测试体系。
有TestSuite,TestFixture,Testcases,Setup和TearDown。
4.不需要手动注册测试用例,AceUnit会自动检测所有的方法自动执行。
5.支持嵌入式测试
缺点有:
1.没有很好的和IDE整合
2.嵌入式测试有些情况下会出错
3.没有输出xml的功能
4.有Java撰写而不是C或C++
5.不开源不支持自定义宏
4.5总结
AceUnit相比opmock2,check,cmockery更专业,更严格。
相对来说更适合我们的需求。
5.opmock2
5.1简介
opmock是一个开源的C/C++单元测试的框架。
该框架主要分为两大版本。
opmock1和opmock2。
本片主要测试opmock2。
5.1.1特性
opmock2的功能主要有如下四个:
1.单元测试框架代码的自动生成
2.提供很多宏用来验证各个类型结果的正确性
3.自动运行测试代码
4.可以和其他单元测试框架结合使用
5.1.2单元测试框架代码的自动生成
opmock2采用采用一个shellscript,refresh_tests.sh来自动生成测试文件和方法。
用户输入需要测试的文件(头文件和代码)作为运行此脚本的实参,该脚本自动检测输入文件的后缀以及扫描文件,并根据结果自动生成所需的.c和.h文件用来编写测试用例。
5.1.3提供很多宏用来验证各个类型结果的正确性
opmock2总共提供了15组宏用来验证中间运行结果。
涵盖了char,unsignedchar,byte,unsignedbyte,short,unsignedshort,int,unsignedint,long,unsignedlong,float,cstring,bool,buffer以及虚拟lib。
每一组包含了equal和notequal两种判断。
我认为其中的,file和buffer非常适合验证图像相关的代码。
可以一次直接检测整个buffer的正确性。
也可以验证ti库中函数返回结果的正确性。
5.1.4可以和其他单元测试框架结合使用
可以整合CppUnit和GoogleC++TestFramework进行大型C++软件的测试。
另外,opmock的代码十分简单,并且是公开的。
所以可以根据自己的需求进行修改。
5.2平台
opmock1采用Java编写,可以运行于任何可以运行JavaSE6.0以上的平台。
opmock2则采用C++编写,需要使用LLVM和Clang编译器与解释器编译。
可以在Linux,Unix和Mac上编译于运行。
并支持32位与64位两种操作系统上nativecode的测试。
opmock1现已停止更新,所以本篇评测只要针对的是opmock2。
5.3用法分析
测试的方法如下。
首先行型opmock2自带的脚本生成必要的测试方法。
当写测试用例的时候就像写任何C的代码,直接编写测试用例的逻辑即可。
然后把它们注册在测试用例目录下的main函数里。
比如说我们要测试运行方法test_rgb2gray(),则写
opmock_register_test(test_rgb2gray,"test_rgb2gray");
当注册完所有的测试用例方法之后运行opmock_test_suite_run();
下面是测试用例的返利代码和测试结果:
用例1:
#include"fizzbuzz.h"
#include
#include
#include
char*fizzbuzz(inti)
{
char*result=(char*)calloc(1,20);
if(!
(i%3))strcpy(result,"FIZZ");
if(!
(i%5))strcat(result,"BUZZ");
if(!
strlen(result))sprintf(result,"%d",i);
returnresult;
}
Main:
#include"opmock.h"
#include"fizzbuzz_test.h"
intmain(intargc,char*argv[])
{
opmock_test_suite_reset();
opmock_register_test(test_fizzbuzz_with_3,"test_fizzbuzz_with_3");
opmock_register_test(test_fizzbuzz_with_5,"test_fizzbuzz_with_5");
opmock_register_test(test_fizzbuzz_with_15,"test_fizzbuzz_with_15");
opmock_register_test(test_fizzbuzz_many_3,"test_fizzbuzz_many_3");
opmock_register_test(test_fizzbuzz_many_5,"test_fizzbuzz_many_5");
opmock_register_test(test_fizzbuzz_many_3_and_5,"test_fizzbuzz_many_3_and_5");
opmock_test_suite_run();
return0;
}
最终输出结果:
OKtest'test_fizzbuzz_with_3'
OKtest'test_fizzbuzz_with_5'
OKtest'test_fizzbuzz_with_15'
OKtest'test_fizzbuzz_many_3'
OKtest'test_fizzbuzz_many_5'
OKtest'test_fizzbuzz_many_3_and_5'
OPMOCK:
6testsrun,0testsfailed.
当需要模拟输入一些参数,甚至lib时可以自定模拟的lib和输入实参的结果并运用opmock2运行。
模拟的lib定义:
#ifndefSOUND_H_
#defineSOUND_H_
intdo_sound(char*sound);
#endif
修改后的代码:
#include"fizzbuzz.h"
#include"sound.h"
#include
#include
#include
char*fizzbuzz(inti)
{
char*result=calloc(1,20);
if(!
(i%3))strcpy(result,"FIZZ");
if(!
(i%5))strcat(result,"BUZZ");
if(!
strlen(result))sprintf(result,"%d",i);
intres=do_sound(result);
if(res!
=0){
sprintf(result,"ERROR");
}
returnresult;
}
加载模拟lib的命令行:
>opmock2-isound.h-o.-I/usr/include-I/usr/include/x86_64-linux-gnu-I/usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
opmock2也支持测试用例中的函数回调。
回调函数必须定义成为指向函数的指针并入下模板所示:
typedefint(*OPMOCK_do_sound_CALLBACK)(char*sound,intcalls);
当完成了所有测试用例的编写,需要写出makefile如下面的模板:
1CPPFLAGS=-O0-ggdb
2OBJECTS=fizzbuzz.ofizzbuzz_test.omain.oopmock.o
3
4all:
fizzbuzzTest
5./fizzbuzz_test
6
7fizzbuzz.o:
fizzbuzz.h
8fizzbuzz_test.o:
fizzbuzz.h
9opmock.o:
opmock.h
10
11fizzbuzzTest:
$(OBJECTS)fizzbuzz.h
12gcc-ofizzbuzz_test$(OBJECTS)
13
14clean:
15-rm-f$(OBJECTS)16-rm-ffizzbuzz_test
5.4评价
opmock2的优点是:
1.简单,学习曲线短。
不到一小时就能会用
2.开源,可以自己随意修改
3.可扩展功能,和其他测试框架共同使用
缺点是:
1.没有和任何IDE整合
2.需要自己写Makefile
3.没有precondition和postcondition
5.5总结
opmock2本身很简洁,有一些最基本的单元测试功能。
有点太简洁。
如果需要和IDE结合等等功能都需要自己写。
如果打算大力开发这部分的自主功能的话推荐参考和使用。
6.TPT
6.1简介
TPT是一个专业级的付费测试软件。
由德国公司PIKETEC开发。
不同于维基百科的描述,TPT并不是一个实打实的测试C代码的单元测试软件。
但是确实一款针对安全性的嵌入式控制系统综合测试软件。
他符合ISO26262标准。
6.2平台
目前只看到了Windows版本。
该软件是基于Eclipse,就像是CCS。
6.3用法分析
此款软件结合了测试建模,测试执行和测试评估三个步骤。
其中测试建模部分由专业的图形软件来绘制测试流程,并可以整合MatlabSimulink,ASCET和AUTOSAR软件的测试模型。
在执行过程中可以控制所有条件并对每一步输出做出反馈。
验证步骤则可以输出图标式的高级测试报告。
6.4评价
这款软件适合综合测试多个嵌入式模块之间的理论模型,而不是针对代码的单元测试。
比如我们需要测试镜头、炮筒的传送带、机器手之间的关系可以用这款软件。
而且价格不菲,单独的License售价在$1000以上。
6.5总结
不适合用于单元测试。
7.ParaSoftC/C++De
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 诸多 单元测试工具测评报告 单元测试 工具 测评 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)