©IPL1999IPL单元测试计划与实施单元测试计划与实施CopyrightIPLInformationProcessingLimitedEveleighHouseGroveStreetBathBA15LRTel.+44(0)1225475000Fax+44(0)1225444400第一部分©IPL1999IPL单元测试计划与实施初步介绍主题范围一些基本概念©IPL1999IPL单元测试计划与实施主题基本定义单元测试方法设置测试目标•动态分析功能/黑盒技术结构/白盒技术开发测试说明书©IPL1999IPL单元测试计划与实施范围3GL开发的单元测试适合所有集成水平的软件适合任何领域的应用软件不特指哪一个工具©IPL1999IPL单元测试计划与实施一些基本概念:软件测试的定义Hetzel(1973):“测试是对软件或系统是否完成应有的功能建立信心的过程Myers(1979):“测试运行程序和系统来找错的过程IEEE(1983):“测试是手工或自动方式执行或评估一个系统来验证是否符合需求或者检验期望结果和实际结果之间的差异Hetzel(1983):“测试是把评估程序或系统的属性或能力的任何活动”;“测试是对软件质量的衡量©IPL1999IPL单元测试计划与实施正向测试和逆向测试综合以上所有的定义:•“软件的行为是否符合需求?关键的是需求•正向测试–Doesitdoeverythingitisspecifiedtodo?•逆向测试–Doesitdoanythingitisnotspecifiedtodo?有力的测试要做这两种测试!©IPL1999IPL单元测试计划与实施黑盒测试和白盒测试黑盒(功能)技术•用单元的接口和功能描述•无需知道单元内部如何建立白盒(结构)技术•使用单元内部工作的信息,包括分支,路径©IPL1999IPL单元测试计划与实施什么是单元测试?什么是单元?•软件说明书中提供的最小组件:–函数–子程序–过程–类–包–4GL菜单和显示测试这些组件(单元)•最底层的正式测试©IPL1999IPL单元测试计划与实施测试和调试调试是:•当软件出问题时,分析并且定位故障的过程调试支持测试•但是不能替代测试–测试找到错误–找到错误出在哪里为什么出现©IPL1999IPL单元测试计划与实施从需求规范书开始如果没有需求规范,测试就失去了意义•更好的测试需要更好的需求规范•更好的需求规范驱动更好的测试No需求规范=No定义=No期待=No真正的测试!©IPL1999IPL单元测试计划与实施属性怎么知道测试通过了?•比较真实/期望输出•确定性的测试:–期望的输出可以准确预测–输出结果在重复的时候不会变化当环境或者软件改变时:•测试必须维护和重复当测试出现不足时:•测试必须维护确定性和可重复性可维护性的前提©IPL1999IPL单元测试计划与实施桩和驱动测试驱动•为了测试软件去运行软件•提供一个框架:–设置输入–运行软件–检查输出桩•是单元的一个模仿品•代替真实的单元推动测试©IPL1999IPL单元测试计划与实施单元测试的三种通用方法:•Topdown自顶向下•Bottomup自底向上•Isolation隔离单元测试方法©IPL1999IPL单元测试计划与实施自顶向下单元测试:•使用上层的调用者•下层函数用桩代替©IPL1999IPL单元测试计划与实施自顶向下测试ABCDHIJEFG最上层的函数最先测试测试由桩来控制•未测试到的单元由桩来模拟StubStubStub•测试驱动不需要Tested桩由测试过的单元取代TestedTested•更低层的单元打桩StubStubStubTested©IPL1999IPL单元测试计划与实施自顶向下测试ABCDHIJEFG最上层的函数最先测试测试由桩来控制•未测试到的单元由桩来模拟StubStubStub•测试驱动不需要Tested桩由测试过的单元取代TestedTested•更低层的单元打桩StubStubStubTested这个过程一直重复直到最底层的单元被测试StubStubStubTestedTestedTestedTestedTestedTested©IPL1999IPL单元测试计划与实施ATopDownTestPlan1TestA;stubB,C,D2TestB;callBfromA;stubC,D3TestC;callCfromA;useB;stubD4TestD;callDfromA;useB,C;stubE,F,G5TestE;callEfromD,callDfromA;useB,C;stubF,G,H,I,J6TestF;callFfromD,callDfromA;useB,C,E;stubG,H,I,J7TestG;callGfromD,callDfromA;useB,C,E,F;stubH,I,J8TestH;callHfromE;callEfromD,callDfromA;useB,C,E,F,G;stubI,J9TestI;callIfromE,callEfromD,callDfromA;useB,C,E,F,G,H;stubJ10TestJ;callJfromE,callEfromD,callDfromA;useB,C,E,F,G,H,I©IPL1999IPL单元测试计划与实施自顶向下优点提供尽早的集成‘看得见的’功能•在软件集成阶段之前•真正的单元测试和软件集成的结合详细设计也是topdown•按照单元设计的顺序•单元可以在设计的时候开始编程和测试©IPL1999IPL单元测试计划与实施自顶向下缺点测试数据分散在许多桩模块中•需要了解单元的结构方面的知识•测试很难理解和维护随着模块的层次下降•测试越来越困难–特别是当单元被多个单元调用时去过•提高覆盖率越来越困难–测试难于特别彻底–很难测试错误处理代码–难于区分多余的和未测试到的功能©IPL1999IPL单元测试计划与实施自顶向下缺点由于层次的关系导致测试计划“longandthin”©IPL1999IPL单元测试计划与实施变更的巨大影响改变一个单元影响同级和下层单元•变更后重复测开销太大•整个生命周期高维护费©IPL1999IPL单元测试计划与实施变更的巨大影响ABCDHIJEFGTestedTestedTestedTestedTestedTestedTestedTestedTestedTested考虑修改D•单元测试D–不得不改变–不得不重复•单元测试E,F,G,H,I和J(使用D)–不得不重复–可能要改变(即使E,F,G,H,I和J没有变化)©IPL1999IPL单元测试计划与实施自顶向下的结论J及早集成软件功能J可能和详细设计吻合J无需测试驱动L太多的桩L需要结构化设计L有时很复杂L达到覆盖率困难L维护困难,开销大L测试计划“长”且“瘦”自顶向下开发和维护都很难©IPL1999IPL单元测试计划与实施自底向上测试单元测试:•和上级调用模块隔离•使用下级调用到的模块©IPL1999IPL单元测试计划与实施自底向上测试ABCDHIJEFG最底层的单元先得到测试TestedTestedTested测试由驱动程序控制•已测试过的单元加入测试•不需要打桩然后单元的父单元再得到测试•使用其它以前测试过的单元TestedTestedTestedDriver©IPL1999IPL单元测试计划与实施自底向上测试ABCDHIJEFG最底层的单元先得到测试TestedTestedTested测试由驱动程序控制•已测试过的单元加入测试•不需要打桩然后单元的父单元再得到测试•使用其它以前测试过的单元TestedTestedTested这个过程一直重复直到顶层全部模块测试完TestedTestedTestedTested©IPL1999IPL单元测试计划与实施1TestH;testdriverforH;TestI;testdriverforI;TestJ;testdriverforJ;TestF;testdriverforF;TestG;testdriverforG;TestB;testdriverforB;TestC;testdriverforC;2TestE;testdriverforE;useH,I,J3TestD;testdriverforD;useE,F,G,H,I,J4TestA;useB,C,D,E,F,G,H,I,JABottomUpTestPlanTestsmaybeexecutedinparallel©IPL1999IPL单元测试计划与实施自底向上测试优点提供单元的及早集成•在软件集成阶段之前•实际上是单元测试和软件集成策略的组合测试由驱动程序控制•不需要打桩测试用例可以设计:•从功能描述说明•不需要结构方面的信息–和测试的目标很容易吻合©IPL1999IPL单元测试计划与实施变更的巨大影响改变一个单元影响调用它的模块和更上层的模块•重复测试的代价很大•维护的代价太大©IPL1999IPL单元测试计划与实施变更的巨大影响ABCDHIJEFGTestedTestedTestedTestedTestedTestedTestedTestedTestedTested考虑H改变•单元测试H–不得不改变–不得不重复•单元测试A,DandE(使用H)–不得不重复–不得不改变(即使A,DandE没有变化)©IPL1999IPL单元测试计划与实施自底向上测试缺点第一个测试的单元是最后设计的单元•单元测试很难和详细设计交迭当层次上升•测试变得困难•达到覆盖率变得困难–测试很难彻底–很难测试错误情况–很难区分多余和没测试的功能©IPL1999IPL单元测试计划与实施自底向上测试由于层次的关系导致测试计划“longandthin”©IPL1999IPL单元测试计划与实施自底向上的结论J及早集成可见功能J不需要打桩J测试可以依据功能说明BottomuptestsareexpensivetomaintainL需要驱动程序L不能和详细设计交迭L变得很复杂L覆盖很难L维护难代价高L测试计划“瘦”而“长”©IPL1999IPL单元测试计划与实施隔离测试ABCDHIJEFG单元测试:•和调用者隔离•和被调用者隔离DriverStubStubStub不许要其他模块已经测试过•需要测试驱动去调用被测模块•其他单元由桩来模拟•单元可以按任何顺序测试©IPL1999IPL单元测试计划与实施隔离测试计划1TestA;stubB,C,D;TestB;testdriverforB;TestC;testdriverforC;TestD;testdriverforD;stubE,F,G;TestE;testdriverforE;stubH,I,J;TestF;testdriverforF;TestG;testdriverforG;TestH;testdriverforH;TestI;testdriverforI;TestJ;testdriverforJ;ALLtestsmaybeexecutedinparallel©IPL1999IPL单元测试计划与实施隔离测试的优点每一次测试只涉及一个单元•不依赖层级–隔离测试容易彻底–容易达到覆盖•驱动和桩更简单•单元测试之间没有依赖关系–单元可以编写出来就可以测试–测试计划可以并行,测试阶段‘短而肥'–单元被多个其他单元调用不会使复杂–变更对测试的影响小©IPL1999IPL单元测试计划与实施隔离测试的优点把单元测试和集成测试清楚的区分开来•在单元测试阶段专注于单元测试•在集成测试阶段专注于集成测试©IPL1999IPL单元测试计划与实施隔离测试的缺点没有及早集成代码需要驱动和桩•要有结构方面的信息这样的测试,需要大量的工作©IPL1999IPL单元测试计划与实施变更的影响最小单元测试之间互不依赖•变更的影响最小©IPL1999IPL单元测试计划与实施变更的影响最小ABCD