您好,欢迎访问三七文档
§5.7面向对象的软件测试OO的系统与使用功能模型开发的系统之间的差别:•对象作为一个单独的组件一般要比一个功能模块大•由对象到子系统的集成通常是松散耦合的,系统中没有一个明显的“顶层”•如果对象被复用,测试者就无法进入组件内部分析其代码测试策略和测试战术的改变•白盒测试方法需要扩展到更大粒度的对象上•集成测试采用黑盒测试面向对象系统的测试可分为四个层次•测试与对象关联的单个操作•测试单个对象类•测试对象集群•测试面向对象系统5.7.1对象类的测试用白盒的覆盖测试方法保证所有程序中的语句至少执行一遍,所有的程序路径都要执行到。对象的完全覆盖测试应包括:•对象中所有操作被单独隔离测试•对象所有属性的设置和访问的测试•对象的所有可能状态的测试。所有能引起状态改变的事件都要模拟到。相当于传统的单元测试,单元概念的变化—封装的类或对象作为最小的可测试单位测试单个类的方法(1)随机测试例:银行系统的account(帐户)类有下列操作:•open(打开)•setup(建立)•deposit(存款)•withdraw(取款)•balance(余额)•summarize(清单)•creditLimit(透支限额)•close(关闭)系统对操作的限制:•必须在应用其它操作之前先打开帐户,在完成了全部操作之后才能关闭帐户;•……在限制下还是存在操作的许多排列一个account类实例的最小行为历史包括下列操作:open.setup.deposit.withdraw.closeaccount类的最小测试序列大量的其它行为可能在下面序列中发生:open.setup.deposit.[deposit|withdraw|balance|summarize|creditLimit]n.withdraw.close一系列不同的操作序列可以随机地产生,例如:测试用例r1:open.setup.deposit.deposit.balance.summarize.creditLimit.withdraw.close测试用例r2:open.setup.deposit.withdraw.deposit.balance.creditLimit.withdraw.close这些和其它的随机顺序测试被进行,以测试不同的类实例的生存历史.测试单个类的方法(2)划分测试(partitiontesting)与测试传统软件时采用的等价类划分方法类似.划分类别的方法:•基于状态的划分•基于属性的划分•基于功能的划分基于状态的划分根据类操作改变类状态的能力来划分类操作.例:银行系统的account(帐户)类状态操作包括:deposit(存款)withdraw(取款)非状态操作包括:balance(余额)summarize(清单)creditLimit(透支限额)测试用例p1(测试改变状态的操作):open.setup.deposit.deposit..withdraw.close测试用例p2(测试不改变状态的操作,在最小测试序列中的操作除外):open.setup.deposit.summarize.creditLimit.withdraw.close基于属性的划分根据类操作使用的属性来划分类操作.例:account类可根据balance属性来把操作定义划分为三个类别:•使用balance的操作•修改balance的操作•不使用也不修改balance的操作为上述每个类别设计测试序列基于功能的划分根据类操作所完成的功能来划分类操作.例:account类中的操作按功能可划分为四个类别:•初始化操作(open,setup)•计算操作(deposit,withdraw)•查询操作(balance,summarize,creditLimit)•终止操作(close)为上述每个类别设计测试序列setupacctaccount类的状态转换图emptyacctdeadacctsetupAaccentbalancecreditacctInfoclosedeposit(initial)depositwithdrawworkingacctopenwithdrawal(final)nonworkingacct测试单个类的方法(3)基于状态的测试测试单个类的方法(4)基于故障的测试(fault_basedtesting)与测试传统软件时采用的错误推测法类似.5.7.2对象的集成测试OO软件没有层次的控制结构,传统的自顶向下和自底向上的集成策略没有意义.OO软件的两种集成策略:•基于使用的测试(用例或基于场景的测试)•基于线程的测试(thread-basedtesting)集成响应系统的一个输入或事件所需的一组类,每个线程被个体地集成和测试,通过回归测试保证没有副作用产生;•对象交互测试ATMBank银行系统的类协作图ATMUserInterfaceAccountCashierverifyAcctverifyPINverifyPolicywithdrawReqdepositReqacctInfoReqcardInsertedpassworddepositwithdrawaccentStatusterminatevalidPINvalidAcctcreditLimitaccentTypebalancewithdrawdepositcloseValidationInfoverifyStatusdepositStatusdispenseCaseprintAccentStatreadCardInfogetCaseAmntopenAcctinitialDepositauthorizeCarddeuthorizecloseAcctOO集成测试方法(1)多个类测试Kirani,S.andW.T.Tsai,在“SpecificationandVerificationofObject-OrientedPrograms”中建议了下面的步骤序列以生成多个类随机测试用例:1.对每个客户类,使用类操作列表来生成一系列随机测试序列,这些操作发送消息给服务器类;2.对生成的每个消息,确定在服务器对象中的协作者类和对应的操作;3.对服务器对象中的每个操作(已经被来自客户对象的消息调用),确定传递的消息;4.对每个消息,确定下一层被调用的操作,并把这些操作结合进测试序列中.ATMBank银行系统的类协作图ATMUserInterfaceAccountCashierverifyAcctverifyPINverifyPolicywithdrawReqdepositReqacctInfoReqvalidPINvalidAcctcreditLimitaccentTypebalancewithdrawdepositcloseopenAcctinitialDepositauthorizeCarddeuthorizecloseAcctValidationInfoverifyStatusdepositStatusdispenseCaseprintAccentStatreadCardInfogetCaseAmntcardInsertedpassworddepositwithdrawaccentStatusterminate银行系统中Bank类和ATM类的操作序列:verifyAcct•verifyPIN•[[verifyPolicy•withdrawReq]|depositReq|acctInfoReq]n对Bank类的随机测试用例可能是:测试用例r3:verifyAcct•verifyPIN•depositReq为了考虑测试中涉及的协作者,需要考虑与测试用例r3中每个操作相关联的消息:Bank必须和ValidationInfo协作以执行depositReq、verifyAcct和verifyPINBank还必须和Account协作以执行deposit因此,测试这些协作的新的测试用例是:测试用例r4:verifyAcctBank•[validAcctValidationInfo]•verifyPINBank•[validPINValidationInfo]•depositReq•[depositAccount]OO集成测试方法(2)从动态模型导出测试用例设计的测试用例应达到完全的状态覆盖,即操作序列应导致account类的变迁穿越所有允许的状态:测试用例s1:open•setupAccent•deposit(initial)•withdraw(final)•close(最小测试序列)向最小序列中加入附加的测试序列,例如:测试用例s2:open•setupAccent•deposit(initial)•deposit•balance•credit•withdraw(final)•close测试用例s3:open•setupAccent•deposit(initial)•deposit•withdraw•accntInfo•withdraw(final)•close……导出更多的测试用例以保证该类的所有行为都被适当地测试5.7.3OO系统的确认测试在确认和系统测试层次,类连接的细节消失.•和传统的确认测试一样,OO软件的确认关注用户可见的动作和用户可识别的系统输出.•为辅助确认测试的导出,应利用分析模型中的用例图提供的场景来提高交互需求中发现错误的可能性§5.8自动测试和测试工具自动化和工具的好处•速度•效率•准确度和精确度•坚持不懈5.8.1测试工具•静态分析工具•动态测试工具•测试数据自动生成工具•集成化测试环境•非侵入式工具•侵入式工具测试工作台(下游CASE工具)源代码被测试的程序测试数据规约预测器测试管理器测试预估模拟器文件比较器报告生成器动态分析器测试结果测试结果报告执行报告测试数据生成器查看器和监视器1#计算机软件正在测试2#计算机软件正在测试3#计算机查看测试工具通信线路监听线路通信分析器可以查看两个系统之间传输的原始数据(非侵入)(输入测试用例)(确认产生的通信数据)(检查相应结果)驱动程序普通系统配置测试驱动配置(在此计算机上编写简单的程序自动产生相应的击键和鼠标移动来测试软件)键盘电缆鼠标电缆一台计算机可以作为驱动程序测试工具取代被测试系统的键盘和鼠标从外部计算机发送击键鼠标的移动信息,被测试软件不被侵入,如果测试软件时在同一系统中执行驱动程序,它就会侵入系统,这种测试情况可能无法接受管道和仿真器普通系统配置测试存根配置一台计算机可以充当管道,代替打印机,能够对测试输出进行更有效的分析运行管道软件来代替打印机,对打印数据进行阅读和解释其它工具类型:•施压工具和增负工具•干扰发生器和噪声发生器•分析工具测试工具产品实例•JUnit:Java单元测试工具•CppUnit:C++单元测试工具•Dunit:Delphi的终极测试工具5.8.2测试测试自动化另一类软件测试工具,可以自动执行测试用例、查找软件缺陷、分析并记录测试结果。随机测试:猴子测试员只要不停电,偶尔能够得到香蕉,猴子就会永远测试下去一个想法:“如果让一百万只猴子在一百万只键盘上敲一百万年,它们最终就可能写出莎士比亚话剧等巨著”.猴子的进步笨猴子:一点也不懂测试软件,只是随机地单击或按键,直至发生两件事情之一:完成循环或系统崩溃.不太笨的猴子:具有崩溃辨认能力,能够重新启动系统开始测试聪明猴子:能够从它的笨兄弟那里获得随机测试的结果,增加了对环境的认知能力,有目的地敲键盘,不仅限于查找崩溃缺陷,同时查看数据,检查操作结果,找出与预期结果的差别自动化测试工具实例美国国际软件自动化(ISA)公司的PanoramaforC/C++,j、Java和VB产品,自动化功能包括:•软件结构分析与逻辑框图的自动化•软件静态分析•数据分析•复杂性分析与分析结果列表的自动化•软件质量分析•动态性能分析•软件代码分支或条件覆盖率分析•软件测试用例有效性分析与测试用例最小集的自动选取•软件界面手工操作过程的自动记录与自动再执行(Playback)§5.9测试中的可靠性分析开发过程中,利用测试的统计
本文标题:面向对象的软件测试
链接地址:https://www.777doc.com/doc-7913229 .html