组合测试法中的全对偶测试法

本贴最后更新于 4205 天前,其中的信息可能已经天翻地覆

在测试设计过程中,大家都会遇到很多变量进行组合的情况,对相互组合的两个或更多变量进行的测试活动就是组合测试,一般情况下都是使用组 合测试法,但这种情况很多测试人员研究得不够深入。测试人员需要开发或了解组合测试法中使用到的工具,通过程序得到用例组合才更加合理和全面,如果不在测 试中一起改变某些变量,就会遗漏由不同的变量组合而触发的错误。

首先介绍下组合测试法的定义,组合测试是一种测试用例生成方法。它将被测系统抽象出来的变量的取值进行组合并生成一组测试用例的过程,一般情况下, 组合测试能够在保证错误遗漏率的前提下采用较少的测试用例测试系统。但是对于如何从全集合的变量组合中抽取出有效的测试用例,会有不同的方法,两因素 (Pairwise)组合测试就是一种比较好的方法去挖掘出有效的测试用例组合。接下来介绍另外一种方法去自动生成较好的测试用例集,那就是全对偶测试法 (All Pairs)。这些组合测试方法也是高级测试工程师必须掌握的。

现在我们假设存在3个变量:V1、V2、V3,V1变量存在3个值:A、B、C;V2变量存在2个值:D、E;V3变量存在2个值:F、G。按照组 合测试法,可以组合出3*2*2 = 12种情况,也就是可以设计出12个测试用例。如果3个变量都存在5个不同的值的话,那就可以组合出5*5*5 = 125种情况,也就是需要设计出125个测试用例。测试专家James Bach使用全对偶测试法(All Pairs)将这125个测试用例压缩成25个测试用例,从理论上来覆盖变量组合的测试覆盖率,全对偶测试法有个基本的原则是每个变量的每个取值都要与至 少一个用例中的每个其他变量的每个取值配对。

为了让业界测试人员更能方便的使用全对偶测试法产生的组合测试的测试用例,James Bach使用Perl语言开发了一个allpairs工具,接下来通过讲解allpairs工具的使用方法来了解全对偶测试法(All Pairs)的实现原理和组合策略。本工具的下载地址:http://www.satisfice.com/tools/pairs.zip

假设我们有两个参数需要测试,比如操作系统,打印机,先列出每个参数的值:

操作系统:

Win 98

Win XP

Win 7

打印机:

HP 4050

HP 4100

为了测试所有的组合对(pairings),测试用例包括如下情况:

用例

操作系统

打印机

1

Win 98

HP 4050

2

Win 98

HP 4100

3

Win XP

HP 4050

4

Win XP

HP 4100

5

Win 7

HP 4050

6

Win 7

HP 4100

在两个参数的情况下,所有的组合对(pairings)就是参数之间的所有组合情况。但是如果我们新增一个参数将会发生什么呢?

是否双面打印:

下面是3个参数进行组合的所有测试用例:

用例

操作系统

打印机

是否双面打印

1

Win 98

HP 4050

2

Win 98

HP 4100

3

Win XP

HP 4050

4

Win XP

HP 4100

5

Win 7

HP 4050

6

Win 7

HP 4100

7

Win 98

HP 4050

8

Win 98

HP 4100

9

Win XP

HP 4050

10

Win XP

HP 4100

11

Win 7

HP 4050

12

Win 7

HP 4100

对应三个参数的所有组合情况就是12个测试用例。但是我们需要的是在一组测试用例中能够保证至少一个用例中的每个其他变量的每个取值都配对过。这种情况就可以得到较少的测试用例,我们就可以得到6个测试用例。

用例

操作系统

打印机

是否双面打印

1

Win 98

HP 4050

2

Win 98

HP 4100

3

Win XP

HP 4050

4

Win XP

HP 4100

5

Win 7

HP 4050

6

Win 7

HP 4100

事实上,如果这三个参数中的某两个参数的值的任意不同的组合会触发一个bug的话,那表格上的那组测试用例也可以发现该bug。当三个特殊的值组合 在一起触发的某个bug,那表格上的那组测试用例不一定能发现该bug,但是至少我们覆盖了所有的全对偶(all pairs)。

相对于所有组合情况来说,全对偶的测试覆盖率要容易很多。例如,如果你想测试10个参数且都有26个值的功能,所有组合情况将导致存在141,167,095,653,376个测试用例。而全对偶测试法就只要测试1094个测试用例就可以。

为了能较好的使用allpairs工具,测试人员需要在表格上列出所有的参数和参数值,一般可以使用Excel工具来表达:

操作系统

打印机

是否双面打印

Win 98

HP 4050

Win XP

HP 4100

Win 7

   

然后将这个Excel表格拷贝到一个text文件(暂时命名为vars.txt),在Dos平台上运行Allpairs程序,使用如下的命令:

ALLPAIRS VARS.TXT > TESTCASES.TXT 

如果测试人员也安装了Perl,也可以使用如下的命令:

PERL ALLPAIRS.PL VARS.TXT > TESTCASES.TXT 

TESTCASES.TXT文件里面的数据也适合拷贝到Excel文件中,类似于如下:

上图的第一部分是测试用例的集合,那个”pairrings”列说明的是全对偶方法找到的唯一pairrings的数量。

上图的第二部分是帮助测试人员了解全对偶方法的是怎么完成的。它列出了每个pair,且显示了这个pair在测试用例列表中出现的次数,且列表出了每个pair出现的时候所对应的测试用例的用例号。

James Bach 也在《软件测试经验与教训》中详细的说明任何使用全对偶的测试方法进行组合测试。主要分三大步骤,第一个步骤是 从域划分开始,确定和压缩每个参数所取的值和个数;第二个步骤是 获得全单值,保证覆盖到每个变量的每个重要取值;第三个步骤是 获得全对偶,保证每个变量的每个取值都要与至少一个测试用例中的每个其他变量的每个取值配对。同时他还表示仅仅使用全对偶测试是有风险的,与全单值一样, 测试人员可能知道被广泛应用的特定组合,或可能有麻烦的组合。

当然很多人会问是不是还有其他的工具来自动化生成组合的测试用例,由于全对偶测试法并不是一个最完美的解决办法,但在大部分情况下,对测试来说还是 足够的。考虑10个参数且都有10个值的情况,全对偶测试(All Pairs)需要使用177个测试用例来覆盖组合测试情况。最有可能的最佳的用例个数是100到177之间,James怀疑在130个测试用例左右。但是 与成千上万的测试用例集合相比,177个并不是特别差的情况。当然,对于使用全对偶测试(All Pairs)法产生的所有测试用例集合也可以是可运行的自动化脚本,由于参数和取值之间没有约束关系,所以产生的用例集合有规律,目前淘宝网技术质量部开 发了相关的工具用于通过组合测试法生成页面自动化脚本,该脚本是Ruby语言编写,通过规则和参数化取值来准备数据,使用关键的key标识来组合自动化脚 本的框架,有兴趣的同学可以一同研究。

一般在测试设计过程中,组合测试法不会单独使用,而是会与其他方法进行组合使用,大部分时候是和判定表和边界值组合使用,在关键性的高稳定要求的系 统软件中,组合测试和边界测试的组合覆盖率尤其重要。这个组合测试策略在兼容性测试策略方案上也有很大的作用,在选择操作系统,浏览器版本,其他软件配置 的兼容性测试上给出方向性的指导。

美国Telcordia 技术公司有一个基于web的工具, 它产生的结果集要优于全对偶测试(All Pairs)得到的结果集。例如,存在40个参数且都有3个值的情况,这个工具可以使用21个测试用例来覆盖所有的pairs。全对偶测试(All Pairs)则需要29个测试用例才能达到同样的效果,但是这个工具是收费的,相比较免费的全对偶测试(All Pairs),测试人员可以自己做出选择。

当然,微软也会有相关的工具来构造组合测试用例,PICT就是一个比较易用的工具。PICT(Pairwise Independent Combinatorial Testing tool)可以有效地按照两两测试的原理,进行测试用例设计。在使用PICT时,需输入与测试用例相关的所有参数,以达到全面覆盖的效果。下载地址:http://download.csdn.net/source/3078728。 使用过程中关键的是需要建立组合测试的模型,以便于用尽可能少的测试用例,覆盖尽可能多的影响因素,详细使用介绍如下:http://www.cnblogs.com/liangshi/archive/2010/07/25/1784666.html


转自:http://www.infoq.com/cn/news/2011/08/combination-test

  • Test

    如果你要试验论坛功能,请到 Sandbox 标签下发帖。

    14 引用 • 29 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
Vanessa
我们终此一生,就是要摆脱他人的期待,找到真正的自己。

推荐标签 标签

  • 工具

    子曰:“工欲善其事,必先利其器。”

    288 引用 • 734 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1795 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1435 引用 • 10056 回帖 • 489 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 105 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 484 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 147 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 65 回帖 • 445 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    27 引用 • 225 回帖 • 163 关注
  • 996
    13 引用 • 200 回帖 • 10 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 637 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    288 引用 • 4485 回帖 • 663 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 2 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 159 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 926 回帖
  • 反馈

    Communication channel for makers and users.

    123 引用 • 913 回帖 • 250 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 683 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 1 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    196 引用 • 540 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 1 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 694 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 27 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 715 关注