购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

6.2 等价类划分

6.2.1 测试输入问题

理论上,软件测试就是基于所有可能输入,确定测试数据,检查软件系统能否产生正确的输出,实现系统需求覆盖,确定系统底座,评价系统能力。系统输出及其状态,取决于输入及组合空间。但输入及其组合往往异常复杂,何况还需要对不合法但可能的输入进行测试,输入及其组合构成一个庞大的输入空间。穷举所有输入将耗费巨大的资源,甚至无法实现。导出并对输入集进行分解、重组和综合,重构输入空间,是软件测试的核心任务。等价类划分是解决该问题的重要方法之一。

等价类划分(Equivalence Class Partitioning,ECP)是选择能够代表所有可能输入集合的有限子集,将海量或无限的测试用例减少至最小,实现期望的测试覆盖,这是一种基于输入域划分的测试技术。

在讨论等价类划分之前,首先必须明确等价类的概念及其内涵。等价类就是某个输入域的子集,该子集中各输入数据对于揭示软件系统错误是等价的,测试某个等价类的代表值就等于对这一类的其他值遍历,除非存在子集相互交叉或一个子集同属于另一个子集的情况。将全部输入数据合理地划分为若干个等价类,在每个等价类中选取一个数据作为测试输入,即可用少量代表性测试数据获得期望的测试结果。为避免测试冗余,等价类划分过程中,将输入域划分为互不相交的一组等价类。当然,这种情况只是等价关系的理论存在,工程上并不存在这种情况。这里,用图6-1形象地表示等价类概念、等价类划分及基于等价类划分的测试过程。

图6-1 等价类概念、等价类划分及基于等价类划分的测试过程

理想情况是从所有可能的输入中,找出一个足够小且能够发现最多错误的子集,即使用最少测试数据,达到最好的测试质量。那么,如何确定该子集呢?这就要求将软件系统的输入条件划分为有限数量的等价类,合理地假设每个等价类的代表性数据等同于测试该类输入的其他任何数据。这里,以表6-1所给出的员工考核结果及绩效等级评定标准为例,说明等价类划分的基本方法。

表6-1 员工考核结果及绩效等级评定标准示例

假定考核结果的取值范围为0~100的整数,若员工在考核期内发生质量、安全、保密等一票否决事故,则考核结果为0。基于考核结果的绩效等级评定,共有101种输入。设计101个测试用例,穷举可能的101个输入,是最直接、最简单的方法之一。当然,这也是一种让人无语的方法。如果按绩效评定档次,将程序实现输入划分为[0,59]、[60,70]、[71,90]和[91,100]4个区间,设计如下简单程序时,仅需在每个区间内取任意整数,执行相应语句即可。如取1和取55,执行语句if(score>=0&&score<=59)Level=“不称职”,仅需设计4个测试用例,即可覆盖101个输入。也就是说,在同一区间内,取任意整数值对程序的执行均等价,这就是等价类划分的基本思想。

由上述分析可见,使用等价类划分,将穷举程序输入的101个测试用例大幅减少到4个,在保证同样覆盖率的条件下,测试效率显著提高。

等价的测试用例在于使用最少的测试用例实现相同的测试需求,这就是对测试用例等价的完整解释,也是等价类划分的意义之所在。但需要注意的是,对于同一软件系统,基于不同覆盖目标,可能得到不同的等价类划分结果,此乃基于设计视角的等价类划分。

软件测试过程中,往往无法预知系统状态,对于确定的需求规格,基于测试需求分析,进行合理的等价类划分,有利于低成本的系统行为建模。一般地,控制流图、事件流图、功能思维导图,分别对应于软件行为、用户交互、功能设计等价类。基于控制流图、事件流图、功能思维导图的等价类划分及其与系统过程模型的关系如图6-2所示。

图6-2 基于控制流图、事件流图、功能思维导图的等价类划分及其与系统过程模型的关系

对于智能系统,具有高维输入、低维输出特征,且输入与输出之间大多呈非线性关系,需要重新定义等价类划分的原则和方法。例如,对于深度学习系统,通常基于输入接口类型、功能点及流形分布特征,划分为基于输入数据、基于过程行为和基于输出结果的等价类。

研究等价类划分,至关重要的是对等价关系的深刻理解。等价关系是指定义在集合 A 上满足自反、对称、传递性质的关系。设 R 是定义在集合 A 上的等价关系,与 A 中一个元素 a 有关系的所有元素的集合称为 a 的等价类。即

(6-1)

集合 的关于 的等价类记为 。当只考虑一个关系时,将此等价类记为

【定义6-1】 R 是定义在集合 A 上的等价关系,满足等价关系 R 的等价类构成给定集合 S 的划分,反过来,给定集合 S 的划分 ,存在一个等价关系 R ,它以集合 作为它的等价类。

等价关系 a 具有和任何两个等价类要么相等要么不相交的性质。因此有: X 的所有等价类集合形成 的集合划分,所有 的元素属于一个且唯一的等价类。反之, 的所有划分定义了 上的等价关系。

6.2.2 等价类划分规则

等价类划分时,应仔细甄别每一项软件需求。例如,对于功能需求,不仅要考虑每个功能需求的输入条件,还要考虑每个功能需求的输出条件以及软件行为、用户交互、运行流程、操作使用。与此同时,不仅要考虑有效等价类,还要考虑无效等价类。有效等价类是指对需求规格有意义、合理的输入数据所构成的集合;无效等价类则是对需求规格不合理或无意义的输入数据所构成的集合。使用无效等价类即使用不合理和非预期输入数据进行测试,能够更加有效地检出错误。一般地,等价类划分应遵循如下规则:

(1)若规定了输入值的范围,则可以将其划分为一个有效等价类、两个无效等价类,即将输入值范围内的值划分为一个有效等价类,输入值范围外的左右或上下值各划分一个无效等价类。例如,需求规格规定某输入条件为“1到999”,则可以划分有效等价类为 ,无效等价类分别为:

(2)若输入数据是一组确定值,软件系统对不同输入值进行不同处理,每个允许的输入值是一个有效等价类,任意一个不允许的输入值则为无效等价类。大多数人机界面中,在不考虑需求遗漏的情况下,列表输入数据是有效等价类,未列入的则是无效等价类。

(3)若输入为布尔表达式,则可将其划分为一个有效等价类和一个无效等价类。例如,某系统登录要求密码非空,有效等价类为非空密码,无效等价类为空密码。

(4)若输入数据必须遵循一组规则,则将符合规则的数据划分为一个有效等价类,违反规则的数据划分为一个无效等价类。

(5)若已知某一等价类的各个值在软件系统中的处理方式不同,则应将此等价类划分为粒度更小的等价类。

通常,可以按区间、数值、数值集合、规则、限制条件、处理方式等进行等价类划分。表6-2给出了基于输入条件的等价类划分指南。

表6-2 基于输入条件的等价类划分指南

6.2.3 等价类划分流程

一般地,等价类划分包括如下5个步骤:

(1)确定输入数据的类型即合法类型与非法类型。

(2)确定输入数据的范围、数值、数值集合、规则、限制条件、处理方式,即输入数据的合法区间与非法区间、合法数据与非法数据、合法规则与非法规则等。

(3)画出示意图,区分等价类。

(4)为每个等价类编号。

(5)从一个等价类中选择一个或一组测试数据构造测试用例。

上述等价类划分流程可以概括为两个过程活动:一是按照6.2.2节给定的等价类划分规则合理地进行等价类划分;二是在每个等价类中选取一个或一组输入数据,以此生成测试用例。

对于一个特定的输入域,可以按照等价类划分规则,确定合法数据与非法数据,合法数据的合法区间与非法区间,合法规则与非法规则等。为了区分不同等价类,通常为每个等价类进行唯一编号。等价类划分及其标识如图6-3所示。其中,a、b、c…就是等价类的编号。

图6-3 等价类划分及其标识

一般地,利用有效等价类验证软件系统是否实现了规定的功能、性能等需求。对于具体问题,则至少包括一个无效等价类,以对不合理输入和非预期输入进行测试验证。

假设输入域 a b c 、…为互补相交的子集,有

子集“与”即整个输入域,能够覆盖所有输入。在同一等价类中,将具有相同的处理映射到相同的执行路径,能够产生相同的结果。因此,选择或标识一个测试用例即代表了这一类的测试输入。

对于不同输入类型,需要进行不同的等价类划分。等价类划分时,既要考虑合法/合理的输入,也要考虑非法/不合理的输入。根据等价类划分规则,完成等价类划分,列出等价类表。表6-3给出了一个等价类表参考格式。

表6-3 等价类表参考格式

设计一组测试用例,尽可能覆盖未被覆盖的有效等价类,重复此过程,直至所有有效等价类被覆盖为止。然后,设计一组测试用例,覆盖且仅覆盖一个未被覆盖的无效等价类,重复此过程,直到所有无效等价类被覆盖为止。那么,为什么每次仅覆盖一个无效等价类呢?这是因为某些软件系统对某一输入错误的检测可能屏蔽其他输入错误。

例如,某系统具有使用和训练两种工作模式,两种模式之间的切换时间不大于2秒,若测试用例的输入数据类型为检修且切换时间为3秒,那么该测试用例覆盖“检修”和“切换时间为3秒”两个无效等价类,其工作模式类型和切换时间均无效。为了检测到工作模式的类型错误就不可能检测或判断切换时间是否正确。因此,该测试用例执行无论通过与否,都只能确定一个无效等价类,以检测系统工作模式的正确性。

6.2.4 等价类划分方法

6.2.4.1 连续输入等价类

当输入为连续值域时,将其划分为一个合法等价类和两个非法等价类,其值域范围内的值为合法等价类,值域范围之外的值构成非法等价类。例如,某激光测距设备的测量范围为10~10000米,其等价类划分如图6-4所示。

图6-4 连续值域等价类划分

在该测距设备的测量范围内,5000米就是一个合法输入,9米和10001米则是两个非法输入。

6.2.4.2 离散输入等价类

如果输入是一组确定、连续的离散值,输入值范围内的数就是一个有效等价类,范围之外的数则是无效等价类。离散输入具有一个有效等价类和两个无效等价类。

例如,某动力系统启动试验,包括电启动、冷启动、热启动三个阶段,其中,冷启动是在非负载条件下启动系统,以对相关参数进行校验和修正,确保热启动成功。假设启动试验前,按规程应进行不少于1次、不多于6次冷启动。其合法取值为整数1~6中的任意一个,非法等价类划分时需要选取两个域,分别是一个小于1的域和一个大于6的域。由此,选取0和7。离散型输入等价类划分如图6-5所示。

图6-5 离散型输入等价类划分

6.2.4.3 枚举型输入等价类

当输入为枚举型值时,在合法等价类与非法等价类中各选取一个即可。例如,某软件测试机构,由中心领导、综合管理、市场开发、软件测试、研究开发、技术支持、配置管理、质量保证、样品管理等不同岗位人员构成。这些岗位人员均为合法输入,而工艺人员、文印人员则为非法输入。当然,在条件允许的情况下,可以考虑其他因素选取更多的值进行测试。

6.2.5 基于等价类划分的加法器测试

这里,我们以一个1~100之间的两个整数之和的加法器计算为例,说明基于等价类划分方法。该加法器的实现程序如下。

如果对“计算两个1~100之间整数之和”的程序进行穷举测试,所需测试用例如表6-4所示。

表6-4 基于穷举测试的加法器测试用例

按照穷举测试,对于加数1,有1~100共计100个取值,对于加数2,同样有1~100共计100个取值,以此类推,共有100×100=10000 种组合,Windows平台上的标准型计算器包括0~9共10个数字键以及加、减、乘、除等8个运算符键,假设对于简单的3位数的一次运算(如 a + b =?),其穷举测试用例数为1000×8×1000 个。这还只是测试了正常范围内的取值,如果用户输入的数据不在1~100之间呢?可见,穷举测试工作量巨大。那么,对于上述加法器程序,可以根据输入要求,将输入区域划分为3个等价类即可。加法器等价类划分如图6-6所示。

图6-6 加法器等价类划分

如图6-6所示,将输入域划分为一个有效等价类,即1~100之间的任意整数,以及两个无效等价类,即“<1 ”和“>100 ”的任意整数,并为每个等价类进行编号。然后从每一个等价类中选取一个代表性的数据进行测试,即可覆盖测试输入。基于等价类划分的加法器测试用例如表6-5所示。

表6-5 基于等价类划分的加法器测试用例

读者会发现,上述输入数据都是整数,如果输入的不是整数,而是小数甚至是字母或其他字符,会出现什么样的结果呢?显然,我们虽然关注了输入数据的范围,但并未考虑输入数据的类型,表 6-5所构造的等价类并不完善。因此,应综合考虑输入数据的类型、范围等,进行等价类划分。扩展加法器等价类如图6-7所示。

图6-7 扩展加法器等价类

当用户输入1个加数时,无外乎就是数值和非数值两类,其中数值类包含整数和小数;非数值类则包含字母、特殊字符、空格、空白等。若进一步将整数分为[1,100] 、<1 及>100 三类,根据图6-7,上述所划分的三个等价类仅在整数范围内讨论问题,存在遗漏错误的情况,需要对等价类进行扩展。对每个等价类编号,得到一个有效等价类[1]及7个无效等价类。此时,从每一个等价类中选取一个数据,即可构造如表6-6所示测试用例。

表6-6 等价类划分的扩展加法器测试用例 UDg4VazlDpOh4E3Srdbz2RA5gkd5n6F515RuaY1zcB2pnZ7BvX6lYj0RKB3kVf1U

点击中间区域
呼出菜单
上一章
目录
下一章
×