2020年2月19日软件测试讲义1第七章回归测试2020年2月19日第七章回归测试2主要内容7.1回归测试的特点7.2回归测试的过程7.2.1重新确认测试用例7.2.2识别错误7.3回归测试的策略7.4波及效应分析7.5回归测试的花费2020年2月19日第七章回归测试3回归测试简介在软件开发、维护、升级的不断演进的过程中,由于各种各样的原因,例如功能性/非功能性需求的变更、技术更新和软/硬件平台升级,使得软件系统经常发生改变,这些改变会给软件系统带来风险,因为改变效应可能会引入新的错误,有的时候甚至是致命错误。回归测试(RegressionTesting)是对之前已测试过并修改的程序进行的重新测试,以保证该修改没有引入新的错误或者发现由于更改而引起的之前未发现的错误。回归测试能应用于所有类型的系统,包括面向对象应用、电子商务或基于Web的应用系统,它也被称为验证测试。2020年2月19日第七章回归测试4回归测试简介回归测试课程内容:什么是回归测试?。由谁来负责回归测试?为什么回归测试如此重要?回归测试的步骤是什么?由哪些工件组成?如何确保我们准确地完成了任务?2020年2月19日第七章回归测试57.1回归测试的特点1.回归测试的原因(1)为了保证软件维护时,那些未更改的代码功能不会受到影响。(2)建立各个功能区域、信息系统持续的维护与回归测试改进之间的协作关系,使回归测试成为一个每月的常规活动。(3)为了使e2e测试(端到端测试)实现整个生命周期的测试。(4)建立一个测试框架,使各信息系统和各功能区域能够监控和维持用于回归测试的人力、时间等资源投入。2020年2月19日第七章回归测试67.1回归测试的特点2.回归测试与一般测试的区别(1)测试计划的可获性:一般测试是先拿到系统规格说明书、系统规格说明书的一个实现和带有一些测试用例的测试计划,一般来说这些测试用例都是新的;而回归测试时,面临的可能是更改了的说明书、修改过的程序和一个需要更新的旧的测试计划。(2)测试范围:一般测试的目标是要检测整个程序的正确性,而回归测试目标是要检测被修改部分正确性以及它与系统原有功能的整合。2020年2月19日第七章回归测试77.1回归测试的特点2.回归测试与一般测试的区别(3)时间分配:一般测试所需时间通常是在一个产品开发之前都被预算好的,而回归测试所需时间不包含在整个产品进度表中。(4)开发信息:在一般的测试中,关于开发的知识、信息随时可以获得。而回归测试可能会在不同的地点和时间进行。(5)完成时间:回归测试完成所需时间通常比一般测试时间少,因为它只需测试程序的一部分。(6)执行频率:一般测试是发生频率很高的活动,回归测试在一个系统生命周期内要多次进行。2020年2月19日第七章回归测试87.2回归测试的过程1.回归测试的步骤(1)提出修改需求:软件可能因为要修改一个错误(Bug)而被修改,或者根据需求规格说明书或者设计说明书而被修改;(2)修改软件工件(SoftwareArtifact):为了满足新的需求或者改正错误而对软件工件进行修改;(3)选择测试用例:通过选择和有效性重确认过程获取正确的测试用例集,而不是要使测试用例数目最小化。2020年2月19日第七章回归测试97.2回归测试的过程1.回归测试的步骤(4)执行测试:通常是自动化运行的,因为会有大量的测试用例要执行。测试用例执行历史都要被记录下来,作为将来测试的参考;(5)识别失败结果:如果测试结果和预期结果不一致,则有必要检查测试用例错误还是代码错误,或者两个都有错误;(6)识别错误:精确定位哪个版本中的哪个组件以及哪些修改导致的错误。2020年2月19日第七章回归测试107.2回归测试的过程1.回归测试的步骤(7)排除错误:一旦识别了导致失败的组件,程序员必须对这一组件进行排除错误工作。当一个错误被检测到后,可以采取以下几种行动来修正错误:改正错误后,提交一个新的程序修改卡(PMC);移去引起错误的修改卡,即修改错误;忽略错误。2020年2月19日第七章回归测试117.2回归测试的过程2.重新确认测试用例测试用例的有效性重确认过程主要是靠手工操作进行,目标是识别出对于更改了的软件已经不再有效的现有测试用例。重确认测试用例需要人工检查需求规格说明书、测试策略和已存在的测试用例,所以可能很费时。对于黑盒测试,如果在功能需求和测试用例间维护一种可回溯性,那么有效性重确认的效率会高很多;对于白盒测试,因为对软件的修改会导致设计和编码的修改,所以需要生成新的测试用例,或者更改已存在的测试用例达到一定的覆盖率标准。2020年2月19日第七章回归测试127.2回归测试的过程3.识别错误组测试在识别错误时,为了确认软件中失败的组件,在列表中所有列出来的模块都有可能是要查找的目标。一组模块可能单独运行时都能正常、正确地工作,但是当它们与软件中的其他组件集成到一起时,这个组合体就可能使在单个组件测试能通过的测试用例失败。2020年2月19日第七章回归测试137.2回归测试的过程3.识别错误组测试组测试(GroupTesting):是在进行错误识别过程中,在寻找错误部件时,可以利用可获得的软件的不同版本来帮助发现错误的部分。假设一个程序有A、B、C、D、E共5个组件,在早期的测试中,每个组件都有一个可以信赖的版本。2020年2月19日第七章回归测试147.2回归测试的过程3.识别错误组测试示例AA`A`AAB`C`DEBCDEBCDEB`CDEBC`DE原版本,所有测试用例通过失败的测试用例,只有组件A是新版本失败的测试用例,只有组件B是新版本失败的测试用例,只有组件C是新版本新版本,有几个测试用例失败2020年2月19日第七章回归测试157.3回归测试的策略1.回归测试的方法回归测试的策略有两个主要方法:全部重新测试将之前所有的测试用例全部重新执行。有选择地重新测试选择和使用已存在的测试用例的一个子测试用例集。这两种方法也称为为两种“模式”。在一些情况下,选择被测系统的所有测试用例重新测试是不可行的,此时,可以使用选择性重新测试。2020年2月19日第七章回归测试167.3回归测试的策略2.两种回归测试的优缺点全部重新测试方法有选择的重新测试方法优点不需要花精力去选择要执行的测试用例,当测试用例数目不太多或者一个系统大部分被改变时,比较合适当测试用例的数目很多,而且系统更改只是一小部分,那么这种方法很有用。缺点当测试用例很多时,对于一个系统改动是很微小的,那么全部重新测试就狠浪费。需要费精力对测试用例进行选择,不适合全部测试用例数目不大,系统更改很多的情况。2020年2月19日第七章回归测试177.4波及效应分析1.波及效应分析的概念几个事实(1)软件是会被修改的。(2)与软件相关的所有东西都可能被修改。(3)修改在任何时候都可能发生,比如在软件开发阶段和软件维护阶段。修改中遇到的问题(1)需要定位改变部位。(2)改变的完全性问题。(3)改变有效性重确认问题。(4)完整性问题。(5)追踪问题。2020年2月19日第七章回归测试187.4波及效应分析1.波及效应分析的概念波及效应分析是为了实现所有受影响部分和发现潜在的受影响部分,以保证软件发生改变后仍然保持一致性与完整性。波及效应分析的四种类型:(1)需求的波及效应分析。(2)设计的波及效应分析。(3)代码的波及效应分析。(4)测试用例的波及效应分析。波及效应分析要从需求文档到设计文档,再到代码,最后到测试用例。2020年2月19日第七章回归测试197.4波及效应分析2.波及效应分析的步骤波及效应分析是一个迭代过程,具体步骤如下:(1)实施初始的改变。(2)识别潜在的受影响的组件。(3)决定这些受到潜在影响的组件中哪些需要改变。(4)决定如何进行这些改变,对于每一个改变都从第(1)步开始重复。如果没有要进行的改变就结束。2020年2月19日第七章回归测试207.4波及效应分析2.波及效应分析的步骤开始结束实施初始的改变识别哪些区域受到潜在的影响决定这些区域的哪些部分需要进一步修改以保持一致性决定如何进行修改1234对于每一个修改没有需要修改的地方2020年2月19日第七章回归测试217.4波及效应分析2.波及效应分析的步骤对于代码,主要有两个技术来识别潜在波及:(1)字符串匹配或者交叉引用。(2)程序切片。与程序切片相比,字符串匹配不需要考虑程序执行——它需要人类智慧来进行REA操作。绝大多数再工程工具都是基于字符串匹配的。程序切片方法能确认直接和间接的波及,并可以自动产生巨大的程序切片。2020年2月19日第七章回归测试227.4波及效应分析2.波及效应分析的步骤程序切片利用下面两种依赖来识别潜在的波及:(1)控制的依赖性。控制可由if-then-else、while、for和顺序语句以及面向对象程序中的消息传递所引起。(2)数据的依赖性。数据的操作主要有3个:数据的使用,数据的定义和数据空间的释放,往往只考虑数据的定义和使用。2020年2月19日第七章回归测试237.4波及效应分析2.波及效应分析的步骤直接波及和诱发波及:直接波及(DirectRipples)是那些被初始的更改影响的——它们对于更改点有直接的数据或控制依赖。诱发波及(InducedRipples)是由直接波及和其他又发波及所引起的那些波及。2020年2月19日第七章回归测试247.4波及效应分析2.波及效应分析的步骤直接波及和诱发波及初始改变12nnknn1…2k221…1k111…11k11111…n1k21211…n1kn1n11…直接波及诱发波及直接波及依赖于依赖于组件2020年2月19日第七章回归测试257.4波及效应分析2.波及效应分析的步骤直接波及和诱发波及初始改变12nnknn1…1k111…n1kn1n11…直接波及诱发波及直接波及依赖于组件…2020年2月19日第七章回归测试267.4波及效应分析3.程序切片程序切片的概念程序切片(ProgramSlicing)定义切片标准来说明所关心的切片语句开始点和一些变量。程序切片结果产生一个语句集,这些语句影响到切片标准中被定义的语句的变量值。切片分向前和向后两个方向。向后的程序切片(BackwardProgramSlicing)是指给定一个语句和一个变量集,它能产生所有语句,当程序执行到给定的语句时这些语句能影响给定语句中的变量集。向前的程序切片(ForwardProgramSlicing)是指给定一个语句和一个变量集,它能产生所有语句,当程序恢复执行给定语句时,这些语句能影响给定语句中的变量集。2020年2月19日第七章回归测试277.4波及效应分析3.程序切片程序切片示例假设一个程序源代码有5条语句(左上),可以给出表示各语句定义和使用的变量的数据流信息(右上)。图的左下角是向前的程序切片的标准及其结果,标准1,{a}表示从语句1开始,关注的变量是a;程序切片是从语句1顺着程序执行方向,切片的结果是语句集{1,3,4,5}。图的右下角是向后的程序切片标准及其结果。2020年2月19日第七章回归测试287.4波及效应分析3.程序切片程序切片示例SlicingCriterion;1,{a}Slice:1.a=1;3.c=a*a;4.d=a*b;5.e=c+d向前切片SlicingCriterion;5,{d}Slice:1.a=1;2.b=2;4.d=a*b;5.e=c+d向后切片源代码数据流信息a1b1cda3451.a=1;2.b=2;3.c=a*a;4.d=a*b;5.e=c+d2020年2月19日第七章回归测试297.4波及效应分析3.程序切片程序切片的限制程序切片方法往往生成数量很大的切片集。通用化的程序切片可以将切片数量限制在一个比较合理的范围内。在波及效应分析中比较有用的两种限制方法是进行深度限制和边界限制。深度限制是将切片中的语句限制在离更改点一个特定距离内以达到限制切片数量。边界限制是将切片限制在一个特定的模块或函数内。