您好,欢迎访问三七文档
CUnit的用法CUnit下载地址:在线文档帮助:关于CUnit,本文主要从介绍三方面的内容:1.CUnit的介绍。1.1介绍如何使用CUnit。CUnit是一个对C语言编写的程序进行单元测试的框架,在线文档说它作为一个静态链接库被链接到用户的测试代码中。它提供了一种简洁的框架来建立测试架构,并提供丰富的断言(Assertion)来测试通用数据类型。除此之外,它还提供了许多不同的结构来运行测试用例和报告测试结果。(1)CUnit的架构TestRegistry|------------------------------||Suite'1'....Suite'N'||------------------------------||||Test'11'...Test'1M'Test'N1'...Test'NM'提到这个框架,为后面如何使用CUnit提供了基础。先介绍这个框架,从底层往上介绍就两句话:(1)每个测试用例被包装在一个测试包(suite)中,(2)每个测试包(suite)是在有效的测试注册单元(TestRegistry)中注册的。对于CUnit来说,它是单线程运行,所以每次只能有一个有效的测试注册单元(TestRegistry),这个测试注册单元下面可以包含多个测试包(suite),每个测试包可以拥有多个测试用例。划分测试包(suite)的规则可以自由约定,比如按照模块来划分,一个模块的测试用例集中到一个测试包中(suite)。至于测试用例,则用来测试模块内部的函数。测试用例函数通过提供的各类输入调用被测试的函数,返回执行结果,然后通过CUnit提供的断言来判断被测试的函数是否正确。(2)测试模式下面是四种测试模式:1AutomatedOutputtoxmlfileNon-interactive2BasicFlexibleprogramminginterfaceNon-interactive3ConsoleConsoleinterface(ansiC)Interactive4CursesGraphicalinterface(Unix)Interactive第一种模式是将结果输出到XML文档中,便于生成报告。第二种模式是每一次运行结束之后在standardoutput中显示测试结果,不能保留测试结果数据。第三种模式是console方式的,可以人机交互;前两种模式是非交互式的。第四种只在Unix中使用。(3)测试的基本流程1)编写单元测试函数(有必要的话要写suite的init/cleanup函数)。Writefunctionsfortests(andsuiteinit/cleanupifnecessary).2)调用函数CU_initialize_registry()初始化测试注册单元(TestRegistry)。Initializethetestregistry-CU_initialize_registry()3)调用函数CU_add_suite()将测试包(suite)添加到测试注册单元(TestRegistry)中。Addsuitestothetestregistry-CU_add_suite()4)调用函数CU_add_test()将测试用例添加到测试包(suite)中。Addteststothesuites-CU_add_test()5)使用合适的接口来运行测试用例。Runtestsusinganappropriateinterface,e.g.CU_console_run_tests6)调用函数CU_cleanup_registry清除测试注册单元(TestRegistry)。Cleanupthetestregistry-CU_cleanup_registry()1.2通过一个例子来说明使用方法。先说明文件的组织结构:1.被测试的模块:(1)文件MainModule.c,定义了一个求和函数cal_num。(2)头文件MainModule.h,声明了求和函数cal_num。2.测试用例和测试包(1)文件TestMainModule.c,定义了测试用例。3.单元测试运行入口(1)文件CUnitRunTest.c各个文件的内容如下:【1】MainModule.h[cpp]viewplaincopy1.#ifndef__MAIN_MODULE_H__2.#define__MAIN_MODULE_H__3.#includestdio.h4.5.//计算两个数之和6.intcal_num(inta,intb);7.8.#endif【2】MainModule.c[cpp]viewplaincopy1.#includeMainModule.h2.3.////计算两个数之和4.intcal_num(inta,intb)5.{6.intc;7.8.c=a+b;9.10.returnc;11.}【3】TestMainModule.c[cpp]viewplaincopy1.#includestdio.h2.#includeassert.h3.#includeCUnit-2.1-0/include/CUnit/console.h4.#includeMainModule.h5.6.intInitSuite()7.{8.return0;9.}10.11.intEndSuite()12.{13.return0;14.}15.16.intTest_Is_Equal(inta,intb,intreal)17.{18.intresult;19.20.result=cal_num(a,b);21.if(result==real)22.{23.return1;24.}25.return0;26.}27.28.intTest_Is_Not_Equal(inta,intb,intreal)29.{30.intresult;31.32.result=cal_num(a,b);33.if(result!=real)34.{35.return1;36.}37.return0;38.}39.40.voidTest1()41.{42.CU_ASSERT(Test_Is_Equal(3,4,7));43.}44.45.voidTest2()46.{47.CU_ASSERT(Test_Is_Not_Equal(4,5,10));48.}49.50./*0表示成功,1表示失败*/51.intAddTestMainModule()52.{53.CU_pSuitepSuite=NULL;54.55./***************56.*1.CU_add_suite增加一个Suite57.*2.Suite名字:testSuite58.*3.InitSuiteEndSuite:分别是测试单元初始和释放函数,如不需要则NULL传递59.****************/60.pSuite=CU_add_suite(testSuite,InitSuite,EndSuite);61.62.//检测注册Suite情况63.if(NULL==pSuite)64.{65.//return1;66.}67.68./***************69.*1.注册当前Suite下的测试用例70.*2.pSuite:用例指针71.*3.Test1:测试单元名称72.*4.Test1:测试函数73.***************/74.if(NULL==CU_add_test(pSuite,Test1,Test1)||75.NULL==CU_add_test(pSuite,Test2,Test2))76.{77.return1;78.}79.80./***另外一种测试方式***************/81./*82.CU_TestInfotestcases[]={83.{Test1:,Test1},84.{Test2:,Test2},85.CU_TEST_INFO_NULL86.};87.88.CU_SuiteInfosuites[]={89.{Testingthefunctioncal_num:,InitSuite,EndSuite,testcases},90.CU_SUITE_INFO_NULL91.};92.93.if(CUE_SUCCESS!=CU_register_suites(suites))94.{95.return1;96.}97.*/98./************************************/99.100.return0;101.}【4】CUnitRunTest.c[cpp]viewplaincopy1.#includestdio.h2.#includeassert.h3.#includeCUnit-2.1-0/include/CUnit/console.h4.5.externintAddTestMainModule();6.7.intmain()8.{9.10.//CU_initialize_registry注册函数注册一个用例返回CUE_系列异常值11.if(CUE_SUCCESS!=CU_initialize_registry())12.{13.returnCU_get_error();14.}15.16.//CU_get_registry返回注册到用例指针17.assert(NULL!=CU_get_registry());18.19.//检测是否在执行20.assert(!CU_is_test_running());21.22.//调用测试模块完成测试用例23.if(0!=AddTestMainModule())24.{25.CU_cleanup_registry();26.returnCU_get_error();27.}28.29.//使用console控制交互界面的函数入口30.CU_console_run_tests();31.32./***使用自动产生XML文件的模式********33.CU_set_output_filename(TestMax);34.CU_list_tests_to_file();35.CU_automated_run_tests();36.***********************************/37.38.//调用完毕清除注册信息39.CU_cleanup_registry();40.41.return0;42.}2.在两种不同环境下使用CUnit来上面的例子进行单元测试。2.1在WindowsXP下,在VC6.0集成CUnit来进行单元测试。(1)自己动手生成链接静态库CUnit.lib。下载CUnit-2.1-0-src.zip,解压,在CUnit-2.1-0/CUnit目录下,用VC6.0打开工程文件CUnit.dsp,有个提示,说没有找到workspace文件,不会理会,直接确定。然后在当前打开的工程项目中,点击FileView,展开文件树形结构,任意点击一个文件打开,然后在最上面的工具栏点击“编译”和“链接”,在CUnit-2.1-0/CUnit目录下就生产CUnit.lib。(2)在VC6.0新建一个名为Test_CUit的Win32consoleapplication工程,将上面例子中的文件包含进来。(3)下载CUnit-2.1-0-winlib.zip,解压,把解压的目录CUnit-2.1-0复制到当前的工程目录下。(4)将CUnit.lib叶复制到当前的工程目录下,并在Project-Settings...-Link-Object/librarymodules中内容的末尾增加CUnit.lib,用空格和前面的静态库文件隔开,然后点击OK即可。(5)在Test_CUit
本文标题:CUnit的用法
链接地址:https://www.777doc.com/doc-2908220 .html