软件工程第四章:软件测试2019/12/1812第四章软件测试4.1测试模型与过程4.2白盒测试4.3黑盒测试4.4集成测试4.5自动化测试4.6例题3需求规格说明概要设计详细设计编码单元测试集成测试系统测试瀑布式生命周期1.测试层次的传统观点42.软件测试模型V模型W模型H模型5V模型需求分析概要设计详细设计编码单元测试集成测试系统测试验收测试必需在编码工作结束后才能进行测试!6W模型需求测试需求分析功能测试概要设计设计测试详细设计单元测试编码系统测试验收确认测试确认集成测试集成7H模型测试准备测试执行测试流程其他流程测试就绪点8H模型与前两种模型相比,H模型充分地体现了测试过程。H模型说明:1、软件测试不仅仅指测试的执行,还包括很多其他的活动。2、软件测试是一个独立的流程,贯穿产品的整个开发周期,与其它流程并发进行。3、软件测试要尽早准备,尽早执行。9几个重要的概念缺陷管理10几个重要的概念集成测试:把已进行过单元测试的模块组装起来进行测试,目的在于检验与软件设计相关的程序结构问题。确认测试:检验所开发的软件是否满足了需求规格说明中确定了的各种功能和性能需求。系统测试:主要任务是把已经经过确认的软件纳入实际运行环境,与其他系统的成分(如支撑软件、硬件和操作人员)组合在一起进行测试。验收测试:是检验软件产品的最后一关,在这一环节,测试主要从用户的角度着手,参与者主要是用户和少数程序开发人员。11几个重要的概念回归测试:为保证软件中新的变化(如新增、修改代码)不会对原有功能的正常使用有影响而进行的测试。兼容性测试:测试系统在不同运行环境(网络、硬件、第三方软件)下的实际表现。安全性测试:测试系统在应对非授权的内部/外部访问、恶意攻击时系统的防护能力。灾难恢复性测试:在系统崩溃、硬件故障或其他灾难发生之后,重新恢复系统和数据能力的测试。12几个重要的概念可靠性测试:检验系统能否保持长期稳定、正常运行,如确定系统平均故障间隔时间(MeanTimeBetweenFailures,MTBF)。安装测试:在一个真实的或近似的用户环境中,验证系统是否能按照按照说明书成功的完成系统安装。健壮性测试:又称为容错性测试,用于测试系统在出现故障时,是否能够自动恢复或者忽略故障继续运行。恢复测试:主要检查系统的容错能力13几个重要的概念alpha测试:是由用户在开发环境下进行的测试,也可以是开发机构内部的用户在模拟实际操作环境下进行的测试。开发者坐在用户旁边,这是在开发者受控的环境下进行的测试。由开发者随时记录下错误情况和使用中的问题。beta测试:是由软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,这是在开发者无法控制的环境下进行的测试。由用户记录下遇到的所有问题,定期向开发者报告。14几个重要的概念性能测试:是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试:模拟实际软件系统所承受的负载条件的系统负荷,通过不断加载(如逐渐增加模拟用户的数量)或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(如CPU、内存)等,以检验系统的行为和特性,以发现系统可能存在的性能瓶颈、内存泄漏等问题。15几个重要的概念压力测试:在强负载(大数据量、大量并发用户等)下的测试,查看应用系统在峰值使用情况下操作行为,从而有效地发现系统的某项功能隐患、系统是否具有良好的容错能力和可恢复能力。压力测试分为高负载下的长时间(如24小时以上)的稳定性压力测试和极限负载情况下导致系统崩溃的破坏性压力测试。总结:1)性能测试、负载测试、压力测试采用的方法类似2)负载测试、压力测试都属于性能测试3)压力测试可以被看作是负载测试的一种,即高负载下的负载测试161.覆盖评测覆盖指标提供了“测试的完全程度如何?”这一问题的答案。最常用的覆盖评测是基于需求的测试覆盖和基于代码的测试覆盖。测试评估172.质量评测在测试过程中,已发现缺陷的评估提供了最佳的软件质量指标。3.性能评测评估测试对象的性能时,侧重于获取与行为相关的数据,如响应时间、事务处理数、内存占用率、操作可靠性等。测试评估18第四章软件测试4.1测试模型与过程4.2白盒测试4.3黑盒测试4.4集成测试4.5自动化测试4.6例题19白盒测试白盒测试(WhiteBoxTesting)白盒测试又叫结构测试,逻辑驱动测试或基于程序本身的测试。20白盒测试测试用例被测程序源程序分析覆盖情况分析执行路径21例:含4个分支,循环次数≤20,计算从A到B的可能路径。彻底的白盒测试AB22逻辑覆盖语句覆盖判定覆盖(分支覆盖)条件覆盖判定-条件覆盖条件组合覆盖路径覆盖23例子程序:if((a1)&&(b==0))x=x/a;if((a==2)||(x1))x=x+1;24程序流程图(A1)AND(B=0)(A=2)OR(X1)aX=X/AX=X+1eFFTTbdc251.语句覆盖设计若干条测试用例,使程序中每条可执行语句至少执行一次。用例ABX执行路径Case1203aceCase2213abe√×语句覆盖26Case1:A=2,B=0,X=3(A1)AND(B=0)(A=2)OR(X1)aX=X/AX=X+1eFFTTbdc语句覆盖27Case2:A=2,B=1,X=3(A1)AND(B=0)(A=2)OR(X1)aX=X/AX=X+1eFFTTbdc此语句未覆盖语句覆盖28Case1:A=2,B=0,X=3(A1)AND(B=0)(A=2)OR(X1)aX=X/AX=X+1eFFTTbdc错写成OR错写成AND语句覆盖是最弱的覆盖语句覆盖292.判定覆盖(分支覆盖)设计测试用例,使程序中的每个逻辑判断的取真和取假的分支至少经历一次。用例ABX执行路径Case1203aceCase3101abd30第一组:Case1:A=2,B=0,X=3(A1)AND(B=0)(A=2)OR(X1)aX=X/AX=X+1eFFTTbdc判定覆盖31第二组:Case3:A=1,B=0,X=1(A1)AND(B=0)(A=2)OR(X1)aX=X/AX=X+1eFFTTbdc判定覆盖32只作到判定覆盖将无法确定判定内部条件的错误。(A1)AND(B=0)(A=2)OR(X1)aX=X/AX=X+1eFFTTbdc错写成X1判定覆盖Case4:A=3,B=0,X=3Case5:A=2,B=1,X=1因此判定覆盖仍是弱的覆盖标准。a(A1)AND(B=0)(A=2)OR(X1)X=X/AX=X+1eFFTTbdc错写成X1例:34说明:以上仅考虑了两出口的判断,我们还应把判定覆盖准则扩充到多出口判断(如Case语句)的情况。因此,判定覆盖更为广泛的含义应该是使得每一个判定获得每一种可能的结果至少一次。16352789410判定覆盖353.条件覆盖设计若干测试用例,使程序的每个判定中的每个条件的可能取值至少满足一次上例中设条件:A1T1F1B=0T2F2A=2T3F3X1T4F4取真表为取假表为36满足条件覆盖的一组测试用例ABX路径覆盖分支覆盖条件Case6211abebeT1F2T3F4Case7103abebeF1T2F3T43.条件覆盖条件覆盖Case6:A=2,B=1,X=1Case7:A=1,B=0,X=3(A1)AND(B=0)(A=2)OR(X1)aX=X/AX=X+1eFFTTbdc两个测试用例覆盖了四个条件八种可能取值。但未覆盖c、d分支,不满足判定覆盖的要求。条件覆盖384.判定-条件覆盖使判定中每个条件的可能取值至少满足一次,并且使每个判定分支至少执行一次。判定-条件覆盖能同时满足判定、条件两种覆盖标准。39满足判定-条件覆盖的一组测试用例ABX路径覆盖分支覆盖条件Case1203aceceT1T2T3T4Case8111abdbdF1F2F3F4405.条件组合覆盖设计用例,使得每个判断表达式中条件的各种可能组合都至少出现一次;41上例中需考虑4个条件的8种组合①A1,B=0T1T2判定一为真②A1,B≠0T1F2③A≤1,B=0F1T2判定一为假④A≤1,B≠0F1F2⑤A=2,X1T3T4⑥A=2,X≤1T3F4判定二为真⑦A≠2,X>1F3T4⑧A≠2,X≤1F3F4判定二为假42满足条件组合覆盖的一组测试用例ABX路径覆盖组号覆盖条件Case1203ace①⑤T1T2T3T4Case8211abe②⑥T1F2T3F4Case9103abe③⑦F1T2F3T4Case10111abd④⑧F1F2F3F4436.路径覆盖设计足够多的测试用例,覆盖程序中的每条可能路径。上述满足条件组合覆盖的测试用例不能覆盖路径acd。44满足路径覆盖的一组测试用例用例ABX执行路径Case1203aceCase7101abdCase8211abeCase11301acd45小结语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖46路径覆盖的例子不同路径数高达520条。假定:每一条路径进行测试需要1毫秒,一天工作24小时,一年工作365天,需要3170年。47基本路径测试法通过分析程序控制流图的环路的复杂性,导出基本路径集合,从而设计测试用例,保证这些路径至少通过一次。48控制流图控制流图是退化的程序流程图,图中每个处理都退化成一个结点,流线变成连接不同结点的有向弧。控制流图将程序流程图中结构化构件改用一般有向图的形式表示。49控制流图在控制流图中用圆“○”表示节点,一个圆代表一条或多条语句。控制流图中的基本元素:节点边50基本控制流图顺序结构IF选择结构While循环结构Until循环结构Case多分支结构51复合逻辑下的控制流图aorbx++x--(a)(b)(c)ax++x++x--b52圈复杂度圈复杂度:是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目。独立路径必须包含一条在定义之前不曾用到的边。(每一条新的路径都包含了一条新边)53程序图的圈复杂度计算方法(三种):V(G)=e–n+2;e:边数,n:节点数V(G)=P+1;P是图G中判定节点的数量程序图中区域的数量对应于环路的复杂性;圈复杂度(续)54圈复杂度举例3EDBACFG9187654210R1R5R4R3R255圈复杂度计算举例计算环路复杂度示意图23578964路径1路径2路径3(1)(2)(3)(4)(5)(6)(8)(9)路径1:26路径2:2346路径3:2357926路径4:2358926节点数量:N=8导出边数量:E=10对应上面图中的圈复杂度,计算如下:流图中有四个区域;V(G)=10条边-8结点+2=4;V(G)=3个判定结点+1=4。路径456图形矩阵导出控制流图和决定基本测试路径的过程均需要机械化,为了开发辅助基本路径测试的软件工具,称为图形矩阵(graphmatrix)的数据结构很有用。57图形矩阵定义:有m个节点的控制流图矩阵,是一个m×m矩阵:A=(a(i,j)),其中a(i,j)是1,当且仅当从节点i到节点j有一条弧,否则该元素为0。58例:123456710100000200100013000110040000010500000106010000070000000635421759基本路径测试步骤:1.导出程序的控制流图;2.计算控制流图的环路复杂度V(G);3.确定只包含独立路径的基本路径集;4.设计测试用例;基本路径测试法60白盒测试工具Java语言:Junit,C++:CppUnit、VisualUnit等内存资源泄漏检查:Rational的Purify等;代码覆盖率检查:Rational的Purecoverage,Telelogic公司的logi