1、1,第8章 软件测试,本章主要内容 软件测试的概念软件测试的方法软件测试的步骤传统软件和面向对象软件的测试问题,2,第8章 软件测试,本章结构:8.1 软件测试概述 8.2 软件测试方法8.3 测试用例设计 8.4 软件测试的步骤 8.5 软件测试工具简介 8.6 调试8.7 面向对象软件测试简述,3,8.1 软件测试概述,8.1.1 软件测试的目标测试阶段的根本目标是以最少的人力、物力和时间,尽可能多地发现并排除软件中潜在的错误,最终把一个高质量的软件系统交给用户使用。Grenford J.Myers在The Art of Software Testing一书中就软件测试的目的提出了以下观点
2、:1软件测试是为了发现错误而执行程序的过程。2一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例。3一个成功的测试是发现了至今尚未发现的错误的测试。,4,8.1 软件测试概述,8.1.2 软件测试的原则(1)所有测试都应追溯到需求。(2)坚持“尽早地和不断地进行软件测试”。(3)测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成。 (4)程序员应避免测试自己的程序。(5)在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。(6)充分注意测试中的群集现象。 (7)严格执行测试计划,排除测试的随意性。 (8)应当对每个测试结果做全面检查。 (9)在测试程序时,不仅要检验程
3、序是否做了该做的事,还要检验程序是否做了不该做的事 。(10)长期妥善地保存测试计划、测试用例、出错统计和最终分析报告 。,5,8.1 软件测试概述,8.1.2 软件测试的过程和策略1软件测试的流程软件测试是一系列测试活动的集合,必须按照一定的测试流程,才能发现更多的错误。软件测试流程包括设计测试方案、实施测试、纠正错误、分析测试数据、建立可靠性模型等几个步骤,如图8.1所示。,6,8.1 软件测试概述,图8.1 软件测试的流程,7,8.1 软件测试概述,2软件测试的信息流软件测试时需要3类测试信息流,如图8.2所示。,图8.2 软件测试的信息流,8,8.1 软件测试概述,3测试的过程图8.3
4、描述了测试的过程。从图中可知,测试过程分为4个步骤,即单元测试、组装测试、确认测试和系统测试。,图8.3 软件测试的过程,9,8.1 软件测试概述,图8.4列出了软件测试各阶段与软件开发各阶段之间的关系。,图8.4 软件测试与软件开发各阶段的关系,10,8.2 软件测试方法,软件测试方法很多,按照测试过程是否执行程序来分,一般分为静态测试方法和动态测试方法。动态测试方法又根据测试用例的设计方法不同,分为黑盒测试和白盒测试两类。8.2.1静态测试静态测试包括代码检查、静态结构分析、代码质量度量等。是指不在计算机上执行被测试软件,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测。1人工测试
5、2计算机辅助静态分析,11,8.2 软件测试方法,8.2.2动态测试动态测试是基于计算机的测试,是为了发现错误而执行程序的过程。同测试任何产品一样,动态测试一般有黑盒测试法与白盒测试法两种,前者是测试产品的功能,后者是测试产品的内部结构和处理过程。1黑盒测试法黑盒法又称功能测试或数据驱动测试,该方法把被测试对象看成一个不透明的“黑盒子”,测试人员完全不考虑程序的内部结构和处理过程,只在软件的接口(界面)处进行测试,依据需求说明书,检查程序是否满足功能要求,是否能很好地接收数据,并产生正确的输出。通过黑盒测试主要发现以下错误:(1)是否有不正确或遗漏了的功能。(2)界面是否有错,能否正确地接受输
6、入数据,能否产生正确的输出信息。(3)是否有数据结构或外部数据库访问错误。(4)性能是否满足要求。(5)是否有初始化或终止性错误。黑盒测试法是一种宏观功能上的测试,该方法适合测试部门的测试人员或用户。,12,8.2 软件测试方法,2白盒测试法白盒法又称结构测试或逻辑驱动测试,该方法把被测试对象看成一个透明的盒子,测试人员可以了解程序的内部结构和处理过程,以检查处理过程为目的,对程序中尽可能多的逻辑路径进行测试,检验内部控制结构和数据结构是否有错,实际的运行状态与预期的状态是否一致。白盒测试法是一种程序级的微观上的测试,不适合于大单元、大系统的测试,主要用于很小单元的测试,以及从事软件底层工作、
7、生产构件的测试人员使用。,13,8.3 测试用例设计,8.3.1黑盒技术常用的黑盒测试技术有等价类划分、边界值分析、错误推测法、因果图等。 8.3.1.1等价类划分法1. 等价类划分法的基本思想2等价类划分的一般规则 划分等价类需要一定的经验,下述几条启发式规则有助于等价类的划分: (1)如果输入条件是一个布尔量,则可定义一个有效等价类和一个无效等价类。 (2)如果输入条件规定了确切的取值范围,可定义一个有效等价类和两个无效等价类。(3)如果规定了输入数据的个数,则可定义一个有效等价类和两个无效等价类。 (4)如规定了输入数据的一组值,且程序对不同输入值做不同处理,则每个允许的输入值是一个有效
8、等价类,并有一个无效等价类 (所有不允许的输入值的集合)。,14,8.3 测试用例设计,(5)如果规定了输入数据必须遵循的规则,可确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。 (6)如已划分的等价类各元素在程序中的处理方式不同,则应将此等价类进一步划分成更小的等价类。 (7)如果处理对象是表格,则应使用空表、只含1项的表,包含多项的表。,15,8.3 测试用例设计,3用等价类划分法设计测试用例的步骤(1)划分等价类,形成等价类表,为每一等价类规定一个唯一的编号;(2)根据等价类选取相应的测试用例。设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类,重复这一
9、步骤,直到所有有效等价类均被覆盖;设计一个新的测试用例,使其覆盖一个而且只覆盖一个尚未覆盖的无效等价类,重复这一步骤,直到所有无效等价类均被覆盖。,16,8.3 测试用例设计,8.3.1.2 边界值分析法 边界值分析方法是对各种输入、输出范围的边界情况设计测试用例的方法。边界值分析法选取测试数据应遵循的原则如下:(1)如果输入条件规定了取值范围,则应以范围的边界值以及刚刚超过范围边界外的值作为测试数据。(2)如果规定了输入值的个数,分别以满足条件的个数及稍少于、稍多于当前个数值作为测试数据。(3)针对每个输出条件使用上述(1)、(2)条规则。(4)如果程序规格说明中提到的输入或输出域是个有序的
10、集合(如顺序文件、线性表、链表等),则应选取有序集中的第一个和最后一个作为测试数据。设计测试方案时总是结合使用等价类划分和边界值分析两种技术。,17,8.3 测试用例设计,8.3.1.3 错误推测法人们可以靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地设计检查这些错误的例子,这就是错误推测法。错误推测法的基本思想是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,并且根据这些情况选择测试用例。错误推测法针对性强,可以直接切入可能的错误,直接定位,是一种非常实用、有效的方法。但是它需要丰富的经验和专业知识。错误推测法的实施步骤是,对被测软件首先列出所有可能有的错误和易错情况表,然
11、后基于该表设计测试用例。,18,8.3 测试用例设计,8.3.1.4 因果图法 因果图的基本原理是通过画因果图,把用自然语言描述的功能说明转换为判定表,列出输入数据各种组合与程序应做的动作(即相应的输出结果)之间的对应关系,最后为判定表的每一列至少设计一个测试用例。,19,8.3 测试用例设计,8.3.2白盒技术 白盒测试常用的技术是逻辑覆盖,即考察用测试数据运行被测程序时对程序逻辑的覆盖程度。主要的覆盖标准有6种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。,20,8.3 测试用例设计,1.语句覆盖以图8.4所示的程序流程图为例。为了使每个语句都执行一次,程序的执行
12、路径应该是,为此只需要输入下面的测试数据:A=2,B=0,X=3,图8.5 被测模块流程图,21,8.3 测试用例设计,2判定覆盖判定覆盖又叫分支覆盖,它的含义是指设计足够的测试用例,使得被测程序中每个判定表达式至少获得一次“真”值和一次“假”值,从而使程序的每个分支至少都通过一次。设计测试用例,只要通过路径,或者,就可达到判定覆盖标准。例如,选择下面的两组测试数据:(1)A=3,B=0,X=1(覆盖)(2)A=2,B=1,X=2(覆盖),22,8.3 测试用例设计,3条件覆盖条件覆盖的含义是设计足够的测试用例,使得判定表达式中每个条件的各种可能的值至少出现一次。经分析,选择下面两组测试数据:
13、(1)A=2,B=0,X=3(执行路径)(2)A=1,B=1,X=1(执行路径),23,8.3 测试用例设计,4判定/条件覆盖判定/条件覆盖是指选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。选择以下两组测试数据即可满足判定/条件覆盖标准:(1)A=2,B=0,X=3(2)A=1,B=1,X=1,24,8.3 测试用例设计,5条件组合覆盖 条件组合覆盖是比较强的逻辑覆盖标准,它是指设计足够的测试数据,使得每个判定表达式中条件的各种可能的值的组合都至少出现一次。下面的4组测试数据可以满足条件组合覆盖标准:(1)A=2,B=0,X=2(
14、针对(1)、(5)两种组合,执行路径)(2)A=2,B=1,X=1(针对(2)、(6)两种组合,执行路径)(3)A=1,B=0,X=2(针对(3)、(7)两种组合,执行路径)(4)A=1,B=1,X=1(针对(4)、(8)两种组合,执行路径),25,8.3 测试用例设计,6路径覆盖路径覆盖的含义是指选取足够的测试数据,使程序的每条可能路径都至少执行一次。选择以下测试数据,覆盖程序中的4条路径:(1)A=2,B=0,X=2(执行路径,覆盖条件组合和)(2)A=2,B=1,X=1(执行路径,覆盖条件组合和)(3)A=1,B=1,X=1(执行路径,覆盖条件组合和)(4)A=3,B=0,X=1(执行路
15、径,覆盖条件组合和),26,8.3 测试用例设计,8.3.3综合测试策略前面介绍的软件测试方法,各有所长。每种方法都能设计出一组有用的测试用例,用这组用例可能容易发现某种类型的错误,但可能不易发现另一种类型的错误。因此,对软件系统进行实际测试时,应该联合使用各种测试方法,形成综合策略。通常是先用黑盒法设计基本的测试用例,再用白盒法补充一些必要的测试用例。具体方法如下:(1)在任何情况下都应该使用边界值分析方法。经验表明,用这种方法设计出的测试用例暴露程序错误的能力最强。注意,应该既包括输入数据的边界情况又包括输出数据的边界情况。(2)用等价类划分法补充测试用例。(3)用错误推测法补充测试用例。
16、(4)对照程序逻辑,检查已经设计出的测试用例的逻辑覆盖程度,如果没有达到所要求的覆盖标准,则应当再补充一些测试用例。(5)如果程序的功能说明中含有输入条件的组合情况,则一开始就可选用因果图法。,27,8.3 测试用例设计,8.3.4 测试实例分析 下面给出一个三角形分类程序的测试方案的设计。程序的功能是,读入三个整数值代表三角形的三条边的长度,程序判断这三个值能否构成三角形,如果能够,则输出三角形是等边、等腰或任意三角形的分类信息。 综合使用边界值分析、等价类划分和错误推测等技术为此程序设计测试用例。,28,8.4 软件测试步骤,8.4.1 单元测试 单元测试也称为模块测试,是对软件最小单元的
17、测试,也是对程序模块进行正确性检验的测试,其目的在于发现各模块内部可能存在的各种差错。 1单元测试的步骤“测试环境”,如图8.6所示 。,图8.6 单元测试的测试环境,29,8.4 软件测试步骤,2单元测试的内容单元测试主要从以下5个方面进行:(1)模块接口测试 (2)局部数据结构测试(3)重要路径测试(4)错误处理测试(5)边界测试,30,8.4 软件测试步骤,8.4.2 组装测试 组装测试也称集成测试或联调,是在单元测试的基础上,将所有模块按照软件设计要求组装成系统并进行测试的过程。组装测试主要通过检查模块间的结构和通信发现软件设计阶段产生的错误,通常采用黑盒测试方法。在组装测试过程中,需
18、要考虑如下几个问题: 在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失。 一个模块的功能是否会对另一个模块的功能产生不利的影响。 各个子功能组合起来,能否达到预期要求的父功能。 全局数据结构是否有问题。 单个模块的误差累积起来,是否会放大,以至于达到不能接受的程度。 单个模块的错误是否会导致数据库错误。,31,8.4 软件测试步骤,通常有两种模块组装方式。 1非渐增式组装方式 2渐增式组装方式 (1)自顶向下的增殖组装方式 自顶向下的组装过程如图8.7。,图8.7 自顶向下的组装过程,32,8.4 软件测试步骤,(2)自底向上的增殖组装方式自底向上的组装过程如图8.8。,图8.8 自底
19、向上的组装过程,33,8.4 软件测试步骤,(3)混合增殖式测试通常是把以上两种方式结合起来进行组装和测试。 衍变和自顶向下的增殖测试:它的基本思想是强化对输入/输出模块和引入新算法模块的测试,并自底向上组装成为功能相当完整且相对独立的子系统,然后由父模块开始自顶向下进行增殖测试。 自底向上、自顶向下的增殖测试:它首先对含读操作的子系统做自底向上的组装和测试,然后对含写操作的子系统做自顶向下的组装与测试。 回归测试:这种方式采取自顶向下的方式测试被修改的模块及其子模块,然后将这一部分视为子系统,再自底向上测试,以检查该子系统与其上级模块的接口是否适配。,34,8.4 软件测试步骤,8.4.3
20、确认测试 确认测试也称有效性测试,目的是验证软件的有效性,即验证软件的功能、性能及其他特性是否与用户的要求一致。软件需求规格说明书明确规定了软件的功能和性能要求,是确认测试的基础。 1有效性测试 2软件配置审查 3测试和测试 4验收测试 5确认测试结果,35,8.4 软件测试步骤,8.4.4 系统测试 所谓系统测试就是将通过验收测试的软件作为基于整个计算机系统的一个元素,与计算机硬件、外部设备、网络、某些支持软件、数据和人员等其他系统元素结合在一起,在实际使用环境下运行,测试其能否协调工作。系统测试的目的是充分运行系统,验证系统各部件是否都能正常工作并完成所赋予的任务。系统测试的测试用例应根据
21、需求说明书来设计。常见的系统测试主要有以下几方面。(1)恢复测试(2)安全测试(3)强度测试(4)性能测试,36,8.5 软件测试工具简介,1静态分析程序 2动态分析程序 3断言处理程序 4测试数据生成程序 5文件比较程序 6性能测试工具,37,8.6 调试,8.6.1调试的目的和步骤 软件测试的目的是尽可能多地发现程序中的错误,而调试则是在进行了成功的测试后才开始的工作。调试的目的是根据测试时发现的错误,找出错误的原因和具体位置,并改正错误,因此,调试也称为纠错或排错。 8.6.2调试技术1强行排错(1)在程序中插入打印语句(2)运行部分程序(3)借助于调试工具,38,8.6 调试,2回溯法
22、 3归纳法 4演绎法 5对分法8.6.3调试原则1查错原则(1)注重用头脑去分析思考与错误征兆有关的信息。(2)避免用试探法,最多只能把它当做最后手段。(3)只能把调试工具当做辅助手段来使用。,39,8.6 调试,2回溯法 3归纳法 4演绎法 5对分法8.6.3调试原则1查错原则(1)注重用头脑去分析思考与错误征兆有关的信息。(2)避免用试探法,最多只能把它当做最后手段。(3)只能把调试工具当做辅助手段来使用。(4)避开死胡同。,40,8.6 调试,2排错原则(1)注意错误群集现象。(2)注意修改的副作用。(3)修改错误的一个常见失误是只修改了这个错误的征兆或表现,而没有修改错误本身。如果提出
23、的修改不能解释与这个错误有关的全部现象,那就表明只修改了错误的一部分。(4)修改错误的过程将迫使人们暂时回到程序设计阶段。(5)要修改源代码,而不要改变目标代码。,41,8.7 面向对象软件测试概述,面向对象软件的测试可分为四个层次进行:1算法层:测试类的每个服务。2类层:测试封装在同一个类中的所有服务与属性之间的相互作用。3模板层:测试协同工作的类之间的相互作用。4系统层:把各个子系统组装成完整的面向对象软件系统,组装的同时进行测试。,42,8.7 面向对象软件测试概述,8.7.1 面向对象的测试模型面向对象的测试模型是一种在整个软件开发过程中不断测试的测试模型,使开发阶段的测试与编码完成后
24、的单元测试、集成测试、确认测试和系统测试成为一个整体。测试模型如下图所示。,43,8.7 面向对象软件测试概述,8.7.2 面向对象的测试策略面向对象软件测试和传统软件测试一样,也是从单元测试开始,然后经集成测试,最后进入确认测试和系统测试。但是在具体做法上,面向对象软件测试和传统测试策略有许多不同。1面向对象的单元测试2面向对象的集成测试3面向对象的确认测试,44,8.7 面向对象软件测试概述,8.7.3 面向对象软件测试用例设计 测试用例设计的要点如下:(1)每个测试用例都要有一个唯一的标识,并与被测试的一个或几个类相关联。(2)每个测试用例都要陈述测试目的。(3)对每个测试用例都要有相应的测试步骤,包括被测试对象的特定状态、所使用的消息和操作、可能产生的错误及测试需要的外部环境等。,