软件工程讲义-07-第七章-软件测试课件.ppt
软件工程第七章 软件测试7.1 测试的目的和原则7.2 测试方法与测试用例设计7.3 软件测试的策略7.4 软件测试的种类7.5 程序的静态测试7.6 程序调试1 软件工程7.1 软件测试的目的和原则7.1.1 软件测试的目的基于不同的立场,存在着两种完全不同的测试目的。从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可接受该产品。从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求。2 软件工程n 鉴于以上观点,IEEE在其软件工程术语标准中给软件测试下的定义是“用人工或自动的手段来执行和评价系统或系统部件的过程,以检验它是否满足规定的需求,或识别期望的结果和实际的结果之间有无差别”。n 在以上两个目的中,通常测试专家更侧重后一个。他们普遍将软件测试视为“根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例,并利用这些测试用例去执行检查并发现软件错误的过程”。3 软件工程Myers软件测试目的n Myers在其名著“The Art of Software Test”中强调:a.测试是程序的执行过程,目的在于发现错误;b.一个好的测试用例在于能发现至今未发现的错误;c.一个成功的测试是发现了至今未发现的错误的测试。4 软件工程7.1.2 软件测试的原则1)应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。2)测试用例应由测试输入数据和对应的预期输出结果这两部分组成。3)程序员应避免检查自己的程序。4)在设计测试用例时,应包括合理的输入条件和不合理的输入条件。5)所有的测试都应当追溯到用户要求,导致程序不能满足用户要求的错误是严重错误。6 软件工程6)充分注意测试中的群集现象。经验表明,测试发现错误的80%很可能出自20%的模块,换句话说,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。7)严格执行测试计划,排除测试的随意性。8)应当对每一个测试结果做全面检查。9)妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。7 软件工程7.1.3 软件测试的对象n 软件测试并不等于程序测试。软件测试应贯穿于软件定义与开发的整个期间。n 需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象。n 测试的两个方面:缺陷测试V&V(验证和确认)8 软件工程用户要求用户:我要什么?需求说明书分析员我可以提供什么?运行结果计算机:程序运行得到的结果相符吗?源程序程序员我要让计算机怎么做?设计说明书设计员我要让软件做什么?理解正确性表达正确性理解正确性设计正确性表达正确性理解正确性编码正确性运行正确性输入正确性10 软件工程n 在整个生存周期中各个阶段都必须应用V&V技术。两个主要目标是:1)发现系统中的缺陷;2)判断在给定的操作环境下系统是否可用;n V&V技术分为两种:1)软件检查:对系统的各种表示进行静态分析,以发现问题。这些检查可以借助工具进行文档和代码分析。2)软件测试:通过执行测试数据观察系统的操作特征(行为)是否符合要求。11 软件工程7.1.4 测试信息流可靠性分析测试结果分析预期结果预测的可靠性调试修改后的软件软件配置测试配置测试工具测试结果出错率数据错误13 软件工程n 排错(调试):对已经发现的错误进行错误定位和确定出错性质,并改正这些错误,同时修改相关的文档。n 修正后的文档再测试:直到通过测试为止。n 通过收集和分析测试结果数据,对软件建立可靠性模型n 利用可靠性分析,评价软件质量。n 如果测试发现不了错误,可以肯定,测试配置考虑得不够细致充分,错误仍然潜伏在软件中。15 软件工程7.1.5 测试与软件开发各阶段的关系n 软件开发过程是一个自顶向下,逐步细化的过程n 软件计划阶段定义软件范围(作用域)n 软件需求分析阶段建立软件信息域、功能和性能需求、约束等n 软件设计阶段建立软件体系结构、用户接口、数据结构和细部设计n 程序编码阶段把设计用某种程序设计语言转换成程序代码16 软件工程7.1.6 软件测试计划n软件测试计划是制定测试过程的标准,而不是描述具体的测试内容。n测试计划给所有相关人员一个总的系统测试的概貌,安排测试人员参加到测试中来。n测试计划结构:测试过程 描述测试过程的主要阶段,如单元和模块测试、子系统集成测试,需求跟踪 对每一项需求分别进行确认测试测试项目 定义在软件过程中需要进行的测试18 软件工程n测试计划不是一个不变的文档。测试时间安排给出总的测试时间安排并相应地安排资源分配。这与整个项目的时间安排有关。测试记录规程系统地记录测试结果。然后对测试结果和测试过程进行检查,看测试用例是否得到正常的执行。硬件与软件需求列出测试所使用的软件工具和硬件设施。约束 预料可能影响测试过程的约束(如人员短缺等)19 软件工程7.2 测试方法与测试用例设计1.黑盒测试u 等价类划分u 边界值分析u 错误推测法u 因果图u 功能图u 接口测试2.白盒测试u 逻辑覆盖u 判定结构分析u 循环结构分析u 基本路径覆盖20 软件工程黑盒测试(Black-Box Test)n 这种方法是把测试对象看做一个黑盒,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求和功能规格说明,检查程序的功能是否符合它的功能说明。n 黑盒测试叫做功能测试或数据驱动测试。n 一种特殊的黑盒测试叫做接口测试,它不管程序的需求和实现细节,仅依据程序与其外部环境的接口来选择测试数据。21 软件工程n 黑盒测试方法是在程序接口上进行测试,主要是为了发现以下错误:1)是否有不正确或遗漏了的功能?2)在接口上,输入能否正确地接受?能否输出正确的结果?3)是否有数据结构错误或外部信息(例如数据文件)访问错误?4)性能上是否能够满足要求?5)是否有初始化或终止性错误?22 软件工程白盒测试(White-Box Test)n 此方法把测试对象看做一个玻璃盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。n 通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。24 软件工程n 软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:1)对程序模块的所有独立的执行路径至少测试一次 路径覆盖测试;2)对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次 逻辑覆盖测试;3)在循环的边界和运行界限内执行循环体4)控制流测试;4)测试内部数据结构的有效性 数据流测试、领域测试等。25 软件工程n对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。给出一个小程序的流程图,它包括了一个执行20次的循环。n包含的不同执行路径数达 520 条,对每一条路径进行测试需要1毫秒,假定一年工作36524小时,要想把所有路径测试完,需3170年。26 软件工程7.2.1 逻辑覆盖n 逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。它属白盒测试。语句覆盖 判定覆盖 条件覆盖 判定条件覆盖 条件组合覆盖 路径覆盖28 软件工程(A1)and(B=0)(A=2)or(X1)X=X/AX=X+1TTTTFFFFabdce29 软件工程L3(a b e)=not(A 1)and(B=0)and(A=2)or(X 1)=not(A 1)or not(B=0)and(A=2)or(X 1)=not(A 1)and(A=2)or not(A 1)and(X 1)or not(B=0)and(A=2)L4(a c d)=(A 1)and(B=0)and not(A=2)or(X/A 1)=(A 1)and(B=0)and not(A=2)and not(X/A 1)31 软件工程1.语句覆盖n语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。n在图例中,正好所有的可执行语句都在路径L1上,所以选择路径 L1设计测试用例,就可以覆盖所有的可执行语句。32 软件工程n 测试用例的设计格式如下【输入的(A,B,X),输出的(A,B,X)】n 为图例设计满足语句覆盖的测试用例是:【(2,0,4),(2,0,3)】n 覆盖 ace【L1】。“语句覆盖是最弱的逻辑覆盖准则”如果第一个判 断“and”错为“or”,第二个判断“or”错为“and”,使用以上 测试用例,查不出问题。(A=2)and(B=0)or(A1)and(B=0)and(X/A1)33 软件工程 2.判定覆盖n判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。n判定覆盖又称为分支覆盖。n对于图例,如果选择路径L1和L2,就可得满足要求的测试用例:34 软件工程n【(2,0,4),(2,0,3)】覆盖 ace【L1】【(1,1,1),(1,1,1)】覆盖 abd【L2】(A=2)and(B=0)or(A 1)and(B=0)and(X/A 1)not(A 1)and not(A=2)and not(X 1)or not(B=0)and not(A=2)and not(X 1)35 软件工程n 如果选择路径L3和L4,还可得另一组可用的测试用例:【(2,1,1),(2,1,2)】覆盖 abe【L3】【(3,0,3),(3,0,1)】覆盖 acd【L4】not(A 1)and(X 1)or not(B=0)and(A=2)or not(B=0)and(X 1)(A 1)and(B=0)and not(A=2)and not(X/A 1)36 软件工程3.条件覆盖n 条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。n 在图例中,我们事先可对所有条件的取值加以标记。例如,n 对于第一个判断:条件 A1 取真为,取假为 条件 B0 取真为,取假为37 软件工程n 对于第二个判断:条件A2 取真为,取假为 条件X1 取真为,取假为 测试用例 覆盖分支 条件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,1,1),(1,1,1)】L2(b,d)【(3,1,2),(3,1,3)】L3(b,e)n 需要注意的是,在测试用例中可能有些条件取值在执行时覆盖不到,需要增加测试用例。38 软件工程