qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

关于统一等价类划分的术语和过程

关于统一等价类划分的术语和过程
    等价类划分是很重要的软件测试设计技术之一。重要到几乎每一个测试员都要用到这项技术,他们中的一些人甚至还没有意识到被这他们称为 “常识”的实际上是一项正式的技术。
但不知何故,作为一个测试团队,我们就等价类划分的过程这一点上似乎无法达成一致意见。甚至连它的术语都意见不一。划分和类是同一回事吗?等级划分的有效和无效意味着什么?当我们了解什么是类之后,又该如何把它运用到测试用例中呢?我们需要输出划分吗?在这篇文章里,我会提出一个关于统一等价类划分的术语的建议,并努力找出一个单一的方法来得到测试用例。我汇总了许多测试专家的知识见解并且找出其中的共同点,努力做到不遭到一丝质疑地去除这些不统一。

来源
    参考咨询了多方来源,我汇集了关于等价类划分技术的信息,大多数作者都偏向Glenford Myers [1]和Boris Beizer [2]的观点。并不是所有的关于等价类划分技术的信息来源都描述了整个过程,也不是所有的都描述了同一个过程。最实用的关于怎样运用这项技术的信息是由Erik van Veenendaal [6]和Edward Kit [3]所描述的。

术语
零星碎片
    在等价类划分里,我们取输入一个电脑程序的内容,把它切成零星碎片,这本应由该程序自己以同样的方法处理的。
不同的来源里用不同的术语来描述这些碎片:
· Myers [1]认为: “等价类划分是通过考虑了每一种输入条件...确认的,并把它分成两至更多份以上。
· Black [9]:“等价类,也叫做等价分区。”
· Van Veenendaal [6]:“......等价类或者划分区......”
· De Grood [10]:“......有效和无效的等价类别......”
让我们看一看关于“划分”的专业术语的准确的起源“set theory”。我是找不到我的旧教科书来看了,但是我可以参考维基百科,它是这样写的:“集合S的一个划分P是两两不相交的非空子集,使得∪P = S。”,“集合S的任意一个分区P给S引入了一个等价关系,其中每个A∈P是就一个等价类。同样地,给S引入一个等价关系,不同的等价类的集合就是S的分区。”
我提议回归最初,坚持在set theory中使用的准确的术语。
从上面的准确的术语,我们学到了以下(下面是用简单明了英语改写了):
·划分是把东西切碎。
·某物被切成零星碎片的方法就被称为划分。
·这些零星碎片被称作类

    所以当我确定了整数1到10有两种划分时就意味着我可以用两种方法把它们切碎,也就是,奇数和偶数(这是第一种划分)或者质数和非质数(这是第二种)。把小于5的数和大于等于5的数分开会生成由两个类构成的第三种划分。

有效和无效
    一旦一个程序的输入范围被划分成等价类,我们就不得不在我们可以把它们与测试用例结合起来之前决出这些类里面哪些是有效的哪些是无效的。但是我们怎么定义“有效”?
· Black [9]:“...有效类...描述有效的情况,系统需要正常处理...”
· Van Veenendaal [6]:“等价类划分下的无效数据并不是说这个数据是错误的;而是指这个数据不在具体的划分范围之内。”
· Burnstein [7]:“…有效类…描述系统可以正常处理…的情况。”
· Van Veenendaal [6]:“无效类表示输入错误或异常”
别人告诉过我:一个类,当程序不指定输入来自该类时,它被认为是无效类。但是要是指定行为是一个错误信息,又该怎么办?D.J. de Grood [10] 说:“…并不是一个无效值,因为这次输入的错误处理已被具体…”。
我建议采纳和适应用于分类树方法中的定义。“有效类描述被测试对象有条不紊地处理的输入情况。无效类应该被测试对象引发错误处理反映。”这段引述的大部分都是和原文一样的,我加了一个词“应该”来覆盖错误处理机制(还)不到位的情况,我还用“类”替代了Grochtmann [4]原话中的“测试用例”。

食谱
切片和切块
    现在大家都清楚了什么是划分(划分的过程),什么是类(划分结果)了,但还不明白输入域是如何被划分的。Van Veenendaal [6] 和Kit [3]就所有输入和通常它们是如何被划分做出了详细准确的概括。但是划分是一个测试员的工作吗?划分的基础已经在测试员要求之中了。例:“6岁以下的儿童在至少一位家长的陪伴下可免费进入”。就是按儿童的年龄和陪同者的人数划分免费的部分人群。但是我们必须确保顾客即要求工程师和软件开发员都以同样的方式来理解它。

结合类
    现在我们已经解释清楚了术语,我希望你们同意我做出的选择,我们来说说结合类吧。
等价类划分中所提到的来源中有许多的观点,所以再一次的,我们不得不作选择。
    首先让我们来看看软件构件测试的标准– BS 7925-2 [5]。这个标准给我们提供了自由, “在生成测试用例时,可以采取两种截然不同的方法。用第一种方法,一个测试用例在一对一的基础上生成每一个确定的划分区。用第二种方法,一组最小的测试用例生成并覆盖了所有确定的划分区。”请注意这句话中的“划分区”一词,我是提议用“类”的。
    大多数来源生成了覆盖所有有效类的一组最小的测试用例。接下来看看Myers的方法:“写一个测试用例,这个用例只覆盖不被覆盖的无效等价类之中的一个。”直到所有无效类都被覆盖。不把多个无效输入结合到一个测试用例中的理由Myers清楚地说明了,Kit and Veenendaal也这样解释到:“如果多个无效EC在同一个用例中被测试出来,一些测试可能无法执行,因为第一个测试可能会掩盖其他测试或者终止执行测试用例。”但是一些人([6], [9])提出一个单一的,完全无效的测试用例可能是有用的。尤其是在Web应用程序中,输入数据在被发送到服务器前经常先进入一个表格检查其有效性。让我为您展示以下几种结合类的菜单:
选择1—低脂餐
· 开胃小吃:一组最小的覆盖所有有效类的测试用例
· 主菜:一组最小的覆盖所有无效类的测试用例
· 饭后甜点:抱歉,没有甜点

选择2—常规餐
· 开胃小吃:一组最小的覆盖所有有效类的测试用例
· 主菜:一组测试用例,其中每一个用例每次只覆盖一个单一的无效类,除非所有的无效类都被覆盖(提供)了
· 饭后甜点:抱歉,没有甜点

选择3—丰盛餐
· 开胃小吃:一组最小的覆盖所有有效类的测试用例
· 主菜:一组测试用例,其中每一个用例每次只覆盖一个单一的无效类,除非所有的无效类都被覆盖(提供)了
· 饭后甜点:一个只覆盖最好的无效类的单一测试用例

选择4—(几乎)所有你能吃的
· 开胃小吃:一组最小的覆盖所有有效类的测试用例
· 主菜:一组测试用例,其中每一个用例每次只覆盖一个单一的无效类,除非所有的无效类都被覆盖(提供)了
· 饭后甜点:一组最小的覆盖覆盖所有无效类的完全无效的测试用例
· 额外: 给极度饥饿的人,我们提供了精心挑选的覆盖所有输出类的额外的测试用例组合套餐

    我们该如何选择呢?这个取决于我们对于测试之下的主题所知道什么。
    在低风险的情况下,你不是很饿的话,一组最小的测试用例或许是最好的选择。像上面的网站的例子,如果我们知道该软件是用来在开始一次计算前检查在表单中的字段中所输入的每个值的话,那么明智的做法就是添加额外的完全无效的测试案例。
    在高风险的情况下,我们想要确保每一个无效类被识别为无效并被视作无效来对待。所以我们至少需要一份不错的常规餐或者“所有你能吃的”。
但是额外呢?输出划分是有营养的一部分还是它只是让你发胖的部分呢?
另外,它还取决于实际情况和测试目标,当你在测试一个将输入转化为输出的模块(这经常发生),接着,该输出被用作另一个模块的输入时,知道是否所有的可能输出会因为正确的理由被接受或拒绝可能是相当有价值的。
    事实上,我们在这儿讲的是集成测试。为了执行一个这样的测试,必须生成接受模块的所有的可能输入类。因此,我们需要全面了解调用模块的输出。调用模块的范围必须符合被调用模块的域。正如Beizer所说:“…调用者的范围就是调用者对被调例程域的概念…”我们想证明这个观念是正确的。

posted on 2014-05-08 16:41 顺其自然EVO 阅读(239) 评论(0)  编辑  收藏 所属分类: 测试学习专栏


只有注册用户登录后才能发表评论。


网站导航:
 
<2014年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜