测试技术与实践-测试用例的设计测试技术与实践-测试用例的设计第3章软件测试用例的设计3.1测试用例概述3.2白盒测试用例设计方法3.3黑盒测试用例设计方法3.4测试用例的组织和跟踪测试用例概述如何以最少的人力、资源投入,在最短的时间内完成测试,发现软件系统的缺陷,保证软件的优良品质,则是软件公司探索和追求的目标。测试用例是测试工作的指导,是软件测试的必须遵守的准则,更是软件测试质量稳定的根本保障。什么是测试用例测试用例可以独立进行测试执行的最小单元测试内容的一系列情景和每个情景中必须依靠输入和输出,而对软件的正确性进行判断的测试文档,称为测试用例。测试用例就是将软件测试的行为活动,做一个科学化的组织归纳。软件测试是有组织性、步骤性和计划性的,为了能将软件测试的行为转换为可管理的、具体量化的模式,需要创建和维护测试用例为什么需要测试用例•在开始实施测试之前设计好测试用例,避免盲目测试并提高测试效率,减少测试的不完全性;•测试用例的使用令软件测试的实施重点突出、目的明确;•根据测试用例的多少和执行难度,估算测试工作量,便于测试项目的时间和资源管理与跟踪;•减少回归测试的复杂程度,在软件版本更新后只需修正少量的测试用例便可展开测试工作,降低工作强度、缩短项目周期;为什么需要测试用例(2)•功能模块的测试用例的通用化和复用化则会使软件测试易于开展,并随着测试用例的不断细化其效率也不断攀升;•根据测试用例的操作步骤和执行结果,为分析软件缺陷和程序模块质量提供依据;可以方便地书写软件测试缺陷报告;•可以根据测试用例的执行等级,实施不同级别的测试;•便于大型软件测试项目外包测试指导基础;良好测试用例的特征•可以最大程度地找出软件隐藏的缺陷•可以最高效率的找出软件缺陷•可以最大程度地满足测试覆盖要求•既不过分复杂、也不能过分简单•使软件缺陷的表现可以清楚的判定–测试用例包含期望的正确的结果–待查的输出结果或文件必须尽量简单明了•不包含重复的测试用例•测试用例内容清晰、格式一致、分类组织测试用例的组成元素与范例•测试用例编号ID•测试用例标题•测试的模块•测试输入条件•期望的输出结果•其它说明ID类型标题测试步骤期望的结果说明001登录输入正确密码用户在登录界面输入正确的密码后,按回车键程序提示登录成功002登录输入错误密码用户在登录界面输入错误的密码后,按回车键程序提示输入密码错误,请重新输入003登录不输入的空密码用户在登录界面没有输入任何密码使密码为空后,按回车键程序提示用户没有输入密码,请输入程序应该告知用户没有输入密码,而不是密码错误测试用例设计的基本原则•尽量避免含糊的测试用例•尽量将具有相类似功能的测试用例抽象并归类•尽量避免冗长和复杂的测试用例白盒测试用例设计方法•白盒测试用例的设计方法–逻辑覆盖:以程序的内部逻辑结构为基础,分为语句覆盖、判定覆盖、判定-条件覆盖、条件组合覆盖等–基本路径测试:在程序控制流程的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。白盒测试用例注意事项由于测试路径可能非常多,由于时间和资源问题,选出足够多的路径测试由于深入到程序编码,通常开发人员协助测试人员书写白盒测试用例基本路径测试Goal:exerciseeachindependentpathatleastonce.1.Usingthecode,drawacorrespondingflowgraph(Firstdrawingtheactivitydiagramforthecodemayhelp,butisnotrequired)2.Determinethecyclomaticcomplexityoftheflowgraph.3.Determineabasissetoflinearlyindependentpaths.4.Preparetestcasesthatforcetheexecutionofeachpathinthebasisset.流程图复杂度确定V(G)=numberofregions(areasboundedbynodesandedges—areaoutsidethegraphisalsoaregion)V(G)=numberofedges-thenumberofnodes+2V(G)=numberof(simple)predicatenodes+1Cyclomaticcomplexity:aquantitativemeasureofthelogicalcomplexityofcode,providesanupperboundonthenumberofpathsthatneedtobetestedinthecodeV(G)modulesmodulesinthisrangearemoreerrorproneHigherCycloramicComplexity,morepossibilityinerror确定线性独立的路径集合•Independentpath®anypaththatintroducesatleastonenewsetofprocessingstatementsoranewcondition•Basisset®setofindependentpathsthroughthecode•Testcasesderivedfromabasissetareguaranteedtoexecuteeverystatementatleastonetimeduringtesting•BasissetisnotuniquePath1:1-2-3-6-7-9-10-1-11BasispathtestexamplePath2:1-2-3-6-8-9-10-1-11Path3:1-2-3-4-5-10-1-11Path4:1-111910112458736测试用例覆盖集合中每条路径Basispathtestingdoesnottestallpossiblecombinationsofallpathsthroughthecode;itjusttestseverypathatleastonce.•youdonotneedanactivitydiagram,butthepicturewillhelpwhenyoutracecomponentpaths•counteachlogicaltest—compoundtestscountasthenumberofBooleanoperators+1(i.e.,counteachsimplepredicate)•basispathtestingshouldbeappliedtoallcomponents,ifpossible,andtocriticalcomponentsalways条件测试Goal:furtherexercisesthetrueandfalsevalueofeachsimplelogicalconditioninacomponent.LogicalconditionsSimplecondition:(arel-opb)whererel-op={,≤,=,≠,≥,}(maybenegatedwithNOT),e.g.,a≤b;NOT(a≤b)Compoundcondition:twoormoresimpleconditionsconnectedwithAND,OR,e.g.,(ab)AND(cd)Relationalexpression:(E1rel-opE2)whereE1andE2arearithmeticexpressions,e.g.,((a*b+c)(a+b+c))errorstotestforinclude(incorrect/missing/extra):Booleanoperator–relationaloperatorBooleanvariable–arithmeticexpressionBooleanparenthesis条件测试(2)DomaintestingforanexpressionE1rel-opE2,testforE1≧≦=≠E2guaranteesdetectionofrel-operrorifE1andE2arecorrecttodetecterrorsinE1/E2,thedifferencebetweenE1andE2forthetestsE1orthanE2shouldbeassmallaspossibleforanexpressionwithnvariables,2ntestsarerequiredBranchtestingforacompoundconditionC,testtrueandfalsebranchesofCandeverysimpleconditionofCe.g.,forC=(ab)AND(cd)test:abTRUE,FALSEcdTRUE,FALSECTRUE,FALSETrueANDTrueT.AndF.,F.AndT.,F.AndF.条件测试-ExampleBut(i=result=0):maxintNiNresult=maxint-11truefalse10falsetruegivesconditioncoverageforallconditionsButitdoesnotpreservedecisioncoveragealwaystakecarethatconditioncoveragepreservesdecisioncoverage:decision/conditioncoveragei:=i+1;result:=result+i;(iN)and(result=maxint)result=maxintN0N:=-N;output(result);output(toolarge);exitstartyesnonoyesyesno分支测试BranchCoverageExecutetheenoughtestcases,attemptingtocoverallthepathsinthesoftware:-Getboth“True”and“False”-Gothrougheachbranch。ForexampleIFbTHENs1ELSEs2CASExOF1:….2:….3:….分支测试-example1PROGRAMsom(maxint,N:INT)2INTresult:=0;i:=0;3IFN04THENN:=-N;5WHILE(iN)AND(result=maxint)6DOi:=i+1;7result:=result+i;8OD;9IFresult=maxint10THENOUTPUT(result)11ELSEOUTPUT(“toolarge”)12END.分支测试-continuedi:=i+1;result:=result+i;(iN)and(result=maxint)result=maxintN0N:=-N;output(result);output(toolarge);exitstartyesnonoyesyesnoN0Testsforcompletestatementcoverage:maxintN10-10-1isnotsufficientforbranchcoverage;Take:maxintN1030-1forcompletebranchcoverage(N=0)result=0i=0Goal:executeloopsattheirboundariesandwithintheirbounds.循环测试-11.SimpleLoops(niterations)•skiptheloopentirely•onlyonepassthroughtheloop•twopassesthroughtheloop•mpassesthroughtheloopwheremn•n-