资源描述
44 软件测试的目的和原软件测试的目的和原则则44 软件测试用例设计软件测试用例设计44 软件测试策略软件测试策略44 软件测试种类软件测试种类44 程序调试程序调试软件测试的目的和原则软件测试的目的和原则n n软件测试的目的软件测试的目的n n软件测试的原则软件测试的原则n n软件测试的对象软件测试的对象n n测试信息流测试信息流n n测试与软件开发各阶段的关系测试与软件开发各阶段的关系软件测试的目的软件测试的目的n n基于不同的立场,存在着两种完全基于不同的立场,存在着两种完全不同的测试目的。不同的测试目的。n n从从用户的角度用户的角度出发,普遍希望通过出发,普遍希望通过软件测试软件测试暴露软件中隐藏的错误和暴露软件中隐藏的错误和缺陷缺陷,以考虑是否可接受该产品。,以考虑是否可接受该产品。n n从从软件开发者的角度软件开发者的角度出发,则希望出发,则希望测试成为测试成为表明软件产品中不存在错表明软件产品中不存在错误误的过程,验证该软件已正确地实的过程,验证该软件已正确地实现了用户的要求,确立人们对软件现了用户的要求,确立人们对软件质量的信心。质量的信心。Myers软件测试目的软件测试目的(1)测试是测试是程序的执行过程程序的执行过程,目的,目的在于在于发现错误发现错误;(2)一个好的测试用例在于一个好的测试用例在于能发现能发现至今未发现的错误至今未发现的错误;(3)一个成功的测试是一个成功的测试是发现了至今发现了至今未发现的错误的测试未发现的错误的测试。n n换言之,测试的目的是换言之,测试的目的是uu 想以最少的时间和人力,想以最少的时间和人力,系统地找系统地找出软件中潜在的各种错误和缺陷出软件中潜在的各种错误和缺陷。如。如果我们成功地实施了测试,我们就能果我们成功地实施了测试,我们就能够发现软件中的错误。够发现软件中的错误。uu 测试的附带收获是,它测试的附带收获是,它能够证明软能够证明软件的功能和性能与需求说明相符合件的功能和性能与需求说明相符合。uu 实施测试收集到的测试结果数据为实施测试收集到的测试结果数据为可靠性分析提供了依据。可靠性分析提供了依据。uu 测试不能表明软件中不存在错误,测试不能表明软件中不存在错误,它只能说明软件中存在错误。它只能说明软件中存在错误。软件测试的原则软件测试的原则1.应当把应当把“尽早地和不断地进行软尽早地和不断地进行软件测试件测试”作为软件开发者的座右作为软件开发者的座右铭。铭。2.测试用例应由测试用例应由测试输入数据测试输入数据和对和对应的应的预期输出结果预期输出结果这两部分组成。这两部分组成。3.程序员应避免检查自己的程序。程序员应避免检查自己的程序。4.在设计测试用例时,应包括在设计测试用例时,应包括合理合理的输入条件的输入条件和和不合理的输入条件不合理的输入条件。5.充分注意测试中的群集现象。充分注意测试中的群集现象。经验表明,经验表明,测试后测试后程序中残存的错程序中残存的错误数目与该程序中已发现的错误数误数目与该程序中已发现的错误数目成正比目成正比。6.严格执行测试计划,严格执行测试计划,排除测试的随排除测试的随意性意性。7.应当对每一个测试结果做全面检查。应当对每一个测试结果做全面检查。8.妥善保存测试计划,测试用例,出妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提错统计和最终分析报告,为维护提供方便。供方便。软软 件件 测测 试试 的的 对对 象象n n软件测试并不等于程序测试。软件测试并不等于程序测试。软件软件测试应贯穿于软件定义与开发的整测试应贯穿于软件定义与开发的整个期间个期间。n n需求分析需求分析、概要设计概要设计、详细设计以详细设计以及程序编码及程序编码等各阶段所得到的等各阶段所得到的文档文档,包括需求规格说明、概要设计规格包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程说明、详细设计规格说明以及源程序,序,都应成为软件测试的对象都应成为软件测试的对象。n n为把握软件开发各个环节的正确性,为把握软件开发各个环节的正确性,需要进行各种需要进行各种确认确认和和验证验证工作。工作。n n确认确认(Validation),是一系列的活是一系列的活动和过程,目的是想证实在一个给动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。定的外部环境中软件的逻辑正确性。uu 需求规格说明确认需求规格说明确认uu 程序确认程序确认(静态确认、动态确认静态确认、动态确认)n n验证验证(Verification),试图证明在试图证明在软件生存期各个阶段,以及阶段间软件生存期各个阶段,以及阶段间的逻辑协调性、完备性和正确性。的逻辑协调性、完备性和正确性。测试信息流测试信息流测试信息流测试信息流n n软件配置软件配置:软件需求规格说明、软:软件需求规格说明、软件设计规格说明、源代码等;件设计规格说明、源代码等;n n测试配置测试配置:测试计划、测试用例、:测试计划、测试用例、测试程序等;测试程序等;n n测试工具测试工具:测试数据自动生成程序、:测试数据自动生成程序、静态分析程序、动态分析程序、测静态分析程序、动态分析程序、测试结果分析程序、以及驱动测试的试结果分析程序、以及驱动测试的测试数据库等等。测试数据库等等。n n测试结果分析测试结果分析:比较实测结果与:比较实测结果与预期结果,评价错误是否发生。预期结果,评价错误是否发生。n n排错排错(调试调试):对已经发现的错误:对已经发现的错误进行错误定位和确定出错性质,进行错误定位和确定出错性质,并改正这些错误,同时修改相关并改正这些错误,同时修改相关的文档。的文档。n n修正后的文档再测试修正后的文档再测试:直到通过:直到通过测试为止。测试为止。n n通过收集和分析测试结果数据,对通过收集和分析测试结果数据,对软件建立可靠性模型软件建立可靠性模型n n利用可靠性分析,评价软件质量:利用可靠性分析,评价软件质量:uu 软件的质量和可靠性达到可以接软件的质量和可靠性达到可以接受的程度;受的程度;uu 所做的测试不足以发现严重的错所做的测试不足以发现严重的错误;误;n n如果测试发现不了错误,可以肯定,如果测试发现不了错误,可以肯定,测试配置考虑得不够细致充分,错测试配置考虑得不够细致充分,错误仍然潜伏在软件中。误仍然潜伏在软件中。测试与软件开发各阶段的关系测试与软件开发各阶段的关系n n软件开发过程是一个自顶向下,逐软件开发过程是一个自顶向下,逐步细化的过程步细化的过程n n软件计划阶段定义软件作用域软件计划阶段定义软件作用域n n软件需求分析建立软件信息域、功软件需求分析建立软件信息域、功能和性能需求、约束等能和性能需求、约束等n n软件设计软件设计n n把设计用某种程序设计语言转换成把设计用某种程序设计语言转换成程序代码程序代码n n测试过程是依相反顺序安排的自底测试过程是依相反顺序安排的自底向上,逐步集成的过程。向上,逐步集成的过程。测试用例设计测试用例设计n n两种常用的测试方法两种常用的测试方法u 黑盒测试黑盒测试u 白盒测试白盒测试黑盒测试黑盒测试n n这种方法是把这种方法是把测试对象测试对象看做看做一个黑一个黑盒子盒子,测试人员完全不考虑程序内,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序程序的需求规格说明书,检查程序的功能是否符合它的功能说明。的功能是否符合它的功能说明。n n黑盒测试又叫做黑盒测试又叫做功能测试功能测试或或数据驱数据驱动测试动测试。n n黑盒测试方法是在程序接口上进行黑盒测试方法是在程序接口上进行测试,主要是为了发现以下错误测试,主要是为了发现以下错误:uu 是否有不正确或遗漏了的功能是否有不正确或遗漏了的功能?uu 在接口上,在接口上,输入能否正确地接受输入能否正确地接受?能否输出正确的结果能否输出正确的结果?uu 是否有数据结构错误或外部信息是否有数据结构错误或外部信息(例如数据文件例如数据文件)访问错误访问错误?uu 性能上是否能够满足要求性能上是否能够满足要求?uu 是否有初始化或终止性错误是否有初始化或终止性错误?n n用黑盒测试发现程序中的错误,必用黑盒测试发现程序中的错误,必须在须在所有可能的输入条件和输出条所有可能的输入条件和输出条件件中确定测试数据,来检查程序是中确定测试数据,来检查程序是否都能产生正确的输出。否都能产生正确的输出。n n但这是但这是不可能不可能的。的。n n假设一个假设一个程序程序P有有输入量输入量X和和Y及及输输出量出量Z。在字长为在字长为32位的计算机上位的计算机上运行。若运行。若X、Y取整数,按黑盒方法取整数,按黑盒方法进行穷举测试:进行穷举测试:n n可能采用的可能采用的 测试数据组:测试数据组:232232 264 n n如果测试一组数据需要如果测试一组数据需要1毫秒,一毫秒,一年工作年工作365 24小时,完成所有测试小时,完成所有测试需需5亿年。亿年。白盒测试白盒测试n n此方法此方法把测试对象看做一个透明的把测试对象看做一个透明的盒子盒子,它允许测试人员利用程序内,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路选择测试用例,对程序所有逻辑路径进行测试。径进行测试。n n通过在不同点检查程序的状态,确通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一定实际的状态是否与预期的状态一致。因此白盒测试又称为结构测试致。因此白盒测试又称为结构测试或逻辑驱动测试。或逻辑驱动测试。n n软件人员使用白盒测试方法,主要软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:想对程序模块进行如下的检查:uu 对程序模块的对程序模块的所有独立的执行路所有独立的执行路径径至少测试一次;至少测试一次;uu 对对所有的逻辑判定所有的逻辑判定,取取“真真”与与取取“假假”的两种情况都至少测试一的两种情况都至少测试一次次;uu 在循环的边界和运行界限内执行在循环的边界和运行界限内执行循环体;循环体;uu 测试测试内部数据结构的有效性内部数据结构的有效性,等。,等。n n对一个具有对一个具有多重选择和循环嵌套多重选择和循环嵌套的的程序,程序,不同的路径数目可能是天文不同的路径数目可能是天文数字数字。给出一个小程序的流程图,。给出一个小程序的流程图,它包括了一个执行它包括了一个执行20次的循环。次的循环。n n包含的不同执行路径数达包含的不同执行路径数达520条,对条,对每一条路径进行测试需要每一条路径进行测试需要1毫秒,毫秒,假定一年工作假定一年工作365 24小时,要想小时,要想把所有路径测试完,需把所有路径测试完,需3170年。年。逻辑覆盖逻辑覆盖uu 语句覆语句覆盖盖uu 判定覆判定覆盖盖uu 条件覆条件覆盖盖uu 判定条件覆判定条件覆盖盖uu 条件组合覆盖条件组合覆盖uu 路径覆盖路径覆盖。逻辑覆盖是以逻辑覆盖是以程序内部的逻辑结构为程序内部的逻辑结构为基础基础的设计测试用例的技术。它属白的设计测试用例的技术。它属白盒测试。盒测试。(A1)and(B=0)(A=2)or(X1)X=X/AX=X+1T TT TF FF FabdceL1(a c e)=(A1)and(B=0)and (A=2)or(X/A1)=(A1)and(B=0)and(A=2)or (A1)and(B=0)and(X/A1)=(A=2)and(B=0)or (A1)and(B=0)and(X/A1)L2(a b d)=not(A1)and(B=0)and not(A=2)or(X1)=not(A1)or not(B=0)and not(A=2)and not(X1)=not(A1)and not(A=2)and not(X1)or not(B=0)and not(A=2)and not(X1)L3(a b e)=not(A1)and(B=0)and (A=2)or(X1)=not(A1)or not(B=0)and (A=2)or(X1)=not(A1)and(A=2)or not(A1)and(X1)or not(B=0)and(A=2)or not(B=0)and(X1)L4(a c d)=(A1)and(B=0)and not(A=2)or(X/A1)=(A1)and(B=0)and not(A=2)and not(X/A1)语句覆盖语句覆盖n n语句覆盖就是设计若干个测试用例,语句覆盖就是设计若干个测试用例,运行被测程序,使得运行被测程序,使得每一可执行语每一可执行语句至少执行一次句至少执行一次。n n在图例中,正好所有的可执行语句在图例中,正好所有的可执行语句都在都在路径路径L1上,所以选择上,所以选择路径路径 L1设设计测试用例,就可以覆盖所有的可计测试用例,就可以覆盖所有的可执行语句。执行语句。n n测试用例的设计格式如下测试用例的设计格式如下【输入的【输入的(A,B,X),输出的输出的(A,B,X)】n n为图例设计满足为图例设计满足语句覆盖语句覆盖的测试用例的测试用例是是:【(2,0,4),(2,0,3)】覆盖覆盖 ace【L1】(A=2)and(B=0)or (A1)and(B=0)and(X/A1)判定覆盖判定覆盖n n判定覆盖就是设计若干个测试用判定覆盖就是设计若干个测试用例,运行被测程序,使得例,运行被测程序,使得程序中程序中每个判断的取真分支和取假分支每个判断的取真分支和取假分支至少经历一次至少经历一次。n n判定覆盖又称为判定覆盖又称为分支覆盖分支覆盖。n n对于图例,如果选择对于图例,如果选择路径路径L1和和L2,就可得满足要求的测试用例就可得满足要求的测试用例:n n【(2,0,4),(2,0,3)】覆盖】覆盖 ace【L1】【(1,1,1),(1,1,1)】覆盖覆盖 abd【L2】(A=2)and(B=0)or (A1)and(B=0)and(X/A1)not(A1)and not(A=2)and not(X1)or not(B=0)and not(A=2)and not(X1)n n如果选择路径如果选择路径L3和和L4,还可得另一还可得另一组可用的测试用例组可用的测试用例:【(2,1,1),(2,1,2)】覆盖】覆盖 abe【L3】【(3,0,3),(3,1,1)】覆盖覆盖 acd【L4】not(A1)and(X1)or not(B=0)and (A=2)or not(B=0)and(X1)(A1)and(B=0)and not(A=2)and not(X/A1)条件覆盖条件覆盖n n条件覆盖就是设计若干个测试用例,条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中运行被测程序,使得程序中每个判断每个判断的每个条件的可能取值至少执行一次的每个条件的可能取值至少执行一次。n n在图例中,我们事先可对所有条件的在图例中,我们事先可对所有条件的取值加以标记。例如,取值加以标记。例如,n n对于第一个判断:对于第一个判断:uu 条件条件 A1 取真为取真为 ,取假为,取假为 条件条件 B0 取真为取真为 ,取假为,取假为n n对于第二个判断:对于第二个判断:uu 条件条件A2 取真为取真为 ,取假为,取假为 条件条件X1 取真为取真为 ,取假为,取假为 测试用例测试用例 覆盖分支覆盖分支 条件取值条件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,0,1),(1,0,1)】L2(b,d)【(2,1,1),(2,1,2)】L3(b,e)或或 测测 试试 用用 例例覆盖分支覆盖分支 条件取值条件取值【(1,0,3),(1,0,4)】L3(b,e)【(2,1,1),(2,1,2)】L3(b,e)判定条件覆盖判定条件覆盖n n判定条件覆盖就是设计足够的测试判定条件覆盖就是设计足够的测试用例,使得用例,使得判断中每个条件的所有可判断中每个条件的所有可能取值至少执行一次能取值至少执行一次,每个判断中的每个判断中的每个条件的可能取值至少执行一次每个条件的可能取值至少执行一次。测测 试试 用用 例例覆盖分支覆盖分支 条件取值条件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,1,1),(1,1,1)】L2(b,d)(A=2)and(B=0)or (A1)and(B=0)and(X/A1)not(A1)and not(A=2)and not(X1)or not(B=0)and not(A=2)and not(X1)andorA1T TB=0T TX=X/AT TF FF FA=2T TF FX1F FX=X+1条件组合覆盖条件组合覆盖n n条件组合覆盖就是设计足够的测条件组合覆盖就是设计足够的测试用例,运行被测程序,使得试用例,运行被测程序,使得每每个判断的所有可能的条件取值组个判断的所有可能的条件取值组合至少执行一次合至少执行一次。记记 A1,B0 作作 A1,B0 作作 A 1,B0 作作 A 1,B0 作作 A2,X1 作作 A2,X 1 作作 A2,X1 作作 A2,X 1 作作 测测 试试 用用 例例 覆盖条件覆盖条件 覆盖组合覆盖组合【(2,0,4),(2,0,3)】(L1),【(2,1,1),(2,1,2)】(L3),【(1,0,3),(1,0,4)】(L3),【(1,1,1),(1,1,1)】(L2),路径测试路径测试n n路径测试就是设计足够的测试用例,路径测试就是设计足够的测试用例,覆盖程序中所有可能的路径覆盖程序中所有可能的路径。测测 试试 用用 例例 通过路径通过路径 覆盖条件覆盖条件【(2,0,4),(2,0,3)】ace(L1)【(1,1,1),(1,1,1)】abd(L2)【(1,1,2),(1,1,3)】abe(L3)【(3,0,3),(3,0,1)】acd(L4)条条件件测测试试路路径径选选择择n n当程序中判定多于一个时,形成的当程序中判定多于一个时,形成的分支结构可以分为两类:分支结构可以分为两类:嵌套型分嵌套型分支结构支结构和和连锁型分支结构连锁型分支结构。n n对于嵌套型分支结构,若有对于嵌套型分支结构,若有n个判定个判定语句,需要语句,需要n+1个测试用例;个测试用例;n n对于连锁型分支结构,对于连锁型分支结构,若有若有n个判定个判定语句,需要有语句,需要有2n个测试用例,覆盖个测试用例,覆盖它的它的2n条路径。条路径。循环测试路径选择循环测试路径选择n n循环分为循环分为4种不同类型:种不同类型:简单循环简单循环、连锁循环连锁循环、嵌套循环嵌套循环和和非结构循环非结构循环。(1)简单循环简单循环 零次循环零次循环:从循环入口到出口:从循环入口到出口 一次循环一次循环:检查循环初始值:检查循环初始值 二次循环二次循环:检查多次循环:检查多次循环 m次循环:次循环:检查在多次循环检查在多次循环 最大次数循环、比最大次数多最大次数循环、比最大次数多一次、少一次的循环。一次、少一次的循环。例:求最小值例:求最小值k=i;for(j=i+1;j=n;j+)if(Aj Ak)k=j;k=i;j=i+1;j=n?AjAk?k=jj+fdcabe测试用例选择测试用例选择 对最内层循环做简单循环的全对最内层循环做简单循环的全部测试。所有其它层的循环变量置为部测试。所有其它层的循环变量置为最小值;最小值;逐步外推,对其外面一层循环逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套的循环变量取最小值,所有其它嵌套内层循环的循环变量取内层循环的循环变量取“典型典型”值。值。反复进行,直到所有各层循环反复进行,直到所有各层循环测试完毕。测试完毕。(2)嵌套循环嵌套循环 对全部各层循环同时取最小循环次对全部各层循环同时取最小循环次数,或者同时取最大循环次数数,或者同时取最大循环次数(3)连锁循环连锁循环如果各个循环如果各个循环互相独立互相独立,则可以用与,则可以用与简单循环相同的方法进行测试。但如简单循环相同的方法进行测试。但如果几个循环不果几个循环不是互相独立是互相独立的,则需要的,则需要使用测试嵌套循环的办法来处理。使用测试嵌套循环的办法来处理。(4)非结构循环非结构循环这一类循环应该使用结构化程序设计这一类循环应该使用结构化程序设计方法重新设计测试用例。方法重新设计测试用例。基本路径测试基本路径测试n n基本路径测试方法把覆盖的路径数基本路径测试方法把覆盖的路径数压缩到一定限度内,压缩到一定限度内,程序中的循环程序中的循环体最多只执行一次体最多只执行一次。n n它是在程序控制流图的基础上,它是在程序控制流图的基础上,分分析控制构造的环路复杂性析控制构造的环路复杂性,导出基导出基本可执行路径集合本可执行路径集合,设计测试用例设计测试用例的的方法。设计出的测试用例要保证方法。设计出的测试用例要保证在测试中,程序的每一个可执行语在测试中,程序的每一个可执行语句至少要执行一次。句至少要执行一次。1.程序的控制流图程序的控制流图n n符号符号为控制流图的一个结点,表为控制流图的一个结点,表示一个或多个无分支的示一个或多个无分支的PDL语句或语句或源程序语句。箭头为边,表示控制源程序语句。箭头为边,表示控制流的方向。流的方向。n n在选择或多分支结构中,分支的汇在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。聚处应有一个汇聚结点。n n边和结点圈定的区域叫做区域边和结点圈定的区域叫做区域,当,当对区域计数时,图形外的区域也应对区域计数时,图形外的区域也应记为一个区域。记为一个区域。n n如果判断中的条件表达式是由一个如果判断中的条件表达式是由一个或多个逻辑运算符或多个逻辑运算符(OR,AND,.)连接的复合条件表达式,则需改为连接的复合条件表达式,则需改为 一系列一系列只有单个条件的嵌套的判断只有单个条件的嵌套的判断。2.程序环路复杂性程序环路复杂性n n程序的环路复杂性给出了程序的环路复杂性给出了程序基本程序基本路径集中的独立路径条数路径集中的独立路径条数,这是确,这是确保程序中每个可执行语句至少执行保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。一次所必需的测试用例数目的上界。n n从控制流图来看,一条独立路径是从控制流图来看,一条独立路径是至少包含有一条在其它独立路径中至少包含有一条在其它独立路径中从未有过的边的路径。从未有过的边的路径。n n例如,在图示的控制流图中,一组例如,在图示的控制流图中,一组独立的路径是独立的路径是path1:1-11path2:1-2-3-4-5-10-1-11path3:1-2-3-6-8-9-10-1-11path4:1-2-3-6-7-9-10-1-11n n路径路径 path1,path2,path3,path4组成了控制流图的一个基本路径集。组成了控制流图的一个基本路径集。3.导出测试用例导出测试用例n n导出测试用例,导出测试用例,确保基本路径集中确保基本路径集中的每一条路径的执行的每一条路径的执行。n n根据判断结点给出的条件,选择适根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被当的数据以保证某一条路径可以被测试到测试到 用逻辑覆盖方法用逻辑覆盖方法。n n每个每个测试用例执行之后测试用例执行之后,与预期结与预期结果进行比较果进行比较。如果所有测试用例都。如果所有测试用例都执行完毕,则可以确信程序中所有执行完毕,则可以确信程序中所有的可执行语句至少被执行了一次。的可执行语句至少被执行了一次。n n必须注意,一些独立的路径必须注意,一些独立的路径(如例中如例中的路径的路径1),往往不是完全孤立的,往往不是完全孤立的,有时它是程序正常的控制流的一部有时它是程序正常的控制流的一部分,这时,这些路径的测试可以是分,这时,这些路径的测试可以是另一条路径测试的一部分。另一条路径测试的一部分。黑盒测试的测试用例设计黑盒测试的测试用例设计uu 等价类划分等价类划分uu 边界值分析边界值分析uu 错误推测法错误推测法uu 因果图因果图等价类划分等价类划分n n等价类划分是一种典型的黑盒测试等价类划分是一种典型的黑盒测试方法,使用这一方法时,方法,使用这一方法时,完全不考完全不考虑程序的内部结构虑程序的内部结构,只依据程序的只依据程序的规格说明来设计测试用例规格说明来设计测试用例。n n等价类划分方法等价类划分方法把所有可能的输入把所有可能的输入数据数据,即程序的输入域,即程序的输入域划分成若干划分成若干部分部分,然后,然后从每一部分中选取少数从每一部分中选取少数有代表性的数据做为测试用例有代表性的数据做为测试用例。n n使用这一方法设计测试用例要经历使用这一方法设计测试用例要经历划分等价类划分等价类(列出等价类表)和(列出等价类表)和选选取测试用例取测试用例两步。两步。n n划分等价类划分等价类等价类是指某个输入域的子集合。等价类是指某个输入域的子集合。在该子集合中,在该子集合中,各个输入数据对于各个输入数据对于揭露程序中的错误都是等效的揭露程序中的错误都是等效的。测。测试某等价类的代表值就等价于对这试某等价类的代表值就等价于对这一类其它值的测试。一类其它值的测试。n n等价类的划分有两种不同的情况:等价类的划分有两种不同的情况:有效等价类有效等价类:是指对于程序的:是指对于程序的规格说明来说,是合理的,有意义规格说明来说,是合理的,有意义的输入数据构成的集合。的输入数据构成的集合。无效等价类无效等价类:是指对于程序的:是指对于程序的规格说明来说,是不合理的,无意规格说明来说,是不合理的,无意义的输入数据构成的集合。义的输入数据构成的集合。n n在设计测试用例时,要同时考虑有在设计测试用例时,要同时考虑有效等价类和无效等价类的设计。效等价类和无效等价类的设计。n n划分等价类等价类的原则。划分等价类等价类的原则。(1)如果输入条件规定了取值范围,如果输入条件规定了取值范围,或值的个数,则可以确立一个有效或值的个数,则可以确立一个有效等价类和两个无效等价类。等价类和两个无效等价类。n n例如,在程序的规格说明中,对输例如,在程序的规格说明中,对输入条件有一句话:入条件有一句话:“项数可以从项数可以从1到到999”则有效等价类是则有效等价类是“1项数项数999”两个无效等价类是两个无效等价类是“项数项数1”或或“项项数数999”。在数轴上表示成。在数轴上表示成:(2)如果输入条件规定了输入值的如果输入条件规定了输入值的集合,或者是规定了集合,或者是规定了“必须如何必须如何”的条件,这时可确立一个有效等价的条件,这时可确立一个有效等价类和一个无效等价类。类和一个无效等价类。n n例如,在例如,在Pascal语言中对变量标识语言中对变量标识符规定为符规定为“以字母打头的以字母打头的串串”。那么所有以字母打头的构成有效等那么所有以字母打头的构成有效等价类,而不在此集合内(不以字母价类,而不在此集合内(不以字母打头)的归于无效等价类。打头)的归于无效等价类。(3)如果输入条件是一个布尔量,如果输入条件是一个布尔量,则可以确定一个有效等价类和一个则可以确定一个有效等价类和一个无效等价类。无效等价类。(4)如果规定了输入数据的一组值,如果规定了输入数据的一组值,而且程序要对每个输入值分别进行而且程序要对每个输入值分别进行处理。处理。这时可为这时可为 每一个输入值确立每一个输入值确立一个有效等价类,此外针对这组值一个有效等价类,此外针对这组值确立一个无效等价类,它是所有不确立一个无效等价类,它是所有不允许的输入值的集合。允许的输入值的集合。n n例如,在教师上岗方案中规定对教例如,在教师上岗方案中规定对教授、副教授、讲师和助教分别计算授、副教授、讲师和助教分别计算分数,做相应的处理。因此可以确分数,做相应的处理。因此可以确定定4个有效等价类为教授、副教授、个有效等价类为教授、副教授、讲师和助教,一个无效等价类,它讲师和助教,一个无效等价类,它是所有不符合以上身分的人员的输是所有不符合以上身分的人员的输入值的集合。入值的集合。(5)如果规定了输入数据必须遵守如果规定了输入数据必须遵守的规则,则可以确立一个有效等价的规则,则可以确立一个有效等价类(符合规则)和若干个无效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。类(从不同角度违反规则)。n n例如,例如,Pascal语言规定语言规定“一个语句一个语句必须以分号必须以分号;结束结束”。这时,可。这时,可以确定一个有效等价类以确定一个有效等价类“以以;结束结束”,若干个无效等价类,若干个无效等价类“以以:结束结束”、“以以,结束结束”、“以以 结束结束”、“以以LF结束结束”等。等。n n确立测试用例确立测试用例在确立了等价类之后,建立等价类在确立了等价类之后,建立等价类表,列出所有划分出的等价类。表,列出所有划分出的等价类。n n再从划分出的等价类中按以下原则再从划分出的等价类中按以下原则选择测试用例:选择测试用例:(1)为每一个等价类规定一个唯一编号;为每一个等价类规定一个唯一编号;(2)设计一个新的测试用例,使其设计一个新的测试用例,使其尽可尽可能多地覆盖尚未被覆盖的有效等价类能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都重复这一步,直到所有的有效等价类都被覆盖为止;被覆盖为止;(3)设计一个新的测试用例,使其设计一个新的测试用例,使其仅覆仅覆盖一个尚未被覆盖的无效等价类盖一个尚未被覆盖的无效等价类,重复,重复这一步,直到所有的无效等价类都被覆这一步,直到所有的无效等价类都被覆盖为止盖为止。n n用等价类划分法设计测试用例的实用等价类划分法设计测试用例的实例例在某一在某一PASCAL语言版本中规定:语言版本中规定:“标识符是由字母开头标识符是由字母开头,后跟字母后跟字母或数字的任意组合构成或数字的任意组合构成。有效字符有效字符数为数为8个个,最大字符数为最大字符数为80个个。”并且规定:并且规定:“标识符必须先说明标识符必须先说明,再使用再使用。”“在同一说明语句中在同一说明语句中,标识符至少必须有一个标识符至少必须有一个。”用等价类划分方法,建立输入等价类表用等价类划分方法,建立输入等价类表:n n下面选取了下面选取了9个测试用例,它们覆盖个测试用例,它们覆盖了所有的等价类。了所有的等价类。VAR x,T1234567:REAL;BEGIN x:=3.414;T1234567:=2.732;.(1),(2),(4),(8),(9),(12),(14)VAR :REAL;(3)VAR x,:,:REAL;(5)VAR T12345678:REAL;(6)VAR T12345.:REAL;(7)多于多于80个字符个字符 VAR T$:CHAR;(10)VAR GOTO:INTEGER;(11)VAR 2T:REAL;(13)VAR PAR:REAL;(15)BEGIN .PAP:=SIN(3.14*0.8)/6;边界值分析边界值分析n n边界值分析也是一种黑盒测试方法,边界值分析也是一种黑盒测试方法,是对等价类划分方法的补充。是对等价类划分方法的补充。n n人们从长期的测试工作经验得知,人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的围的边界上,而不是在输入范围的内部内部。因此针对各种边界情况设计。因此针对各种边界情况设计测试用例,测试用例,可以查出更多的错误可以查出更多的错误。n n比如,在做三角形计算时,要输入比如,在做三角形计算时,要输入三角形的三个边长:三角形的三个边长:A、B和和C。我我们应注意到这三个数值应当满足们应注意到这三个数值应当满足 A0、B0、C0、ABC、ACB、BCA,才能构成三角形。但如果把六个不才能构成三角形。但如果把六个不等式中的任何一个大于号等式中的任何一个大于号“”错错写成大于等于号写成大于等于号“”,那就不能,那就不能构成三角形。问题恰出现在容易被构成三角形。问题恰出现在容易被疏忽的边界附近。疏忽的边界附近。n n这里所说的边界是指,相当于输入这里所说的边界是指,相当于输入等价类和输出等价类而言,稍高于等价类和输出等价类而言,稍高于其边界值及稍低于其边界值的一些其边界值及稍低于其边界值的一些特定情况。特定情况。n n使用边界值分析方法设计测试用例,使用边界值分析方法设计测试用例,首先应确定边界情况。首先应确定边界情况。应当选取正应当选取正好等于,刚刚大于,或刚刚小于边好等于,刚刚大于,或刚刚小于边界的值做为测试数据界的值做为测试数据,而不是选取,而不是选取等价类中的典型值或任意值做为测等价类中的典型值或任意值做为测试数据。试数据。错误推测法错误推测法n n人们也可以靠经验和直觉推测程序人们也可以靠经验和直觉推测程序中可能存在的各种错误,从而有针中可能存在的各种错误,从而有针对性地编写检查这些错误的例子。对性地编写检查这些错误的例子。这就是错误推测法。这就是错误推测法。n n错误推测法的基本想法是:错误推测法的基本想法是:列举出列举出程序中所有可能有的错误和容易发程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择生错误的特殊情况,根据它们选择测试用例测试用例。因果图因果图n n因果图的适用范围因果图的适用范围如果在测试时必须考虑如果在测试时必须考虑输入条件的输入条件的各种组合各种组合,可使用一种适合于描述,可使用一种适合于描述对于多种条件的组合,相应产生多对于多种条件的组合,相应产生多个动作的形式来设计测试用例,这个动作的形式来设计测试用例,这就需要利用因果图。就需要利用因果图。因果图方法最终生成的就是判定表。因果图方法最终生成的就是判定表。它适合于检查程序输入条件的各种它适合于检查程序输入条件的各种组合情况。组合情况。n n用因果图生成测试用例的基本步骤用因果图生成测试用例的基本步骤(1)分析软件规格说明描述中,哪分析软件规格说明描述中,哪些是原因些是原因(即输入条件或输入条件即输入条件或输入条件的等价类的等价类),哪些是结果,哪些是结果(即输出条即输出条件件),并给每个原因和结果赋予一,并给每个原因和结果赋予一个标识符。个标识符。(2)分析软件规格说明描述中的语分析软件规格说明描述中的语义,找出原因与结果之间,原因与义,找出原因与结果之间,原因与原因之间对应的是什么关系原因之间对应的是什么关系?根据根据这些关系,画出因果图。这些关系,画出因果图。(3)由于语法或环境限制,有些原因由于语法或环境限制,有些原因与原因之间,原因与结果之间的组与原因之间,原因与结果之间的组合情况不可能出现。为表明这些特合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标殊情况,在因果图上用一些记号标明约束或限制条件。明约束或限制条件。(4)把因果图转换成判定表。把因果图转换成判定表。(5)把判定表的每一列拿出来作为依把判定表的每一列拿出来作为依据,设计测试用例。据,设计测试用例。n n在因果图中出现的基本符号在因果图中出现的基本符号通常在因果图中用通常在因果图中用Ci表示原因,用表示原因,用Ei表示结果,各结点表示状态,可表示结果,各结点表示状态,可取值取值“0”或或“1”。“0”表示某表示某状态不出现,状态不出现,“1”表示某状态出表示某状态出现。现。n n主要的原因和结果之间的关系有主要的原因和结果之间的关系有:n n表示约束条件的符号表示约束条件的符号为了表示原因与原因之间,结果与为了表示原因与原因之间,结果与结果之间可能存在的约束条件,在结果之间可能存在的约束条件,在因果图中可以附加一些表示约束条因果图中可以附加一些表示约束条件的符号。件的符号。n n例如,有一个处理单价为例如,有一个处理单价为5角钱的饮角钱的饮料的自动售货机软件测试用例的设计。料的自动售货机软件测试用例的设计。其规格说明如下:其规格说明如下:若若投入投入5角钱或角钱或1元钱的硬币,元钱的硬币,押下押下橙汁或啤酒的按钮,则相应的橙汁或啤酒的按钮,则相应的饮料就送出来。若售货机饮料就送出来。若售货机没有零钱找没有零钱找,则一个显示零钱找完的红灯亮,则一个显示零钱找完的红灯亮,这时在投入这时在投入1元硬币并押下按钮后,元硬币并押下按钮后,饮料不送出来而且饮料不送出来而且1元硬币也退出来;元硬币也退出来;若若有零钱找有零钱找,则显示零钱找完的,则显示零钱找完的红灯灭,在送出饮料的同时退还红灯灭,在送出饮料的同时退还5角角硬币。硬币。”(1)分析这一段说明,列出原因和结果分析这一段说明,列出原因和结果原因原因:1.售货机有零钱找售货机有零钱找 2.投入投入1元硬币元硬币 3.投入投入5角硬币角硬币 4.押下橙汁按钮押下橙汁按钮 5.押下啤酒按钮押下啤酒按钮建立中间结点,表示处理中间状态建立中间结点,表示处理中间状态11.投入投入1元硬币且押下饮料按钮元硬币且押下饮料按钮12.押下橙汁或啤酒的按钮押下橙汁或啤酒的按钮13.应当找应当找5角零钱并且售货机有零钱找角零钱并且售货机有零钱找14.钱已付清钱已付清 结果:结果:21.售货机零钱找完灯亮售货机零钱找完灯亮 22.退还退还1元硬币元硬币 23.退还退还5角硬币角硬币 24.送出橙汁饮料送出橙汁饮料 25.送出啤酒饮料送出啤酒饮料(2)画出因果图。画出因果图。所有原因结点列在左所有原因结点列在左边,所有结果结点列在右边。边,所有结果结点列在右边。(3)由于由于 2 与与 3,4 与与 5 不能同时发生,不能同时发生,分别加上约束条件分别加上约束条件E。(4)因果图因果图 (5)转换成判定表转换成判定表 n n 软件测试的策略软件测试的策略n n测试过程按测试过程按4个步骤进行,即个步骤进行,即单元单元测试测试、组装测试组装测试、确认测试确认测试和和系统系统测试测试。n n开始是开始是单元测试单元测试,集中对用源代码,集中对用源代码实现的每一个程序单元进行测试,实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现检查各个程序模块是否正确地实现了规定的功能。了规定的功能。n n组装测试组装测试把已测试过的模块组装起把已测试过的模块组装起来,主要对与设计相关的软件体系来,主要对与设计相关的软件体系结构的构造进行测试。结构的构造进行测试。n n确认测试确认测试则是要检查已实现的软件则是要检查已实现的软件是否满足了需求规格说明中确定了是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完的各种需求,以及软件配置是否完全、正确。全、正确。n n系统测试系统测试把已经经过确认的软件纳把已经经过确认的软件纳入实际运行环境中,与其它系统成入实际运行环境中,与其它系统成份组合在一起进行测试。份组合在一起进行测试。单元测试单元测试(Unit Testing)n n单元测试又称模块测试,单元测试又称模块测试,是针对软是针对软件设计的最小单位件设计的最小单位 程序模块程序模块,进进行正确性检验行正确性检验的测试工作。其目的的测试工作。其目的在于发现各模块内部可能存在的各在于发现各模块内部可能存在的各种差错。种差错。n n单元测试需要单元测试需要从程序的内部结构出从程序的内部结构出发设计测试用例发设计测试用例。多个模块可以平。多个模块可以平行地独立进行单元测试。行地独立进行单元测试。1.单元测试的内容单元测试的内容n n在单元测试时,测试者需要依据详在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解细设计说明书和源程序清单,了解该模块的该模块的I/O条件和模块的逻辑结条件和模块的逻辑结构,主要采用白盒测试的测试用例,构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,对任何合理的输入和不合理的输入,都能鉴别和响应。都能鉴别和响应。(1)模块接口测试模块接口测试n n在单元测试的开始,应对在单元测试的开始,应对通过被测通过被测模块的数据流模块的数据流进行测试。测试项目进行测试。测试项目包括:包括:uu 调用本模块的输入参数是否正确;调用本模块的输入参数是否正确;uu 本模块调用子模块时输入给子模本模块调用子模块时输入给子模块的参数是否正确;块的参数是否正确;uu 全局量的定义在各模块中是否一全局量的定义在各模块中是否一致;致;n n在做在做内外存交换内外存交换时要考虑:时要考虑:uu 文件属性是否正确;文件属性是否正确;uu OPEN与与CLOSE语句是否正确;语句是否正确;uu 缓冲区容量与记录长度是否匹配;缓冲区容量与记录长度是否匹配;uu 在进行读写操作之前是否打开了在进行读写操作之前是否打开了文件;文件;uu 在结束文件处理时是否关闭了文在结束文件处理时是否关闭了文件;件;uu 正文书写输入错误,正文书写输入错误,uu IO错误是否检查并做了处理。错误是否检查并做了处理。(2)局部数据结构测试局部数据结构测试n n不正确或不一致的数据类型说明不正确或不一致的数据类型说明n n使用尚未赋值或尚未初始化的变量使用尚未赋值或尚未初始化的变量n n错误的初始值或错误的缺省值错误的初始值或错误的缺省值n n变量名拼写错或书写错变量名拼写错或书写错n n不一致的数据类型不一致的数据类型n n全局数据对模块的影响全局数据对模块的影响 (3)路径测试路径测试n n选择适当的测试用例,对模块中选择适当的测试用例,对模块中重重要的执行路径要的执行路径进行测试。进行测试。n n应当设计测试用例查找由于应当设计测试用例查找由于错误的错误的计算计算、不正确的比较不正确的比较或或不正常的控不正常的控制流制流而导致的错误。而导致的错误。n n对基本执行路径和循环进行测试可对基本执行路径和循环进行测试可以发现大量的路径错误。以发现大量的路径错误。(4)错误处理测试错误处理测试n n出错的描述是否难以理解出错的描述是否难以理解n n出错的描述是否能够对错误定位出错的描述是否能够对错误定位n n显示的错误与实际的错误是否相符显示的错误与实际的错误是否相符n n对错误条件的处理正确与否对错误条件的处理正确与否n n在对错误进行处理之前,错误条件在对错误进行处理之前,错误条件是否已经引起系统的干预等是否已经引起系统的干预等(5)边界测试边界测试n n注意数据流、控制流中刚好等于、注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择可能性。对这些地方要仔细地选择测试用例,认真加以测试。测试用例,认真加以测试。n n如果对模块运行时间有要求的话,如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模定最坏情况下和平均意义下影响模块运行时间的因素。块运行时间的因素。2.单元测试的步骤单元测试的步骤n n模块并不是一个独立的程序,在模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它去模拟与被测模块相联系的其它模块。模块。uu 驱动模块驱动模块(driver)uu 桩模块桩模块(stub)存根模块存根模块n n如果一个模块要完成多种功能,可如果一个模块要完成多种功能,可以将这个模块看成由几个小程序组以将这个模块看成由几个小程序组成。必须对其中的每个小程序先进成。必须对其中的每个小程序先进行单元测试要做的工作,对关键模行单元测试要做的工作,对关键模块还要做性能测试。块还要做性能测试。n n对支持某些标准规程的程序,更要对支持某些标准规程的程序,更要着手进行互联测试。有人把这种情着手进行互联测试。有人把这种情况特别称为模块测试,以区别单元况特别称为模块测试,以区别单元测试。测试。组组 装装 测测 试试(Integrated Testing)n n组装测试组装测试(集成测试、联合测试)集成测试、联合测试)n n通常,在单元测试的基础上,需要通常,在单元测试的基础上,需要将所有模块按照设计要求组装成为将所有模块按照设计要求组装成为系统。这时需要考虑的问题是:系统。这时需要考虑的问题是:uu 在把各个模块连接起来的时侯,在把各个模块连接起来的时侯,穿越模块接口的数据穿越模块接口的数据是否会丢失;是否会丢失;uu 一个模块的功能是否会对另一个一个模块的功能是否会对另一个模块的功能产生不利的影响模块的功能产生不利的影响;uu 各个子功能组合起来各个子功能组合起来,能否达到预能否达到预期要求的父功能期要求的父功能;uu 全局数据结构是否有问题全局数据结构是否有问题;uu 单个模块的误差累积起来,是否会单个模块的误差累积起来,是否会放大放大,从而达到不能接受的程度。,从而达到不能接受的程度。在单元测试的同时可进行组装测试在单元测试的同时可进行组装测试,发现并排除在模块连接中可能出现发现并排除在模块连接中可能出现的问题,最终构成要求的软件系统。的问题,最终构成要求的软件系统。n n子系统的组装测试特别称为子系统的组装测试特别称为部件测部件测试试,它所做的工作是要找出组装后,它所做的工作是要找出组装后的的子系统与系统需求规格说明之间子系统与系统需求规格说明之间的不一致。的不一致。n n通常,把模块组装成为系统的方式通常,把模块组装成为系统的方式有两种有两种uu 一次性组装方式一次性组装方式uu 增殖式组装方式增殖式组装方式1.一一 次次 性性 组组 装装 方方 式式 (big bang)n n它是一种非增殖式组装方式。也叫它是一种非增殖式组装方式。也叫做整体拼装。做整体拼装。n n使用这种方式,首先对每个模块分使用这种方式,首先对每个模块分别进行模块测试,然后再把所有模别进行模块测试,然后再把所有模块组装在一起进行测试,最终得到块组装在一起进行测试,最终得到要求的软件系统。要求的软件系统。2.增殖式组装方式增殖式组装方式n n这种组装方式又称这种组装方式又称渐增式组装渐增式组装n n首先对一个个模块进行模块测试,首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的然后将这些模块逐步组装成较大的系统系统n n在组装的过程中边连接边测试,以在组装的过程中边连接边测试,以发现连接过程中产生的问题发现连接过程中产生的问题n n通过增殖逐步组装成为要求的软件通过增殖逐步组装成为要求的软件系统。系统。(1)自顶向下的增殖方式自顶向下的增殖方式n n这种组装方式将模块这种组装方式将模块按系统程序结按系统程序结构构,沿控制层次自顶向下进行组装沿控制层次自顶向下进行组装。n n自顶向下的增殖方式在测试过程中自顶向下的增殖方式在测试过程中较早地验证了主要的控制和判断点。较早地验证了主要的控制和判断点。n n选用按深度方向组装的方式,可以选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功首先实现和验证一个完整的软件功能。能。(2)自底向上的增殖方式自底向上的增殖方式n n这种组装的方式是从这种组装的方式是从程序模块结构程序模块结构的最底层的模块开始组装和测试的最底层的模块开始组装和测试。n n因为模块是自底向上进行组装,对因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)块(包括子模块的所有下属模块)已经组装并测试完成,所以已经组装并测试完成,所以不再需不再需要桩模块要桩模块。在模块的测试过程中需。在模块的测试过程中需要从子模块得到的信息可以直接运要从子模块得到的信息可以直接运行子模块得到。行子模块得到。n n自顶向下增殖的方式和自底向上增殖自顶向下增殖的方式和自底向上增殖的方式各有优缺点。的方式各有优缺点。n n一般来讲,一种方式的优点是另一种一般来讲,一种方式的优点是另一种方式的缺点。方式的缺点。(3)混合增殖式测试混合增殖式测试n n衍变的自顶向下的增殖测试衍变的自顶向下的增殖测试uu 首先对输入输出模块和引入新首先对输入输出模块和引入新算法模块进行测试算法模块进行测试;uu 再自底向上组装成为功能相当完再自底向
展开阅读全文