《分享几个嵌入式软件单元测试框架.docx》由会员分享,可在线阅读,更多相关《分享几个嵌入式软件单元测试框架.docx(16页珍藏版)》请在第壹文秘上搜索。
1、作为一名合格的嵌入式软件工程牌,不仅需要写业务代码,还需要n叭元测试代码,这个时候,有一我单元测试框架就显得尤为重要.软件开发中,每次需求的变更基本都需要改写代码,而代码变更后就需要进行功能测试.当然,在功能测试之前需要代码的单元测试,避免代码改动后部分场景没有验证,最后出现各种问题.通过测试框架快速完成代码的单元测试,不仅可以覆蔽之前测试的场景,也能快速反应问题在哪里.常用的C语言费试樨架有: Unity;,个小型的,开源的C语言测试机;架,提供了用于测试的基本结构和函数.简单好用,常用于嵌入式系统开发. CUnit;,个面向C语言侧试的框架,使用简单,支持自动化测试和手动测试. Check
2、:适用于C语言的单元测谎框架,使用简单,支持测试我件、测试用例的管理,便于维护测试组件. Goog1.eTest:Goog1c推出的C+测试框架,支持C语言,可以跨平台,具有丰富的斯言辉和Mocks. CBOCkai适用T-C语言的单元测试框架,支持内存泄漏检测,支持Hock函数和StUb函数等高级用法. criterion:基于C语言的单元测试框架,支持参数化测试和测试用例依赖,具有良好的性能和易用性.这里介绍Unity,其他的大家感兴趣可以自行查阅,不同的单元测试框架适用下不同的开发需求和场嵬。开发人员可以按照自己的项目要求选择最适合的框架.UnityW小可以只用到几个文件即可完成,把Un
3、ity源码目录下的Unity.c、Unity.h、Unity_internaIs.h三个文件复制至我们的工程目录下进行编译即可,然后在测试文件代码中包含简单的示例完成功能函数的验证:/这里可以放置每个测试用例运行前的初始化代!VOidtearDown()1/这里可以放置何个测试用例运行后的清理代四itAdd(ita,intb)returna+oidtestAddFun(voidEST_ASSERT_EQUA1._UINT(4,Add(1.,5);TEST_ASSERT_EQUA1._UINT(-6,Add(1.,-5);|UNITY_BEG1N();启动测试RUIvrEST(SSJAddFUn
4、);UNITY_END();结束测试returnC;通过串口或终端打印内容为:C:testtest.c:47:testAddFun:PASS33其中.un:ty_intcrna1s.h文件中可以修改输出终端,即.H:TY_O,1?U:_Ct-:AR宏的定义.*OutputMethod:stdout(DEFAU1.T/defineUNHYOUYPUT一CHAR(八)(Void)PUtChar(aI*ifdefinedassothinge1.se,makesurewedec1.oreitheresoeterfoicMNITUTPUTCHARHEADERDEC1.ARATION:endif其中,自定
5、义实现的C语言扩展库(Cot)的容卷功IB函数都已通过Unity添加了对应的单元窝试用例,倍接,https:/giteecom/const-zpc/cot旨在打造一个C语言的通用扩展库。1、介绍支持多种容器实现,包括通用队列(包括不定长队列)、栈、双向链表和动态数组功能双向健表W点可动态创建(需要在初始化分此内存)或静态添加动态数组在初始化分配的内存中最大限度地使用,支持随机访问(连续地址支持定义序列化/反序列化的结构体功能使用到fBoost库中的PP库功能宏谱法:确保两边都播要保持头文件结构体定义一致移植了部分C+B。St库中的PP库功能通过宏语法实现复杂的宏语言,灵活进行使用在编译的时候生
6、成自己期望的代码2、软件架构目录说明:I-COt1-inc1.ude1-container/容器实现头文件IIpreprocessor/移植BOOSt库中的PP头文件1.-seria1.izeIJrC/序列化/反序列化实现头文件1container/容器实现卸文件1.-Seria1.iZep-testH序列化/反序列化实现湖文件IHcontainerH容器实现测试代码1.-seria1.ize/序列化/反序列化测试代码1.-unity3、使用说明/单兀测试框架代码(I)容器类功能使用说明双向链表使用方式demo:intmain()cot1.ist-t1.ist;cot1.istItem-tno
7、deBuf10;cot1.istInitC&1.ist,nodeBuf,10);intdata1.三10intdata2-20;intdata3=30;头徐维加元素cot1.ist-PushFront(S1.ist1.&data1.);尾部增加元素cot1.ist_PushBack(A1.ist,adata2);/插入元素Cot1.isteInsertcot1.ist-End(1.ist)#&data3);/使用迭代器织历所有元素for_1.ist_each(item,1.ist)pritf(=%d1,*item-ptr(int,item);/移除指定元素COt1.ist.Remove(81i
8、st,&data3);/根据添加移除兀素Cot1.isteRemoveIf(A1.ist1.OnRemoveCondition);COt1.iSjt1.ist2;cot1.istItem_tode8f2(5;C0t1.ist-Init(S1.ist2,nodeBuf2,3);/旌衣内存交换cot1.ist_Swap(&1.ist1.,&1.ist2);return0;动态数组使用方式dem。:intmain()uint8tbuf2;cotVector-tvector;cotVector-Init(Svector,buf,sizeof(buf),sizeof(uint32t);/在尾部追加元素u
9、int32tdata-42;CotVectorePush(Svector1&data);data-56;cotVector_Push(&vector,&data);data-984;cotVector_Push(Svector1&data);/插入元素uint32-tarrdata2-125,656);cotVector-InsertN(Svectorj2,Sarrdata,2);/删除两个元素cotVector-RemoveN(Svector1.1,2);/根抠添加附除元素CotVectoreRemoveIf(&vector,OnvectorRemoveCondition);/打印数组中的数
10、据内容for(int1-;1sizeof(data);data=895;cotQueue_Push(&stack,&datasizeof(data);H访何元索int*pata=(intt)cotStack-Top(fistack);printf(,va1.Xd11m,*pata);H弹出顶部元索cotstack.Pop(Sstack);return0;(2)序列化/反序列化功能使用说明可以定义一个公共头文件:HifndefSTRUCTHtrdefineSTRUCTHIrinc1.udeseria1.ize/seria1.ize.hCOTeDEFINE_STRUCT_TYPE(test_t,(
11、UINT16_T)(Va1.I)(2)(NT32.T)(va1.2)(1)(UINT8,T)(va1.3)(D)(NT16.T)(va1.4)(1)(OOUB1.E-T)(va1.5)(D)(INT16-T)(va1.)(i)(STRING)(SzName)(i)(DOUB1.E)(va1.7)(1)(F1.OAT,T)(va1.8)(D)(STRING,!)(SzName1.)(100)Wendif/STRiKTji各个模块引用头文件使用:!(inc1.udestruct.h*intmain()(uint8-tbuf100;/序列化使用demoCOT_DEFINE_STRUCT_VARIAB1.E(test_t,test);test.va1.1.0-5;test.vai1.1=89;test.va1.2-9