|
|
|
|
移动端

2.3.2 关系与等价类划分

《软件测试基础教程》第1章软件测试的基本知识,本章作为一个导引,其目的在于让读者熟悉与软件测试相关的基本概念,建立起全书的框架。在本书后续章节中将要详细阐述的问题,首先在这里被提了出来。读完这章之后,读者就能够在软件测试和软件质量方面提出一些有意义的问题。本节为大家介绍关系与等价类划分。

作者:王峰/郭长国/陈振华 等译来源:机械工业出版社|2011-09-17 21:23

技术沙龙 | 6月30日与多位专家探讨技术高速发展下如何应对运维新挑战!


2.3.2 关系与等价类划分

在集合论中,关系指的是一个n元组的集合。例如,方法addList计算并返回一个整数列表之和,因此,addList就定义了一个二元关系。该关系中的任何一个二元组都是由一个整数列表与该列表各整数之和组成,如((1,5),6),((-3,14,3),14),(( ),0)等。addList所对应的关系可以定义如下形式:

addList : L→Z

其中,L是包含所有整数列表的集合,是整数集。由前面的例子我们可以认为,每个软件、程序或方法都定义了一个关系。事实上,只要定义域(即输入集合)和值域(即输出集合)定义正确的话,这个结论是成立的。

例如,假设方法addList存在一个缺陷,即当输入的整数列表为空时方法失效。在这种情况下,即使按照需求规范,方法addList定义了上一个关系L→,它也不能正常地运行。它实际定义的关系如下:

addList : L→Z∪{error}

在划分软件的输入域时,测试人员常常采用下面的关系:

R : I→I

其中,I为输入域,R为I上的关系,R定义了一个等价类,该等价类是I的子集。下面的例子说明在输入域上定义R的几种方法。

例2.3方法gPrice以食品杂货店的食品名称作为输入,查询商品价格数据库并返回相应食品的单价。如果数据库中没有该食品,则返回错误信息:

Price information not available.

gPrice的输入域由string类型的食品名称构成,如Milk、Tomato、Yogurt、Cauliflower,当然还有很多别的食品。在这个例子中,假设还存在另一个方法来完成对价格数据库的访问。在gPrice的输入域上定义如下关系:

pFound : →

关系pFound将食品t1与t2关联起来,如果gPrice都为它们返回单价信息的话;pFound将食品t3与t4关联起来,只要gPrice都为它们返回错误提示信息。现在假设价格数据库为下表所示:

 

Milk、Tomato、Kellog Cornflakes通过关系pFound相互关联,输入3种食品中的任一个,gPrice都能返回相应食品的单价。然而,输入Cauliflower或者其他在上面列表中不存在的食品名称时,gPrice返回错误提示信息。任意构造的不是食品名称的字符串都属于pFound所定义的另一个等价类。

数据库中的任意食品都可以作为等价类的代表元素。例如,Milk可以作为等价类的代表,记为[Milk],而Cauliflower是另一个等价类的代表,记为[Cauliflower]。

这样,关系pFound就定义出了等价类,分别是pF和pNF。这两个等价类都是gPrice输入域I的子集,同时,二者形成了对输入域I的一个划分,有pF∪pNF=I和pF∩pNF=。

在上面的例子中,程序的输入是一些离散值,如Milk、Tomato。进一步,我们假设对于所有有效的输入值,gPrice运行方式相同。在很多情况下,被测程序的运行方式依赖于具体的输入值,而这些输入值又分为若干类,其中大部分是有效的。下面的例子说明在这种情况下,可以通过定义多个关系来构造等价类。

例2.4打印机自动测试软件pTest以打印机品牌和打印机型号作为输入,从测试脚本列表中选取相应的测试脚本,然后执行测试脚本,验证打印机的功能是否正常。我们的测试目的在于验证该软件中的脚本选择部分是否被正确实现。

pTest的输入域I由表示打印机品牌、型号的字符串构成。若pTest以键盘输入文本的方式选取打印机,则那些虽不是打印机品牌或型号但能被pTest识别的字符串也都属于I。若pTest以图形用户界面方式选取打印机,则下拉菜单中提供的所有字符串构成完整的输入域I。

该软件根据输入的打印机类型来选择相应的测试脚本。简单起见,假设有3种类型的打印机:彩色喷墨打印机(ci)、彩色激光打印机(cl)、彩色多功能打印机(cm)。那么,如果输入为HP Deskjet 6840,pTest将选取测试彩色喷墨打印机的测试脚本。pTest的输入域是包含所有可能输入字符串的集合,集合既包含有效打印机名称也包含无效打印机名称。有效打印机名称是指存在于数据库中、并能通过pTest软件返回与其对应的测试脚本的输入名称,而数据库中不存在的都是无效打印机名称。

在本例中,我们在pTest的输入域上定义以下4个关系。其中,前三个关系分别对应于3种不同种类的打印机,第四个关系对应输入为无效打印机名称的情况。

ci : I→I

cl : I→I

cm : I→I

invP : I→I

以上关系分别定义了一个等价类划分。例如,关系cl将所有彩色激光打印机划分为一个等价类,而将其他打印机划分为另一个等价类。这样,每个关系分别定义了两个等价类,4个关系共定义了8个等价类。也就是说,虽然每个关系都将pTest的输入域划分为两个等价类,但这8个等价类是有重叠的。注意,当pTest以图形用户界面方式提供打印机列表供选择时,关系invP为空。

可以更为简单地定义一个等价关系pCat,根据ci、cl、cm、invP 4个类别将pTest的输入域划分为4个等价类。

上面的例子说明,由于有等价类重叠,等价类并不总能构成对输入域的一个划分。在这种重叠情况下的测试设计将在下一节论述。

以上两个例子都描述了如何根据软件需求进行等价类划分。在有些情况下,测试人员能够同时获得软件需求和软件源代码,下面的例子将阐述基于软件需求和软件源代码进行等价类划分的相关内容。

例2.5设wordCount方法以单词w和文件名f作为输入,返回单词w在文件f所包含的文本中的出现次数;如果文件名为f的文件不存在,则产生异常。利用前文所描述的等价类划分方法,可以获得如下等价类:

E1:包含所有二元组(w,f),其中w为字符串,f为有效文件名。

E2:包含所有二元组(w,f),其中w为字符串,f为无效文件名。

现在,假设测试人员能够见到wordCount的代码,部分伪代码如下:

程序P2.1

 
上面的代码包含3个if语句,共形成8条不同的路径。但是,由于每个if语句都有可能终止该程序,因此,实际上该程序只有6条可能的路径。定义一个关系covers,该关系根据6条可能的路径,将wordCount的输入域划分为6个等价类,如下表所示:
 

通过该程序可以知道,在没有任何代码的情况下等价类的数量是2,而当有部分程序源代码时,等价类的数量是6。当然,在没有获得程序源代码的情况下,有经验的软件测试人员往往也能够划分出6个甚至更多的等价类(参见练习2.6)。

在前面的每个例子中,都将重点集中在如何从输入导出等价关系进而获得等价类上。在某些情况下,也可以从程序输出导出等价类。例如,假设某程序输出一个整数,我们不禁会问“程序会输出0么?”“程序输出的最大值是多少,最小值又是多少?”根据这两个问题,可以得到如下基于程序输出的等价类:

E1:输出值v为0

E2:输出值v为最大值

E3:输出值v为最小值

E4:所有其他输出值

得到输出等价类后,可进一步得到与之对应的输入等价类。对于上面给出的E1~E4这4个等价类,可以分别形成与之对应的输入等价类。因此,当通过分析软件输入和软件需求无法获得输入域的等价类时,这种基于输出的分析方法将是行之有效的手段。

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

程序员教程(第2版)

本书按照人事部、信息产业部全国计算机技术与软件专业技术资格(水平)考试程序员考试大纲编写,是对2004版的修订版,内容包括计算机系统、...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊