第7章软件测试软件测试是在软件投入运行之前,对软件的需求分析、设计规格说明和编码的最后复审。由于软件开发的各个阶段均包含了大量的人的创造性劳动,不可避免地会引入错误,尤其是大型、复杂的软件系统。本章主要内容:软件测试的目的和原则软件测试的方法软件测试的步骤调试软件测试工具第7章软件测试软件测试的概念和意义什么是软件测试:软件测试的定义:软件测试是为了发现错误而运行程序的过程。根据软件开发各阶段的规格说明和程序内部结构精心设计一批测试用例,并利用这些用例去运行程序,以发现程序中的错误。软件测试的概念和意义软件测试在软件生命期中跨越两个阶段:1.编写每一个模块后,进行单元测试。通常模块的编写者和测试者是同一个人。2.每一个模块完成单元测试后,对软件进行各种综合测试。由专门的测试人员完成。软件测试的概念和意义目前,在软件开发过程中,将40%以上的工作量投入到软件测试之中。几个典型系统中软件测试的费用系统名称测试费用占软件开发预算的比例SAGE47%NAVALTACTICAL50%DATASYSTEMGENINI47%SATURNV44%软件测试的目的和原则软件测试的目的(G.J.Myers提出):1、软件测试是为了发现错误而运行程序的过程。2、一个好的测试用例能够发现至今尚未发现的错误。3、一个成功的测试是发现了至今尚未发现的错误的测试。软件测试的目的和原则软件测试的原则:(1)应当把“尽早地和不断地测试”作为开发者的座右铭(2)软件测试工作应该由独立的专业软件测试机构来完成(3)测试工作要全面,但不可能实现“穷举”(4)把Pareto原理应用到软件测试中(5)妥善保存一切测试过程文档(6)制定严格、合理的测试计划(7)错误经过修改后,相关的测试必不可少测试用例的要求测试用例应由输入数据和预期的输出数据两部分组成。测试用例不仅选用合理的输入数据,还要选择不合理的输入数据。长期保留测试用例。软件测试的范围软件测试的对象:软件测试不等于程序测试,在软件定义与软件开发的各个阶段所得到的各种文档资料,都是测试对象,包括需求规格说明、概要设计规格说明、详细设计规格说明、源程序等。软件测试步骤测试过程分为4个步骤:单元测试集成测试确认测试系统测试单元测试单元测试单元测试被测模块被测模块被测模块集成测试设计信息确认测试系统测试已集成的软件已确认的软件可交付的软件软件需求已测试模块其他系统元素软件测试方法静态测试(程序不执行)软件测试动态测试(程序执行)黑盒测试(测试功能)白盒测试(测试结构)静态分析器(自动工具)代码审查(人工方式)软件测试方法的分类软件测试方法静态测试静态测试指被测程序不在机器上运行,而采用人工检测和计算机辅助静态检测的手段对程序进行测试。1、人工检测:人工审查程序或评审软件。人工审查程序偏重于编码质量的检验,而人工评审软件除了审查编码还要对各阶段的软件产品进行检验。人工检测可以发现计算机不易发现的错误,据统计人工检测可发现30%~70%的逻辑设计和编码错误,从而减少系统测试的总工作量。包括”办公室“检查、会审、走查(排查)。2、计算机辅助静态检测:利用静态检测工具对程序进行测试。从程序中提取一些信息,以便检查程序逻辑的各种缺陷和可疑的程序构造。软件测试工作动态测试动态测试是通过运行程序发现错误。一般意义上的测试都是动态测试。为使测试发现尽可能多的错误,动态测试时需采用一些有效的方法。一方面通过测试检查软件每个功能的执行情况,另一方面详细测试软件的内部结构和处理过程。分别称为黑盒测试和白盒测试。软件测试工作软件测试过程中的信息:测试过程需要三类信息:1、软件配置:包括需求规格说明、软件设计规格说明、源程序等;2、测试配置:包括测试方案、测试用例、测试驱动程序等;3、测试工具:计算机辅助测试的有关工具。如测试数据自动生成工具、静态分析程序、动态分析程序、测试结果分析程序、驱动测试的测试数据库。软件测试方法软件测试信息流:测试结果分析可靠性分析排错软件配置测试配置测试结果预期结果错误出错率数据改正的软件预测的可靠性测试工具设计测试用例准备测试数据用测试数据运行程序测试结果分析测试用例测试报告预期结果测试结果软件动态测试过程白盒测试法白盒测试法是通过分析程序内部的逻辑与执行路径来设计测试用例,并对测试用例进行测试的方法,也称做结构测试或逻辑驱动方法。白盒测试法对程序的执行细节进行测试,验证程序模块的每个路径的执行情况。软件测试方法白盒测试法白盒测试是结构测试,所以被测对象基本上是源程序,以程序的内部结构为基础,设计测试用例。1、逻辑覆盖追求程序内部的逻辑覆盖程度,当程序中有循环时,覆盖每条路径是不可能的,要设计使覆盖程度较高的或覆盖有代表性的路径的测试用例。(A1)AND(B=0)(A=2)OR(X1)语句段1语句段2TFFT12345如右图:一个被测程序的流程图。软件测试方法(1)语句覆盖:为了提高发现错误的可能性,在测试时应该执行到程序中的每一个语句。语句覆盖是指设计足够的测试用例,使被测程序的每个语句至少执行一次。(A1)AND(B=0)(A=2)OR(X1)语句段1语句段2TFFT12345测试路径为1-2-4,即可保证每个语句至少执行一次。所以测试用例为:A=2、B=0、X=3。程序每个语句都能执行,语句覆盖似乎全面地检查了每个语句,但该测试用例只检查了逻辑表达式为“真”的情况,如将“AND”错写为“OR”、X1错写为X1,仍用上面的测试用例,不能发现错误。因此语句覆盖是比较弱的覆盖。软件测试方法(2)判定覆盖:判定覆盖是指设计足够的测试用例,使被测程序的每个判定表达式至少获得一次“真”和“假”值,从而使程序的每个分支至少都通过一次,所以判定覆盖又叫分支覆盖。(A1)AND(B=0)(A=2)OR(X1)语句段1语句段2TFFT12345测试路径为1-2-4,1-3-5或1-2-5,1-3-4,即可达到覆盖标准。所以测试用例为:A=3、B=0、X=1(1-2-5),A=2、B=1、X=2(1-3-4)。对于多分支的判定,判定覆盖要使得每一个判定表达式获得每一个可能的值。判定覆盖比语句覆盖严格,若通过各个分支,各个语句也执行了。但该测试仍不充分,上述数据只覆盖了全部路径的一半,如将X1错写为X1,测试不到.软件测试方法(3)条件覆盖:条件覆盖是指设计足够的测试用例,使被测程序的每个判定表达式中每个条件的各种可能的值至少出现一次。即对该程序中的四个条件A1,B=0,A=2,X1要选择足够的测试用例,使得:判定表达式1出现:A1,B=0;A≤1,B≠0判定表达式2出现:A=2,X1;A≠2,X=1达到条件覆盖标准。为满足上述要求,选择以下两组数据:A=2,B=0,X=3(满足A1,B=0,A=2,X1通过路径1-2-4)A=1,B=1,X=1(满足A≤1,B≠0,X≤1,A≠2通过路径1-3-5)(A1)AND(B=0)(A=2)OR(X1)语句段1语句段2TFFT12345软件测试方法以上两组数据不仅覆盖了判定表达式中的所有条件的可能取值,而且覆盖了所有判定的取“真”分支和取“假”分支,在这种情况下条件覆盖强于判定覆盖。但也有例外,如选择以下两组数据:A=1,B=0,X=3(满足A≤1,B=0,A≠2,X1)A=2,B=1,X=1(满足A1,B≠0,X≤1,A=2)以上两组数据覆盖了判定表达式中的所有条件的可能取值,但只覆盖了第一个判定表达式的取“假”分支和第二个判定表达式的取“真”分支,此例不满足判定覆盖。所以满足条件覆盖不一定满足判定覆盖。为了解决此问题,需要对条件和分支兼顾。(A1)AND(B=0)(A=2)OR(X1)语句段1语句段2TFFT12345软件测试方法(4)判定/条件覆盖:该覆盖标准是指设计足够的测试用例,使被测程序的每个判定表达式中每个条件的各种可能的值至少出现一次。并使每个判定表达式所有可能的结果也至少出现一次。对该例程序,可选择以下两组数据达到判定/条件覆盖标准:A=2,B=0,X=3A=1,B=1,X=1从表面上看,判定/条件覆盖测试了所有条件的取值,但实际上条件组合中的某些条件会抑制其它的条件,如“与”运算的判定表达式中,第一个条件为“假”,则这个表达式后面的几个条件均不起作用,后面的表达式中的错误也就测试不出来。(A1)AND(B=0)(A=2)OR(X1)语句段1语句段2TFFT12345软件测试方法(5)条件组合覆盖:该覆盖标准是指设计足够的测试用例,使被测程序的每个判定表达式中每个条件的各种可能的值的组合至少出现一次。条件组合覆盖是较强的覆盖标准。该例中,两个判定表达式共有4个条件,有8种组合:①A1,B=0;②A1,B≠0;③A≤1,B=0;④A≤1,B≠0;⑤A=2,X1;⑥A=2,X≤1;⑦A≠2,X1;⑧A≠2,X≤1;测试用例4组数据:A=2,B=0,X=2;覆盖条件组合①⑤,路径1-2-4A=2,B=1,X=1;覆盖条件组合②⑥,路径1-3-4A=1,B=1,X=1;覆盖条件组合④⑧,路径1-3-5A=1,B=0,X=2;覆盖条件组合③⑦,路径1-3-4显然,满足条件组合覆盖的测试,一定满足判定覆盖、条件覆盖、判定/条件覆盖,但该测试没有覆盖程序所有可能的执行路径,1-2-5路径没有覆盖。(A1)AND(B=0)(A=2)OR(X1)语句段1语句段2TFFT12345软件测试方法(6)路径覆盖:该覆盖标准是指设计足够的测试用例,覆盖被测程序中所有可能路径:该例可选择以下测试用例,覆盖程序中的4条路径:A=2,B=0,X=2;覆盖路径1-2-4,条件组合①⑤;A=2,B=1,X=1;覆盖路径1-3-4,条件组合②⑥;A=1,B=1,X=1;覆盖路径1-3-5,条件组合④⑧;A=3,B=0,X=1;覆盖路径1-2-5,条件组合①⑧;显然,该测试满足路径覆盖,但没有满足条件组合覆盖。(A1)AND(B=0)(A=2)OR(X1)语句段1语句段2TFFT12345软件测试方法发现错误能力语句覆盖每条语句至少执行一次判定覆盖每个判定的每个分支至少执行一次条件覆盖每个判定的每个条件应取到各种可能的值判定/条件覆盖同时满足判定覆盖和条件覆盖条件组合覆盖每个判定中各条件的每一种组合至少出现一次路径覆盖使程序中每一条可能的路径至少执行一次强弱六种覆盖标准的对比六种覆盖标准的对比语句覆盖发现错误能力弱;判定覆盖包含语句覆盖,但可能会使一些条件得不到测试;条件覆盖对每一条件进行单独检查,一般情况下其检错能力较判定覆盖强,但有时达不到判定覆盖的要求;判定/条件覆盖包含了判定覆盖与条件覆盖的要求,但受软件的影响,有时达不到判定覆盖的标准;条件组合覆盖发现错误能力较强;路径覆盖查错能力强。总结:在实际的逻辑覆盖测试中,一般以条件组合覆盖为主设计测试用例,然后再补充部分用例,以达到路径覆盖测试标准。软件测试方法2、基本路径测试基本路径测试是在程序图的基础上,通过分析环路复杂度,导出独立路径的基本集合,从而设计测试用例,保证这些路径至少被执行一次。基本路径测试的步骤①画出程序图以详细设计或源程序为基础,导出程序流程图的拓扑结构----程序图。程序图是退化了的程序流程图,是反映控制流程的有向图。称为结点,代表程序流程图的每个处理符号;称为边或者路径,表示控制流向。②计算程序环路复杂度环路复杂度是度量程序图G复杂度的方法。三种计算方法:(1)V(G)=P+1,其中P为判定结点(2)V(G)=E-N+2,其中E为边数,N为结点数(3)V(G)为区域数③确定独立路径的基本集合一条独立路径至少包含有一条在其他独立路径中没有的边。独立路径的基本集合不唯一。④设计测试用例确保每一条路径的执行。基本路径测试的步骤voidmergelist(listla,listlb,list&lc){1:initlist(lc);i=j=1;k=0;la_len=listlength(la);lb_len=lis