第六章 软件测试

软件评估可以分为静态评估和动态评估。评审、走查和形式化证明等是静态评估技术,而软件测试是一种常用的动态评估技术,通过执行程序发现其中的错误。

6.1 软件测试目标与软件测试过程模型

6.1.1 软件测试目标

人们关于软件测试目的的认识,大体经历了5个阶段。第一阶段认为软件测试和软件调试没有什么区别;第二阶段认为测试时为了表明软件能正常工作;第三阶段认为测试是为了表明软件不能正常工程;第四阶段认为测试仅是为了将已察觉的错误风险减少到一个可接受的程度;第五阶段认为测试不仅仅是一种行为,而是一种理念,即测试时产生低风险软件的一种训练。
软件测试可定义为:按照特定规程发现软件错误的过程。在IEEE提出的软件工程标准术语中,对软件测试的定义是:“使用人工或自动手段,运行或测定某个系统的过程,其目的是检验它是否满足规定的需求,或清楚了解预期结果与实际结果之间的差异”。

严格地说,错误(Error)是指“与所期望的设计之间的偏差,该偏差可能产生不期望的系统行为或失效”。而失效(Failure)是指“与所规约的系统执行之间的偏差”。失效是系统故障或错误的后果。而故障(Fault)是指“导致错误或失效的不正常的条件”。故障可以是偶然性的或是系统性的。

6.1.2 软件测试的过程模型

软件测试是一个程序的过程,包括测试设计、测试执行以及测试结果比较等。

在软件测试中:

(1)环境模型、被测对象模型和错误模型在软件测试中扮演了一种很重要的角色;这些模型的质量,特别是程序模型的质量,对发现错误具有关键性作用。

(2)软件测试的错误假定是,实际结果与预期结果不符,而后在此基础上可进一步分析是什么错误。

扫描二维码关注公众号,回复: 1126615 查看本文章

6.2 软件测试技术

软件测试技术可分为两大类:一类是白盒测试技术,又称为结构测试技术,典型的是路径测试技术;另一种是黑盒测试技术,又称为功能测试技术,包括事务处理流程技术、状态测试技术、定义域测试技术等。白盒测试技术依据的是程序的逻辑结构,而黑盒测试技术依据的是软件行为的描述。

6.2.1 路径测试技术

由于路径测试技术依据的是程序的逻辑结构,因此该技术的基本要点是:

(1)采用控制流程图来表达被测程序模型,揭示程序中的控制结构。

(2)通过合理选择一组穿过程序的路径,以达到某种测试度量。

1.控制流程图

控制流程图是一种表示程序控制结构的图形化工具,其基本元素时过程块(简称过程)、节点、判定。

过程块是没有被判定和(或)被分开的一组程序语句。

判定是一个程序点,此处控制流出现分叉。

节点也是一个程序点,此处控制流进行结合。

链是过程块、判定、节点之间一种具有特定语义的关系,其中的语义是通过它们的执行而体现出来的。

2.测试策略

(1)路径覆盖(PX)。执行所有可能穿过程序控制流程的路径。一般情况下,这一测试严格地限制为所有可能的入口/出口路径。在路径测试中,该度量是最强的,一般是不可实现的。

(2)语句覆盖(P1)。至少执行程序中所有语句一次。如果遵循这一规定,则达到了100%的语句覆盖率(用C1表达)。

(3)分支覆盖(P2)。至少将程序中的每一个分支执行一次。如果遵循这一规定,则达到了100%分支覆盖率(用C2表达)。

(4)条件覆盖与条件组合覆盖。

条件覆盖是指每个判定中的所有可能条件的取值至少执行一次。如果遵循这一规定,则实现了条件覆盖。

条件组合覆盖是指涉及足够的测试用例,使每个判定中的所有可能的条件取值组合至少执行一次。

3.路径选取与用例设计

IEEE单元测试标准中,最小的强制性测试需求是语句覆盖率。

在路径选取上,其一般原则是:

1)选择最简单的、具有一定功能含义的入口/出口路径。

2)在已选取的基础上,选取无循环的路径;选取短路径、简单路径。

3)选取没有明显功能含义的路径,此时要研究这样的路径为什么存在,为什么没有通过功能上合理的路径得到覆盖。

在实际测试中,对循环结构中的路径选取,由于其中路径的不确定性,因此一般需要特殊处理。循环结构可分为单循环、嵌套循环、级联循环和混杂循环。由于循环结构的错误容易发生在控制变量的边界上,因此应针对不同类型的循环给出相应的路径选取规则。

(1)单循环

(2)嵌套循环

(3)级联循环。如果在退出某个循环以后到达另一个循环,且还在同一入口/出口路径上,则称这两级循环是级联的。

关于级联循环,其路径选取可以采用以下原则:

1)如果级联循环中每个循环的控制变量有关,则可视为嵌套循环。

2)如果级联循环中每个循环的控制变量无关,则可视为单循环。

6.2.2 基于事务流的测试技术

基于事务流的测试技术是一种功能测试技术,以下简称事务流测试技术。目前,提出了很多功能测试技术,如定义域测试技术、等价类测试技术以及基于因果图的测试技术等,统称为黑盒测试技术。黑盒测试将被测软件看成黑盒子,只通过外部的输入输出来发现软件中的错误,因此黑盒测试是一种基于软件规约的测试。

1.事务与事务流程图

在事务流测试技术中,采用事务流程图作为表达被测软件模型的工具。

其中有操作、分支、节点和链。

一个事务是指从系统用户的角度出发所见到的一个工作单元,有其“生”,有其“亡”。

6.2.3 其他功能测试技术简述

黑盒测试完全不考虑程序的内部结构,而对软件功能规约或用户手册所列的功能以及与功能相关的性能进行测试,包括对正常和异常的输入(或操作)、出错处理、边界情况合极端情况等进行测试。

1.等价类划分

等价类划分方法是把软件所有可能的输入数据,即软件的输入域划分成若干部分,形成一些等价类,即在一个部分中各个输入数据对于发现软件中的错误的概率是一样的,然后每一部分中选取数据作为测试用例,进行软件测试。

划分等价类的方法是根据每个输入,找出两个或更多的等价类并将其列表。

(1)划分等价类。对于等价类划分,人们从实践角度,经常从有效和无效的角度对输入数据进行等价类划分。

有效类是值对于程序的规格说明来说,是合理的、有意义的输入数据集合。利用它,可以检验程序是否实现了规格说明预先规定的功能和性能。

无效等价类是指对于程序规格说明来说,是不合理的、无意义的输入数据集合。这一类测试用例主要用于检查程序中功能和性能的实现是否不符合规格说明的要求。

(2)设计测试用例。在确立了等价类之后,建立等价类表,并列出所有划分出的等价类。

2.边界值分析

边界值分析是一种常用的黑盒测试技术。测试工作经验表明,大量错误经常发生在输入或输出范围的边界上。因此,使用等于、小于或大于边界值的数据对程序进行测试,发现错误的概率较大。因此,在设计测试用例时应选择一些边界值,这就是边界值分析测试技术的基本思想。

边界值分析与等价类划分技术的区别在于:边界值分析着重与边界的测试,应选择等于、刚刚大于或刚刚小于边界的值作为测试数据;而等价类划分是选取等价类中的典型值或任意值作为测试数据。

3.因果图

因果图是设计测试用例的一种工具,它着重检查各种输入条件的组合。而前面介绍的等价类和边界值分析,由于没有考虑输入条件组合的情况,所以都不能发现这类错误。

要检查输入条件的组合,应首先把所有输入条件划分成等价类,他们之间的组合情况也相当多。而通过因果图,可以把用自然语言描述的功能说明转换为判定表,最后利用判定表来检查程序输入条件的各种组合情况。

因果图测试技术是通过为判定表的每一列设计一个测试用例,从而实现测试用例的设计与选择的。

6.3 软件测试步骤

6.3.1 单元测试

单元测试主要检验软件设计的最小单元——模块。该测试以详细设计文档为指导,测试模块内的重要控制路径。一般来说,单元测试往往采用白盒测试技术。

6.3.2 集成测试

集成测试是软件组装的一个系统化技术,其目标是发现与接口有关的错误,将经过单元测试的模块构成一个满足设计要求的软件结构。

集成测试可“自顶向下”地进行,称为自顶向下的集成测试;也可以“自底向上”地进行,称为自底向上的集成测试。

一般来说,集成测试是以主控模块作为测试驱动模块,设计承接模块替代其直接的下属模块,依据所选取的测试方式(先深度或先宽度),在组合模块时进行测试。每当组合一个模块时,要进行回归测试,即对以前的组合进行测试,以保证不引入新的错误。

自顶向下和自底向上的集成测试均有缺点。自顶向下的主要缺点是需要设计承接模块以及随之而带来的困难。自底向上的主要缺点是只有在加上最后一个模块时,程序才作为一个实体而存在。在实际的集成测试中,应根据被测软件的特性以及工程进度,选取集成测试方法。一般来说,综合地运用这两种方法,即在软件的较高层使用自顶向下的方法,而在低层使用自底向上的方法,可能是一种最好的选择方案。

6.3.3 有效性测试

有效性测试的目标是发现软件实现的功能与需求规格说明书不一致的错误。因此,有效性测试通常采用黑盒技术。为了实现有效性测试,制订的测试计划应根据采用的测试技术给出要进行的一组测试,并给出测试用例和预期结果的设计。

6.4 本章小结

软件测试不但在开发中使用,而且在验证和确认的动态分析中也经常使用。动态分析是指执行程序的分析,测试为动态分析提供了必要的信息 。

猜你喜欢

转载自bsr1983.iteye.com/blog/1231112