【测试算法】深入浅出Pairwise 算法_pairwise测试方法-程序员宅基地

技术标签: 专栏:数学&计算机学科知识  


深入浅出Pairwise 算法

作者:王勇 


软件测试是软件开发中很重要的一环,在软件成本中也占着很大的比重。本文在介绍pairwise算法的基础上,提出了针对某一类问题的扩展算法并加以实现。

       本文的组织结构如下:

第一,  本文首先简要介绍一下测试界中的著名的pairwise算法(约占文章的50%)。

第二,  然后提出了一种对pairwise算法的扩展算法(扩展算法更适合用于测试某一类场合)。

第三,  最后,基于扩展算法,使用java语言开发出测试用例生成工具jCase。

 

目录

1 软件测试...3

2 pairwise算法...3

2.1 pairwise算法详解...4

2.2 Pairwise算法的效率...6

2.3 pairwise算法的比较...6

3 Pairwise扩展算法...7

3.1 Pairwise维度...7

3.2 Pairwise算法中重要维度算法...8

4 Pairwise程序...9

5 Pairwise的不足...10


软件测试

软件测试是软件工程中一个重要的活动,它有4个原则:

(1)尽早的和不间断的进行软件测试

(2)对所有产品进行全面测试

(3)关注软件开发全过程

(4)根据不同的需求,选用适当的测试模型

软件测试分为黑盒测试和白盒测试。Pairwise算法就是针对软件测试中的黑盒测试提出来的一个行之有效的测试方法。

2 pairwise算法

       Pairwise是L. L. Thurstone(29 May1887 – 30 September 1955)1927首先提出来的。他是美国的一位心理统计学家。Pairwise也正是基于数学统计和对传统的正交分析法进行优化后得到的产物。

Pairwise基于如下2个假设:

(1)每一个维度都是正交的,即每一个维度互相都没有交集。

(2)根据数学统计分析,73%的缺陷(单因子是35%,双因子是38%)是由单因子或2个因子相互作用产生的。19%的缺陷是由3个因子相互作用产生的。

因此,pairwise基于覆盖所有2因子的交互作用产生的用例集合性价比最高而产生的。

2.1 pairwise算法详解

假设有3个维度,每个维度有几个因子。如下:

浏览器:M,O,P

操作平台:W(windows),L(linux),i(ios)

语言:C(chinese),E(english)

求解:

使用pairwise算法,有多少个测试case?具体是什么case?

 

我们沿用数学做题的格式。

解:

如果不用pairwise算法,我们需要 3*3*2=18个测试case。下面是具体的case:

1,M W C

2,MW E

3,M L C

4,M L E

5,M I C

6,M I E

7,O W C

8,O W E

9,O L C

10,O L E

11,O I C

12,O I E

13,P W C

14,P W E

15,P L C

16,P L E

17,P I C

18,P I E

一共有18个,很繁琐。但是这是100%的测试覆盖率,缺陷率也是100%。

现在我们使用pairwise,看看结果如何?

首先咱们从最下方一个18号开始,它是 P I E,两两组合是 PI ,PE ,IE。看这3个组合在以上的相同位置出现过没有,PI在17号,PE在16号,IE在12号出现过。所以18这个case就可以舍去。

最终剩下的如下:

1,MWC

4,MLE

6,         MIE

7,         OWE

9,         OLC

11,    OIC

14,    PWE

15,    PLC

17,PIC

共计9个测试case,节省了50%的测试case。

现在我们从上面开始重新做一次。1号是MWC,两两组合是MW MC WC 都出现过,去掉。

最终剩下的是:

2,MWE

4, MLE

5, MIC

8, OWE

10, OLE

11, OIC

13 PWC

15 PLC

18 PIE

       这样也是剩下9个测试case,但是具体的case内容不一样。经过L. L. Thurstone证明,pairwise算法最终剩下的测试case个数肯定相同,但是可以有不同的case组合。

2.2 Pairwise算法的效率

       Pairwise算法和正交分析法进行比较,当有3个维度,每个维度有4个因子的时候:

(1)正交分析法的case数量:4*4*4=64个

(2)Pairwise算法的case数量:20个

Pairwise的case数量是正交设计法的三分之一。当维度越多的时候,效果越明显。当有10个维度的时候 4*4*4*4*3*3*3*2*2*2=55296个测试case,pairwise为24个。是原始测试用例规模的0.04%。

2.3 pairwise算法的比较

       Pairwise算法和单因素测试用例设计的比较,能够覆盖到两个维度的正交组合设计。能适当减少遗漏的测试。

       Pairwise算法和全正交设计法的比较,全正交设计法,测试case太多,投入的成本太大。Pairwise算法在数学统计分析的基础上,对传统的全正交设计法进行了优化,适当的提高了效率。

3 Pairwise扩展算法

       基于XXXX的各类项目,经过初步统计如下:

项目名称

项目组

维度个数

备注

xxx1

张组

3

平台,机器,软件版本

xxx2

张组

4

Ip和域名,udp,后缀表

xxx3

齐组

2

Ip黑白名单,域名黑白名单

xxx4

3

注册商,ip和域名

 

       可以看出,每一个项目的维度都保持在5个以下,并且有重要维度和一般维度的区分。根据这2个特点,提出了pairwise的扩展算法。

3.1 Pairwise维度

XXXX的各类项目维度都不多,并且每个维度的因子也不太多。测试人员可以很好的把握测试维度,难度不高。适合pairwise算法。

3.2 Pairwise算法中重要维度算法

在一般维度方面,重要性是平均的,所以在维度1上,是一个平面,它和维度2(平面),相交,是一条线,具体到因子,就是一个点。所以我们找到了一组case。

在重要维度方面,重要性不是平均的,我们采用正交表的曲面理论。比如维度1是重要维度,我们采用曲面表示,如果维度2也是重要维度,那么,维度1和维度2相交,就是2条线。具体到因素,就是2个点(或者多个点)。如果维度2是一般维度(平面),曲面和平面相交,也有可能是1条线,也可能是2条线。我们这里选1条线。

综上所述,重要维度方面要适当增加测试case。具体怎么加见如下方法:

1,         按照输入维度的顺序全排列测试case。(输入维度的顺序代表重要性从高到底)

2,         从第一个开始往下使用pairwise算法过滤case。

3,         从最后一个开始往上使用pairwise算法过滤case。

4,         找出以上2组中相同case的数量,就是要增加的case的数量。

5,         增加的case是步骤4中相同的case的,变换维度1和维度2生成的case。

4 Pairwise程序

       现有很多程序都是围绕pairwise算法产生的,最著名的就是ReduceArray;SmartDesgin 和微软的PICT。

按照pairwise扩展算法开发了一个jCase程序,部署在http://xxxxx.cn/ 上的测试工具库中。基本理论如第3小节所述。

开发环境:eclipse 3.2

JDK:1.6+

部署容器:tomcat

核心流程:

1,         获取维度和因子进行全排列。

2,         得到具体的case的两两因子组合(带位置)。

3,         判断这个case中两两因子组合是否在上面出现过,如果出现一个就删除掉。全部都没出现过,就保留这个case。

4,         按照不同的顺序使用pairwise算法再过滤一遍。

5,         得到2组数据,找出相同的case。

6,         按照维度的顺序增加case。

核心代码如下:

private booleanjudge(String[] tpm, HashMap copyresult) {

        Stringstr = "";

        for(int i=0; i<tpm.length; i++)

        {

            str+= tpm[i]+";";

        }

        str= str.substring(0,str.length()-1);

        copyresult.remove(str);

        ArrayList r =newArrayList();

        int len = tpm.length;

        for (int i = 0; i < len; i++){

            for (int j = i + 1; j < len;j++) {

                String[]st = newString[len];

                for (int k = 0; k < len; k++){

                    st[k]= "*";

                }

                st[i]= tpm[i];

                st[j]= tpm[j];

                Stringss = java.util.Arrays.asList(st).toString();

                ss= ss.replaceAll("\\[","").replaceAll("\\]","");

//                  System.out.println(ss);

                r.add(ss);

            }

        }

        boolean bol =true;

        for (int i = 0; i < r.size();i++) {

            boolean flag =false;

            Stringk = (String) r.get(i);

            Iteratoriter = copyresult.entrySet().iterator();

            while (iter.hasNext()) {

                Map.Entryentry = (Map.Entry) iter.next();

                Stringt = (String)entry.getKey();

                if (cnniccompare(t, k)) {

                    bol= bol && true;

                    flag= true;

                    break;

                }

            }

            if (!flag)

                bol= false;

        }

        copyresult.put(str,str);

        return bol;

    }

5 Pairwise的不足

       (1)Pairwise对于维度的分解来说,需要对业务很熟悉。以及需要正交测试法的理论支持。需要中等专业的测试人员才能完成。

       (2)pairwise还是有一定的遗漏。相比于全正交设计法来说,pairwise算法对于多于2个因素相互作用所产生的bug,没有覆盖到。


转自:http://blog.csdn.net/aassddff261/article/details/42776543

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ztf312/article/details/78792906

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签