1.4 软件测试的基本原理
软件测试的本质是针对需要测试的内容设计输入、观察输出,进而判断需要测试的内容是否出错的过程。
可用一个简单的原理图(如图1-9所示)来表示。
输入实际上有两种类型:先决条件(规格说明、在测试用例执行之前已经存在的环境、测试的前提、输入文件等)和由某种测试方法所设计的输入。
输出也包含两类:输出和输出结果的判定条件。
从这方面来看,任何测试都可以归结为将输入定义域取值映射到输出值域的一个函数。而测试最关注的是行为,行为与软件或者系统中常见的结构视图无关。其中最明显的差别是,结构视图更关注“是什么”,而行为视图关注的是“做什么”。在软件的生命周期上看,基本文档通常都是由开发人员编写并且针对开发人员的,因此这些文档强调的是结构信息,而不是行为信息。
图1-9 测试原理图
本节使用一种简单的维恩图,以澄清有关测试的问题。考虑一个程序行为全域(关注测试的本质问题),给定一段程序及其规格说明,集合S是所描述的行为,集合P是用程序实现的行为。
根据测试的基本原理,图1-10给出了规格说明和程序行为之间的关系。规格说明中所有可能的程序行为都位于标有S的圆圈内,所有实际执行的程序行为都位于标有P的圆圈内。通过这张图,我们可以更清晰地看出测试人员所面临的问题。S和P相交的部分(橄榄球形区域)是“正确”部分,即既被描述又被执行的行为(有一种关于测试的观点是,测试就是确定既被描述又被实现的程序行为的范围)。另外,这里的“正确”是指在特定规格说明和实现背景下的意义,是一种相对意义上的正确。
图1-10 描述与实现的程序行为
上面简要介绍了软件测试的本质,从更通俗的意义上看,软件测试就是为了发现程序中的错误而分析或执行程序的过程。为将规格说明细化至可以用于执行的测试过程,其中最为重要的一个环节就是设计测试用例。
测试用例(test case)是分析程序或根据软件开发各阶段的规格说明和程序的内部结构,精心设计出一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实程序是否满足某个特定需求,针对测试用例来执行相应的程序,可以更有效地发现程序中的错误。测试用例有一个标识,并与程序行为有关,通常而言,测试用例还有一组输入和一个预期的输出表。
根据ISO/IEC/IEEE 29119中的定义,测试用例由先决条件、输入、预期输出构成,用于驱动测试项目的执行,以满足测试目标,如功能的正确实现、错误识别、质量检查和其他有价值的信息。
(1)先决条件
测试用例的先决条件包括测试环境、现有数据(如数据库)、被测件及其测试项、测试工具以及硬件等。
(2)输入
输入是用来驱动测试执行的数据信息,在必要的情况下,输入也可以包含测试的具体步骤。
(3)预期输出
在预期输出中,不仅包含一个输出结果,还需要包括判定准则,用于在之后的执行中判断测试是否成功,在嵌入式测试中,预期输出多为一个阈值范围,用于检测测试是否通过。
测试显然要处理错误、缺陷、失效和事故,测试有两个显著的目标:找出软件缺陷或演示正确的执行。因此,在设计测试时必然要考虑软件缺陷的表现形式,常见的软件缺陷列举如下:
1)运行出错,包括运行中断、系统崩溃、界面混乱。
2)数据计算错误,导致结果不正确。
3)功能、特性没有实现或部分实现。
4)在某种特定条件下没能给出正确或准确的结果。
5)计算的结果没有满足所需要的精度。
6)用户界面不美观,如文字显示不对齐、字体大小不一致等。
7)需求规格说明书(Requirement Specification或Functional Specification)的问题,如漏掉某个需求、表达不清楚或前后矛盾等。
8)设计不合理,存在缺陷。如玩计算机游戏时只能用键盘而不能用鼠标。
9)实际结果与预期结果不一致。
10)用户不能接受的其他问题,如存取时间过长、操作不方便等。