版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
错误!未定义书签 错误!未定义书签 前 错误!未定义书签序 错误!未定义书签 错误!未定义书签 Project菜 Test菜 Setting菜 Help菜 ................................................................................................................................ProjectTree MainGUIPanel Output/MessagePanel SourceCode 工程模板(project’s 创建测试单元(Test 问题2:找不到头文件错误怎么处理 问题3:SourceCode属性页中的源文件不能显示汉字注释怎么办 4:ProjectSettingscompileroptionsPreprocessorflags 问题5:如果函数要求的输入参数是int类型,C++Test能否提供输入float类型或 一.C++Test概述C++Test是一个C/C++单元测试工具,自动测试任何C/C++类、函数或部件,而不需要测试代码的功能性(黑盒测试)和代码的完整性(回归测试。C++Test是一个易于使VC6.0GNU,VC7.0C++Test内嵌了业界最出名的EffectiveC++(epcc)MoreEffectiveC++(mepcc)、C++Test提供了一种有效并且高效的方法执行白盒测试。C++Test完全自动执行所有的C++Test允许你定制白盒测试用例的生成,和在什么层次上(项目、文件、类或方法)C++Test完全自动化与回归测试有关的所有步骤。C++Test首次测试某个类时,自动保二.安装说明在安装C++Test之前,一定要先安装好 VisualC++。这里的machineID就是C++Test和主机绑定的信息。这个machineID需交给parasoft,licenselicenselocallicense(单机版)netlicenseokwronglicense。输入正确的license,打开C++Test,就可以进入C++Test的用户界面了。C++Test安装完毕后,自动和VisualC++集成,在VisualLaunchC++TestGUIC++Test ) ) ysis(Project):自动导入 VisualC++当前打开的工程Stop三.界面说明启动可以从VisualC++上的LaunchC++TestGUI按钮启动C++Test,也可以直接启动C++Test.,启动后,进入C++Test界面。菜单栏:File菜NewProjectOpenProjectCloseProjectSave Save OpenFile(s)CloseFile(s))PrintReportPrintPreviewGenerateHTMLReport:生成HTMLRecentProjectExitEdit菜SearchRefresh:当代码修改后,点此菜单更新C+TestProjectProjectSettingsC++Test测试。一般包含的文件下的includeoptions进行设置。File/Class/MethodTestConfiguration。ParentValues:Valuesaredefinedonlyintheparent'scontext。StandardValues:在测试参数中预先定义的标准值。GuessingUserDefinedValues:用户自定义的特殊值。←自定义值C++Test在测试每种类型的变量(布尔/字符/整数等)时将要分配的值。你可(1)55个值(-105,0,5,10(2)在[-10,10]5个值(可能是-8,1,3,4,10Max.CountofGeneratedTestCases:对一个被测函数可能生成的最大测试用例的数量。允许任何大于0的整数。默认是50个,可以修改。MaxDepthofFieldInspection:对分层或嵌套的类可能生成的测试用例的最大我们建议你观察一下浏览窗,在你的初始测试中包括多少层次的检0的整数。Max.DynamicAllocationSize:对于一个给定的变量,当动态分配内存(该变前测试时并不需要,例如数组。允许任何大于0的整数。Use UseObjectRepository―――使用对象库中保存的自定义对象。可以组合DynamicysisModeforSymbolswithoutTestCases:Auto-GenerateTestCases:控制是否要自动生成测试用例。
TestRe-readSymbolsRebuildTest ysis ysis GenerateTestCase:生成并执试用例ClearCoverageCoverageSourceChangeToolbarShowTooltilesRuleWizardProjectTreeMainGUIPanelOutputMessagePanel快捷菜单:在SourceCodeEditSourceSearchRefreshShowCoverageTextProperties ysis在静态分析栏中的Results是对静态分析结果的一个罗列。每个红色精灵帽都代而RulesManager则是对这些规则的管理,当用户需要使用某条规则的时候,只 LaunchRuleWizard:进入规则编辑界面。ShowRuleDescription:显示规则描述。EnableAll:选中所有的规则进行检查。DisableAll:所有规则都未使用。PrintReportGenerateHTMLReport:生成HTML ysisOK(ERRTotal(TOT):总的测试用例个数。LCLineCoverage)BBCBasicBlockCoverage)PCPathCoverage)DCDecisionCoverage))CCConditionCoverage).参数(Arguments):函数的参数.参数出口条件(ArgumentsPost):函数执行完成时参数的状态.返回值(Return):.对象前置条件(PreConditionsThis):.对象后置条件(PostConditionsThis):.前置条件(PreConditionsExternals):.后置条件(PostConditionsExternals):StubTablesC++Test自动生成,也可以是由用户自己编写,还可以使用原始的库。我们可以在这里定制桩函数。Suppressions则是对测Data类有很多个成员函数,当用户并不想全部都测,而只是测其中的几个。这个时候就可以通过Suppressions进行选择。stubtypeforselectedfunction来选择桩函数的类型。PlaySelectedTestCases:运行所选的测试用例。DebugSelectedTestCases:调试所选的测试用例。Add:增加测试用例。Delete:删除测试用例。Edit:编辑测试用例。ClearResults:清除结果。Import:导出测试用例。Export:导入测试用例。TreeSettings:设置。PrintReport:打印报告。GenerateHTMLReport:生成HTMLEditUserStubSourceEditSource这栏就是在测试进行中,C++Test告诉用户进度的一个框。所有的测试都分成静态动态两部分。红X表示此次测试不进行的部分,绿勾代表此次测试进行了的部分。权衡用户可自己定义,默认的状态静态动态权重各占50%。用户也可以只关心某条曲四.操作建立测试环境打开C++Testfile/NewProjectFile/Openfile,C++Test安装下examples/cpptest_demo.cppcpp文件将出现在当前的project下C++Test将parse(剖析)这个源程序,分析出此文件的文件结构静态测试在进行静态测试之前,我们可以通过StaticysisTab下的RulesManager规则管理来码走查,走查所用到的规范可以在静态测试的rulemanage下看到。误共发生的次数以及相对应的具置。而下面的ruledesription则是对这条规则的一个比较详细的描述。顶层的文件夹后面的“I=4PV=1V=33……”描述的是整个的对信息的PV表示possibleviolation,可能的行V表示violation,行SV表示servereviolation,严重行动态测试每个测试用例或者各个节点上都做到了相应的覆盖率信息,包括了LC(语句覆盖,,PC,MCDC(生成报表ysis1,coveragestatistic1)然后就会生成一个HTML五.应用举例//calculatessumofspecifiedintget_sum(int*data,unsignedintsize)//missingcheckingif'data'existsintsum=0;for(inti=0;i<size;{sum+=}return}//calculatessumofspecifiedintget_sum(int*data,unsignedintsize)//missingcheckingif'data'existsintsum=0;if(!data{return}for(inti=0;i<size;{sum+=}return} //calculatessumofspecifiedintget_sum(int*data,unsignedintsize)//missingcheckingif'data'existsintsum=0;if(!data{return}for(inti=0;i<size;{sum+=}return}还有很多问题,例如:Iintsizeunsignedintsize很大时,I就无法跟上它同步大小,sum也可能越界。当datat[0]= ,size=1,这时候sum肯定= //helperfunctionforl2a_convert()-convertsunsignedvaluesonlyif(number>=10){string=l2a_convert_slave(string,number/}*string++=" returnstring;}//workingfunctionfor{//missing//if'buffer'isnotnull/ifit'scapableenoughif(number<0){*buffer++='-';number=-number;}*buffer='\0';return}l2a_convert函数在测试参数buffer为NULL时,*buffer++操作发生异常。应该面增加判断buffer是否为NULL的代码,排除隐患。虽然C++Test自动为被调用的函数创建了桩函数,但在实际的应用中,这样的桩函数并不实 foo1(int{int*p=………. }intfoo2(intb{int*p=foo1(b);if(p {………}}p为空的时候,if中的语句不能被执行,foo2的测试是失败的。对于这种情况,我们一般要对函数foo1(相当于桩函数)进行编辑,要么使用原始的foo1函数作为桩函数。StubTables栏是对桩函数的管理,桩函数可以是C++Test自动生成,六、高级使用技巧静态规则配置库导入/导出功静态测试时,Staticysis属性页>RulesManager>任意规则上点击右键>importconfigurations>fromfile,选中配置好的静态规则配置库即可。 ysis属性页>RulesManager>任意规则上点击右键工程模板project’sProject>ProjectSettings框中的compilerexecutables,compileroptions,linkeroptions,定制静态测试的规则等配置信息,ProjectProjectTestConfiguration的automatictestsettings中的valuegroups,types等配置信息。选择Project>Project’sTemplate,在Templates框中,可以基于当前C++Test工程选择ProjectProject’sTemplateCreateNewTemplate见上图),同时显示已经存CreateNewTemplate,填写模板名称和描述,选择编译器,保存退出File>NewProject>UseexternalC++Testprojecttemplate或者已经存在的工程模板,填写新C++Test工程名称即可获得与工程模板同样配置信息。一个外部工程模板(不在默认templates )不能自动地被导入默认的Templates的目录。需要导入外部工程模板到Templates框中即可。 定制测试用例.参数(Arguments):函数的参数.参数出口条件(ArgumentsPost):函数执行完成时参数的状态.返回值(Return):.对象前置条件(PreConditionsThis):.对象后置条件(PostConditionsThis):.前置条件(PreConditionsExternals):.后置条件(PostConditionsExternals):对象 自动测试尽可能多的分支和边界条件在市场上还是独有的,是ParaSoft自动测试用例生成技术专利的一部分,能够有效地提高测试覆盖性。C++Test的这种要表现在几个方面:...【例】发现条件中的整型边界条件#defineSIZEintuser_input_handler(int{intresult=if(i>SIZE)result=-elseif(i<33)result=1;returnresult;}C++TestSIZE(SIZE88)和第二个条件中33,并自动生成相应的测试用例。【例】发现条件中的字符型边界条件 #include<string.h>intuser_input_handler(char*user_input,char*{intresult=ifstrcmp("load",user_input0) user_input否 }elseif(strcmp("save",user_input)=={strcpy(output,}elseif(strcmp("quit",user_input)=={strcpy(output,}elseresult }return }试用例可以执行各个分支。参数为user_input和output【例】使用枚举类型生成测试用例的输入enumMode{TO,FROM};intGetStatus(Modemode){intstatus;switch{caseTO:status=0;caseFROM:status=1;status=-1;}return}【例】使用特殊字符 char*encode_char(charvalue){char*result=newchar[5];char*encoded=0;switch{caseencoded="AND";caseencoded="PRC";caseencoded="DLR";caseencoded="ASX";caseencoded="DVD";caseencoded="PWR";caseencoded="HSH";default}char*iter=//shouldchecktoseeif'encoded'isnullwhile(*encoded){*iter++=}*iter=0;}处理复杂数据类型C++Test在自动生成和用户自定义测试用例和桩时,能够处理复杂的数据类型,如类、【例】用类、枚举和自定义类型做输入/输出enumTestStatus{BeforeExecution,DuringExecution,Broken,Failed,Passed};enum{TESTS_NR=20};enum{PARAMETERS_NR=typedeffloatTestParameters[PARAMETERS_NR];classTestSuite{TestStatus_status;TestSuite():_status(BeforeExecution){}TestStatusgetStatus(){return_status;}intsetParameter(inti,floatf);friendintintTestSuite::setParameter(inti,float{if(i<PARAMETERS_NR)_testParameters[i]=return}{return-}}void{TestSuitefor(inti=0;i<TESTS_NR;{}}TestStatus{if(t._status!={return-}t._status=t._status=if(t._status!=Passed&&t._status!={t._status=Broken;return-1;}return}对于成员函数inttest(TestSuite&t),其输入参数类型是复杂数据类型(类【例】用结构、枚举和指针类型做输入/输出enumPriority{LOW,NORMAL,HIGH,CRITICAL};enumMode{TO,FROM};typedefint*//structureforclientdatastructClient{intid;char*name;char*address;//structurefordeliverydatastructDelivery{ char*name;charcategory;floatweight;Prioritypriority;//sendspecifiedvoidsend_delivery(Deliverysendalldeliveriestofromspecifiedclient|ind_all(Modemode,Clientclnt,Delivery*dlvrs,intcount){int=0;intcurrentId=-Delivery*currentDlvr=for(inti=0;i<count;i++,{switch(mode)casecurrentId=currentDlvr->recipientId;casecurrentId=currentDlvr->senderId;currentId=-1;}if(currentId==}}return}etrynal(Mode(en(evey*Client中的PayDataDelivery*项,右边有一个选项[ALLOC1],因为它们都是指针处理复杂嵌套类型【例】应用多层嵌套类classMain{//多层嵌套类classNestedClassclass{int{return}intgetY(){return_y;}int_x;intNestedInNestedClassgetN(){return_n;}intgetX(){return_x;}floatgetY(){return_y;}int_x;intenum{X,NestedClassgetN(){return_n;}NestedEnumgetE(){return_e;}NestedEnumsetE(NestedEnume){NestedEnumold=_e=e;}intgetX(){return_x;}intgetY(){return_y;NestedEnum_e;int_x;intintsum(Main&m);intsumXs(Main&{Main::NestedEnumold=m.setE(Main::X);ints=sum(m);return}intsumYs(Main&{Main::NestedEnumold=m.setE(Main::Y);ints=sum(m);returns;}intsum(Main&{if(m.getE()==Main::X)returnm.getX()+m.getN().getX()+}elseif(m.getE()==Main::Y)returnm.getY()+m.getN().getY()+}return-}自定义桩时返回复杂数据类型(系统库、第或自己的、C++Test自动生成的和完全由用户自己定义的(参考附录 isingCoveragethroughUser-DefinedStubs),对处理桩的问题提供了最大的弹性。对:【例】桩返回类型为结构指针struct{inderId;intrecipientId;char*name;charcategory;floatweight;bool//sendspecifiedDelivery*send_delivery(Delivery*dlvr回结构//sendalldeliveriesto/fromspecifiedclientind_all(Delivery*dlvrs){Delivery*currentDlvr=send_delivery(currentDlvr);return0;}所以C++Test为其自动生成桩。如果需要的话,你也可以定义自己的桩或为自动桩增加特初始化对.复杂类型的函数参数(参数.This指针(前置条件.全局对象(后置条件【例】使用用户定义构造函数初始化对象classAuto{char*_model;unsignedint_carPrice;unsignedint_mpg;double_gasPrice;//defaultconstructor//user-definedAuto(char*new_Name,intnew_price,intnew_mpg,double:_model(new_Name),_carPrice(new_price),_mpg(new_mpg),{virtual//anotherwaytoinitializeanvirtualvoidinit(char*name,intprice,intmpg,double{_model=_carPrice=_mpg=_gasPrice=}virtualchar*{return}//thecostofthecaristhesumofthepriceofthecarplusthe//dividebygasefficiencyandtimesthepriceofagallonofgasvirtualdoubletotalCost(int){//shouldmakesure_mpg!=return_carPrice+/_mpg*}//SportsinheritsfromAuto,itusesitsconstructorclassSports:publicAuto{Sports(char*new_name,intnew_price,intnew_mpg,double:Auto(new_name,new_price,new_mpg,{//mySportsisatypicalSportscarwhichhasaconstantname//whenusingtheuser-definedconstructor,"myCar"ispassedinto'new_name'classmySports:publicSports{mySports(intnew_price,intnew_mpg,double:Sports("myCar",new_price,new_mpg,{virtual//'s'usesuser-definedconstructortoinitializeobjectdoublecostOfaCar_1(Sports&s,int){}//'s'usesdefaultconstructor,anduse'init'functiontoinitializeobjectdoublecostOfaCar_2(Sports&s,int){s.init("Super",20000,26,1.5);returns.totalCost();}//byusingtheuser-definedconstructor,'getname()'willalwaysreturn"myCar"char*nameOfCar(mySports&m){return}展开测试用例,Sports&s节点,选择UseConstructors自动测试用户定义构造函数和重载函数classComplex{Complex(floatre=0,floatim=0):_re(re),_im(im){}Complexoperator+(constComplex&);Complexoperator-(constComplex&);float_re;floatComplexComplex::operator+(constComplex&{returnComplex(this->_re+c._re,this->_im+}ComplexComplex::operator-(constComplex&{returnComplex(this->_re-c._re,this->_im-} plexOperators(Complex&a,Complex&{ComplexComplexneg_a=zero-a;Complexneg_a_sum_b=neg_a-b;returna+b+neg_a_sum_b;//thisfunctionshouldalwaysreturncomplexzero}测试C++模板(template)应...在函数预先实例化的对象【例】自动测试模板应用template<classT>class{T//Bucket(T_newT):_dataT(_newT){}TgetT(){return}TaddT(T{return_dataT+}//createsaglobalTemplaobjectsmgwith<int>andthevalue10Bucket<int>smg(10);//func_1takesinaTemplaobjectinstantiatedwhenpassingintofunctionargumentintfunc_1(Bucket<int>templ){return}//func_2usestheglobalobjectsmgandreturnstheobjectitselfBucket<int>func_2(){return}//func_3usesglobalobjectsmg&returnsthevalueofitspublicdatamemberintfunc_3(){return}//func_4usesglobalobjectsmg&callsitspublicfunctiongetT()Bucket<int>func_4(){return}//func_5usesglobalobjectsmg&passinanotherTemplaobjecttotest'addT'functionBucket<int>func_5(Bucket<int>templ){return}func_5比较复杂。C++Test能够对模板对象进行自动测试,下图是func_5的一个自动测试用例。自动捕获代码异常C++Test在测试过程中能够自动捕获代码中的异常状态,如内存存取违例、下标越界、char*l2a_convert_slave(char*string,unsignedlong{//missing//if'string'isnotnull/ifit'scapable//helperfunctionforl2a_convert()-convertsunsignedvaluesonlyif(number>=10){string=l2a_convert_slave(string,number/}*string++=" "[number%10];returnstring;}//workingfunctionforchar*l2a_convert(char*buffer,long{//missing//if'buffer'isnotnull/ifit'scapableenoughif(number<0){*buffer++='-number=-}buffer=l2a_convert_slave(buffer,(unsigned*buffer='\0';return}l2a_convert函数在测试参数buffer为NULL时,*buffer++操作发生异常。应该面增加判断buffer是否为NULL的代码,排除隐患。创建测试单元(TestC++Test通过建立测试单元(CreateTestUnit)功能支持多文件测试,也可以用于函数>点击左边项目树中的测试单元名,右边结果区中的SourceCodetab变成了TestUnittab。你可以从当前打开的文件列表中加入文件,也可以打开并加入新的文件。我们加入<C++TestInstallDir>\Parasoft\C++Test\examples\MultiFileSupport下的文件,这时你就可以像函数序列测试个函数的输入。注意要包含所有必要的#include文件。#include"cstack.h"int{CharStackcs;return}int{CharStackcs;}观察测试覆盖性选择Covera
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年河南新高中创新联盟TOP二十名校高三上学期化学试题及答案
- 财务报表分析 教案 项目三 利润表分析
- 三年级数学(上)计算题专项练习附答案
- 湘版九年级音乐上册教案全集
- 二年级语文上册教学设计
- 《电气控制系统设计与装调》教案 项目六 任务一:中间继电器
- 陕西省咸阳市实验中学2024-2025学年八年级上学期第二次质量检测地理试卷(含答案)
- 发光门牌市场发展预测和趋势分析
- 微笑服务培训
- 女用阳伞产业规划专项研究报告
- 职工宿舍安全培训
- 工程项目承揽建设股权合作协议(居间协议)
- 2024年四川省绵阳市中考数学试题(无答案)
- 滤波器出厂试验报告
- 1.1公有制为主体+多种所有制经济共同发展课件-高中政治统编版必修二经济与社会
- 2024年中国空气净化节能灯市场调查研究报告
- 2023-2024学年北京市通州区九年级(上)期中物理试卷
- 期中模拟试卷-浙2024-2025学年统编版语文四年级上册
- 下肢深静脉血栓的预防和护理新进展
- 大学生国家安全教育学习通超星期末考试答案章节答案2024年
- 学术论文文献阅读与机助汉英翻译智慧树知到答案2024年重庆大学
评论
0/150
提交评论