等价类分法 新解

2024-01-18 03:38
文章标签 新解 等价 类分法

本文主要是介绍等价类分法 新解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3.1            等价类分法
3.1.1       等价类分法的基本概念
 
相关文章链接如下:
  • 微软过桥问题与测试人员素养
  • 测试用例设计中的NP难题
  • C/C++代码检视实例
  • 90%程序员写不出无BUG的二分查找程序?
等价类分法是将测试空间划分成若干个子集,并且满足每个子集中的任一数据对揭露程序中的缺陷都是等价的,这些子集就叫做等价类或者叫等价子集。
比如一个程序的输入数据满足 0 <100 为有效数据,其他为无效数据,那么就可以划分成两个等价类,一个是有效数据的等价类,另一个是无效数据的等价类,设计测试用例时就可以从这两个等价类中分别取一个输入数据来得到两个测试用例。有效数据的等价类为1~99,所以可以从1~99中任意取一个数作为输入数据来作为一个测试用例,从x不等于1~99中的数据中任意取一个数据作为输入数据得到另一个测试用例。
1~99中的任一数据和其他数据都是等价的,比如使用了2来进行测试,那么可以假定数据2测试通过的话,1~99中的其他数据也能测试通过。
等价类分法可以用来对一些不能穷举的集合进行合理分类,从各个等价类中选出有代表性的数据进行测试,从而保证设计出来的设计用例具有一定的代表性和一定范围内的完整性,有效地缩减测试用例的数量。
等价类实际上是符合测试空间划分原则的一种特殊划分形式,即划分完后的子集里的可测数据是等价的,而测试空间划分原则则是要求里面有一个可测数据测试通过能够代表其他测试数据在满足选取概率条件下也都可以通过。等价类选取测试数据时可以选取等价类中的任意数据作为测试数据,而测试空间划分原则划分的子集一般是选择指定的数据作为测试数据,如果按测试空间划分原则划分后的子集刚好成为了等价类才可以选择里面的任一数据作为测试数据。
3.1.2       等价类的几种类型
在现实情况中,由于缺陷的可能情况非常多,一个子集中的数据对某种缺陷是等价的,但对另外一种缺陷可能又是不等价的。所以把等价类分为弱等价类、强等价类、理想等价类三种类型。
1、 弱等价类
弱等价类是考虑某个单一缺陷情况下的等价情况,子集里所有数据在这种缺陷假设下是等价的,并且划分成的几个等价类能够覆盖整个测试空间的单一缺陷。比如以下一段程序:
void Func(unsigned int x)
{
if ( x > 10 )
{
Func1();
else
{
Func2();
}
}
我们可以将数据划分为两个等价类,0~10为1个等价类,大于10的数据为1个等价类,在考虑“>”号误写成“<”号这种缺陷的情况下,这两个等价集中的数据都是等价的,比如0~10这个等价类中,使用0或使用10来进行测试都能发现缺陷。这两个等价类中各自抽取一个测试数据进行测试,都能代表其他数据揭示出“>”号误写成“<”号这种缺陷来,因此整个测试空间都被覆盖了。
2、  强等价类
强等价类是在多个缺陷假设前提下,各个等价类中的可测数据在单个或多个缺陷假设下是等价的,并且划分的各个等价子集中各自取一个测试数据可以覆盖整个测试空间的多个缺陷情况。
再考虑前面弱等价类中的例子程序,出错的可能性有那些呢?除了大于号会错写成小于号外,实际上还有可能写成大于等于号,10有可能写成1或100等大于10或小于10的数,为方便描述以错写成1和100为例,事实上错误成其他数和错写成1和100是等价的。这样将各种可能出错的情况组合起来,程序中的判断条件有可能有以下12种情况:
判断条件
揭示缺陷的等价类
判断条件
揭示缺陷的等价类
判断条件
揭示缺陷的等价类
x>10
x>1
{10}
x>100
{11}
x<10
{>10}
x<1
{>10}
x<100
{0~9},{10}
x<=10
{10},{>10}
x<=1
{>10}
x<=100
{0~9},{10}
x>=10
{10}
x>=1
{10}
x>=100
{11}
考虑0~10这个集合,在误写成中间一列条件中情况下,里面的数据并不等价,比如误写成x>1的情况下,使用1做测试和使用2做测试揭示缺陷是不同的,使用1做测试发现不了缺陷,但使用2测试就能发现缺陷。
在判断条件误写成x>=10条件下,10和0~9中的任一数据也不等价,并且使用大于10的数据也无法揭示出条件错写成x>=10这个缺陷,因此整个测试空间的多个缺陷无法被已划分的两个等价类来覆盖,10需要单独划分成一个等价类。
这样将数据划分成三个等价类{0~9}、{10}、{大于10的数据},再看看这三个等价类是否可以覆盖表中各种出错情况,显然在x>100和x>=100两种情况下,大于10的数据集合中的数据是不等价的,使用大于100的数据不能揭示出缺陷,但使用大于10小于100的数据却能揭示出缺陷,因此需要对大于10的数据再划分等价类,实际上只要将边界值{11}划一个单独的等价类就可以了。
这样总共得到四个等价类{0~9}、{10}、{11}、{大于11的数据},从这四个等价类中各取一个数据的话就可以将以上列出的所有可能的缺陷情况都揭示出来,但是各个等价类并不是对所有缺陷都等价的,这种划分的等价类由于可以将各种缺陷情况覆盖到,把它叫叫做强等价类。
3、  理想等价类
这种等价类是严格按照等价类的定义来划分的,即划分的各个等价类中,每个等价类都满足每个可测数据对揭示所有可能的缺陷都是等价的,并且划分的各个等价类中各自任意取一个可测数据做为测试数据可以将全部的缺陷都揭示出来。
理想等价类在实际情况中是很罕见的,除非只有很少的一两种可能的出错情况,否则很难划分成对揭示所有可能缺陷都等价的子集。所以在实际使用时,没有必要去寻找理想等价类,否则徒然浪费时间,一般采用强等价类或弱等价类进行测试就足够了。
3.1.3       等价类的判定方法
当将一个输入域进行等价类划分后,划分出来的子集是否是等价的基本上靠经验判断,这给使用等价类分法带来很大的难度,凭经验划分出来的等价类也许并不是真的等价类,如何才能确定划分的类是等价类呢?
按照前面讲过的弱等价类与强等价类的定义,要知道划分的子集是否等价类先要知道又那些种类的可能缺陷,然后将划分的等价类对照可能的缺陷进行验证看是否能揭示出那些可能发生的缺陷。
这种判定方法的缺点是必须先知道会发生那些可能的缺陷,实际情况中往往并不知道所有可能的缺陷,那么在实际情况中如何采取一些简单方法来判定一个子集是否是等价类呢?
当一个子集的处理过程与输出完全一致时,基本上可以认为是等价类,处理过程是否相同很容易从需求和设计中得出。但是现实情况中往往同一个等价类中的不同数据对应的输出结果并不相同,所以这种方法并不能对所有的情况都适用。
其实没有什么特别好的办法可以用来判断一个子集中的任一数据对揭露程序中的缺陷都是等价的,除非将所有数据测试一遍。但是有一些条件可以协助判断出某个子集不是等价类。
1、 路径判定法
最容易判定一个子集是否是等价类的方法就是路径判定法, 路径判定法的基本思想是:对于子集中的任一数据,如果执行路径并不完全相同,那么这个子集不是等价类。
需要注意的是,路径判定法的反命题并不成立,即不能由执行路径相同就推断出子集中的数据是等价类。因为执行路径相同情况下得到的结果不一定相同,举例如下:
int mul(int a)
{
return (a*10000);
}
在mul()函数中,不论a输入多少,执行路径都只有一条,但是当a超过一定大小时,会出现整数乘法溢出,显然不能将a的任意取值都作为等价类。
路径相同之所以不能认为是等价类的根本原因在于程序设计中本身可能存在缺陷和遗漏,设计或编码后的程序中的路径本身就可能不正确,测试用例设计时不能假定程序中的路径一定是正确的。
2、 概率判定法
概率判定法是通过计算等价子集中的数据揭示某个缺陷的概率来进行判断的方法。如果在一个等价子集中,所有数据的揭示缺陷的概率不相同并有一定差距,那么可以认为不是等价类。
这个判定法的使用并不是说事先需要知道所有可能发生的缺陷,它只需要找到一个缺陷来证明在这种缺陷情况下,子集中的数据在揭示这个缺陷方面的概率是不相同的,那么就可以认为在这种缺陷条件下不是等价类,至少可以认为不是强等价类。
比如前面讲的x>10的划分,{0~10}这个集合中,在写成x>=10的情况下,10和子集中其他数据揭示缺陷的概率是不同的,0~9都不能发现缺陷,测试会通过,也就是说揭示出这个缺陷的概率为0,而10则能揭示出这个缺陷,所以它们不能划分到同一个等价类里面。
 


这篇关于等价类分法 新解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617994

相关文章

原码、反码、补码新解

世界上有10中人,一种懂二进制,一种不懂二进制。我们习惯了十进制计数,乍看到二进制,有点别扭,认识后慢慢发现它的神奇:有点一生二,二生万物的意思。十进制和二进制的部分对应关系如下: 小范围的十进制运算,我们操练起来麻麻溜溜的,二进制的运算相信你也不差,然,碰到十进制转二进制的运算就有点蒙圈了。 计算机 CPU 的运算器只实现了加法器,没有实现减法器。但,我们可以通过加上一个负数来实现减法运

软件测试方法之等价类测试

软件测试方法中的等价类测试是一种重要的黑盒测试技术,它主要用于处理有大量输入数据的测试场景。以下是关于等价类测试的详细解释: 一、定义与基本概念 等价类测试是指将输入域(即输入数据的集合)划分为若干个互不相交的子集(即等价类),每个子集中的数据对于揭露程序中的错误都是等效的。因此,可以从每个等价类中选取少量具有代表性的数据作为测试用例,以达到用较少的测试用例覆盖较大范围输入数据的目的。 在等

测试用例的设计方法-等价类划分方法

测试用例是设计方法-等价类划分方法    等价类划分方法:是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。 1、划分等价类    等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值的测

计算多图的等价无向图的邻接链表表示

计算多图的等价无向图的邻接链表表示 摘要:一、引言二、算法思路三、伪代码实现四、C代码实现五、算法分析六、结论 摘要: 在图论中,多图(Multigraph)是一种允许边重复以及存在自循环边(即一个顶点到其自身的边)的图。给定一个多图的邻接链表表示,本文旨在探讨如何构造一个等价的无向图,并给出其邻接链表表示。所谓等价的无向图,指的是在删除所有冗余的边和自循环边后,对于任意两个顶点

(白书训练计划)UVa 11054 Wine trading in Gergovia(等价转换)

题目地址:UVa 11054 很巧妙的一道题,这题是利用的等价转换,对每一条路来说,假如右边生产的比左边的多x,那么不管起点是哪,终点是哪,都可以把左右两侧的看成两个点,要从这条路上运送x个劳动力。再由于总和是0,所以只需要算出一端的总和就可以,这样只要遍历一遍就可以算出来了。写出代码就很简单了。。。 代码如下: #include <iostream>#include <stdio.h

函数式编程和OO编程02——二者的等价性

我:理论上这两种方式可以等价吗?(FP 和 OOP) -ChatGPT 理论上,函数式编程(FP)和面向对象编程(OO)可以在功能上达到等价的效果,但它们的实现方式、代码结构以及思维模式有所不同。 功能等价性 从功能角度来看,两种编程范式都可以用来解决相同的问题,并实现相同的计算或逻辑。无论是用OO编程中的类和对象,还是用FP中的函数和不可变数据,都可以构建相同的应用程序或系统。 例如,

论语新解

子曰:君子疾夫舍曰欲之而必为之辞 大园:你说你自己想要就行啦找那么多借口装啥呢

【杂记-浅谈等价路由】

浅谈等价路由 一、等价路由概述二、等价路由的特点1、负载均衡2、链路备份3、路由收敛快 三、等价路由的应用场景四、等价路由的配置与优化五、等价路由的挑战与发展 一、等价路由概述 Equal-Cost Multipath Routing,简称ECMP,即等价路由,指的是在网络中存在多条不同链路到达同一目的地址的情况下,这些链路的成本值(Cost值)相等,可以视为同等的路由路径。在传

lec(logic equivalence check)--cadence 等价性检查工具理解

文章目录 1. lec是独立的,不基于任何指定的综合工具。key point mappingummapped points有三类 formal functional comparison algorithms两种comparison方式 2. setup mode 和 lec mode3. blackboxsetreport 4. unreachable key points设置选项,尽量避

RBAC新解 - 基于资源的权限管理

1、什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念。角色是代表一系列可执行的操作或责任的实体,用于限定你在软件系统中能做什么、不能做什么。用户帐号往往与角色相关联,因此,一个用户在软件系统中能做什么取决于与之关联的各个角色。 例如,一个用户以关联了”项目管理员”角色的帐号登录系统,那这个用户就可以做项目管理员能做的所有事情――如列出项目中的应用、管理项目组成员、产生项