正交分析法设计理论

2020 年 2 月 14 日

正交分析法设计理论

一、理念介绍


在黑盒用例设计方法中有一个大家耳熟能详的正交分析法,却鲜有人知 “Pairwise”设计理念。


设想一种常见的场景,工期很紧的项目,原定的测试时间被“无理”地压缩之后,如何能用极少的时间去保证更高的质量呢?


举个例子,如果让你测试一下 word 字体效果,你会整理出多少个用例呢?


1512095717583023238.png


答案很简单是 2 的七次方=128 个用例,但当工期特别紧的时候(128 个用例执行不完)你又会从中选取哪些用例来执行呢?


“Pairwise”(官网: http://www.pairwise.org/)是行之有效的一个思路或者是强有力的理论基础。它是L. L. Thurstone(29 May1887 – 30 September 1955)在 1927 年首先提出来的。他是美国的一位心理统计学家。Pairwise 也正是基于数学统计和对传统的正交分析法进行优化后得到的产物。


Pairwise 基于如下 2 个假设:


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


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


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


举例来说明:当因子 A 为 a1、B 为 b1 时,接下来不可出现 A 为 a1、B 为 b1 或者是 B 为 b1、A 为 a1(为什么会倒过来描述,可以思考一下)。


当然,在现实中会是有各种约束条件的,所以会出现 IF … Then…,或者是在同一场景下,因子 A、B、C 之间的组合是可以精简的,而因子 D、E、F、G 却是需要全组合(在 Pairwise 中的术语称谓“阶”)。一个个完全依靠人工来进行输出太麻烦,各大 contributor 贡献出自己的开源工具,这里挑一个大公司的(微软)给大家介绍一下,工具名 PICT。


工具下载地址:https://github.com/Microsoft/pict


最新的版本支持多平台(linux、mac、windows),需要自行编译。


二、PICT 工具使用


1512095768427055022.png


1)先准备一个文本文件 abc.txt,内容如下:


1512095791874002191.png


直接运行 pict abc.txt 即可得到 pairwise 之后的结果:


1512095932582005344.png


如果需要全组合情况,则可以在命令行参数中指定/o:3,其中 3 是因子的个数,(/o 的默认值是 2,此参数为上面所述的“阶”)如:


1512095969300059870.png


2)在文本中指定因子的组合情况,


1512096005345060904.png


直接运行 pict abc.txt 即可得到全组合的


3)因子判断结构:


1512096035304044242.png


输出的结果:(满足了当 A 为 a1 时,B 不等于 b2,C 不等于 c3)


1512096070087059273.png


三、实践


以“星火钱包——开户管理”的 “查询” 功能测试为例来详细介绍一下 PICT 工具的使用思路和过程。


1512096107245081947.png


查询因子有:“星火用户 ID”、“开户状态”、“开户渠道”、“开户时间”,其中每个因子的限制如下:


  • 星火用户ID:不限制输入的内容

  • 开户状态:请选择(默认)、开户成功、开户失败

  • 开户渠道:请选择(默认)、开户成功、开户失败

  • 开户时间:选择时间区间范围(前端页面的限制:填写其一,另外一个值会自动填充相同的时间,结束日期>=开始日期)(先不考虑后台接口的限制)


每个因子需要考虑值的范围为:


星火用户 ID:空(默认)、非数字、120988476548、120988476900


(假设 120988476548 是可以查询出结果的,120988476900 是查询不出结果的)


开户状态:请选择(默认)、开户成功、开户失败


开户渠道:请选择(默认)、PC、wap、app


开户开始时间:空(默认)、20150101、20160101、20170101


开户结束时间:空(默认)、20150101、20150301、20160201、20160301、20171101


“星火用户 ID”、“开户状态”、“开户渠道”这三个因子,比较好整理,如图所示,直接按照上面的内容直接填写至文件中即可:


1512096145172009552.png


而“开户开始时间”“开户结束时间”有依赖性,所以,需要特殊处理,我们将它们之间的依赖“翻译”成 PICT 所能理解的方式:


1)“填写其一,另外一个值会自动填充相同的时间”


换句话说,“开户开始时间”“开户结束时间”只能同时为空。


“翻译”


IF [开户开始时间] = “空” THEN [开户结束时间]= “空”;


IF [开户结束时间] = “空” THEN [开户开始时间]= “空”;



当然,你也可以这样写:


IF [开户开始时间] NOT IN {“20150101”,“20160101”,“20170101”} THEN [开户结束时间]= “空”;


IF [开户结束时间] NOT IN {“20150101”,“20150301”,“20160201”,“20160301”,“20171101”} THEN [开户开始时间]= “空”;



2)“结束日期>=开始日期”


“翻译”


IF [开户开始时间] <> “空” AND [开户结束时间] <> “空” THEN [开户开始时间] <= [开户结束时间];


1512096180241069855.png


准备好全部的“翻译”结果,如图所示:


1512096214480015085.png


我们先看一下“全组合”的用例总数为多少?答案 481 条,如图所示:


1512096246180067157.png


使用 Pairwise 思想,整理出的用例数量仅为 30 条,如图所示:


1512096282178090203.png


用例的详细内容如下:(每行即每条用例)


col 1col 2col 3col 4col 5
星火用户ID开户状态开户渠道开户开始时间开户结束时间
120988476900请选择请选择
120988476548开户失败PC2015010120171101
非数字开户失败wap
120988476900开户成功app2015010120150301
请选择PC2016010120160301
120988476548开户失败app2016010120160301
开户成功wap2017010120171101
开户失败请选择2015010120150301
非数字开户成功PC2015010120150101
请选择wap2015010120150101
非数字开户成功请选择2016010120171101
非数字请选择app2015010120160301
120988476548开户成功app
120988476548请选择app2016010120160201
120988476900开户失败wap2016010120160201
120988476548开户成功wap2015010120160301
非数字开户成功请选择2015010120160201
开户成功PC
120988476900请选择app2017010120171101
120988476900开户失败请选择2015010120150101
请选择app2015010120160201
120988476548开户失败app2015010120150101
120988476900开户成功请选择2015010120160301
120988476900请选择PC2015010120150301
120988476548开户失败请选择2017010120171101
120988476548开户失败wap2015010120150301
请选择PC2015010120160201
非数字请选择请选择2015010120150301
非数字开户成功PC2017010120171101


四、总结


Pairwise 是一种有效的测试用例生成技术,通过对测试变量的所有维度及值的组合,避免穷举测试所有维度的所有值及其组合来减少测试用例量。


遥想当年,Cohen 等人应用 Pairwise 测试技术对 Unix 中的“Sort”命令进行了测试,测试结果表明覆盖率高达 90%以上。


对于当今迭代开发测试如此高效率的时代,更需要将这种测试方法,并将其应用于测试当中。


本文转载自宜信技术学院网站。


原文链接:http://college.creditease.cn/detail/144


2020 年 2 月 14 日 18:47105

评论

发布
暂无评论
发现更多内容

话题讨论 | 你的桌面上会放哪些有趣的小摆件?

InfoQ写作平台

工作 话题讨论 办公室

Spring 5 中文解析核心篇-IoC容器之Bean作用域

青年IT男

Spring5 Spring Framework

手把手教程:基于环信4小时开发一个视频会议APP【附源码】

环信

Spring 5 中文解析核心篇-IoC容器之基于Java容器配置

青年IT男

Spring5 Spring Framework

Spring 5 中文解析核心篇-IoC容器之ApplicationContext与BeanFactory

青年IT男

Spring5 Spring Framework

Spring 5 中文解析核心篇-IoC容器之BeanDefinition继承与容器拓展点

青年IT男

Spring5 Spring Framework

敏捷转型谁先动:老总,项目经理or团队

华为云开发者社区

项目管理 敏捷 敏捷开发 团队 华为云

Spring 5 中文解析核心篇-IoC容器之JSR330标准注解

青年IT男

Spring5 Spring Framework

Spring 5 中文解析核心篇-IoC容器之Spring AOP API

青年IT男

Spring5 Spring Framework

手把手带你写Node.JS版本小游戏

华为云开发者社区

Java node.js Node 华为云 剪刀石头布

CSS常用样式——绘制各种角度的三角形(1)

程序员学院

CSS css3 CSS小技巧

为什么企业自主开发软件时,都会使用统一的模块化框架式开发平台?

Philips

敏捷开发 代码优化 框架设计 框架开发 标准框架

你真的懂AQS吗?透彻理解AQS源码分析系列之AQS基础一

InfoQ_d2212957090d

AQS

Spring 5 中文解析核心篇-IoC容器之依赖关系

青年IT男

Spring5 Spring Framework

Spring 5 中文解析核心篇-IoC容器之SpEL表达式

青年IT男

Spring5 Spring Framework

从RainbowBridge看Js与Java交互中的安全漏洞

OPPO安全

安全 安全漏洞

软件工程开发之道:了解能力和复杂度是前提

华为云开发者社区

软件工程 开发 项目 代码 复杂度

Redis 持久化 --RDB

是老郭啊

redis redis持久化 aof rdb

Spring 5 中文解析核心篇-IoC容器之IoC容器和Bean概述

青年IT男

Spring5 Spring Framework

Spring 5 中文解析核心篇-IoC容器之基于注解的容器配置

青年IT男

Spring5 Spring Framework

Spring 5 中文解析核心篇-IoC容器之AOP编程(上)

青年IT男

Spring5 Spring Framework

Spring 5 中文解析核心篇-IoC容器之自定义Bean性质

青年IT男

Spring5 Spring Framework

Spring 5 中文解析核心篇-IoC容器之Environment抽象

青年IT男

Spring5 Spring Framework

Spring 5 中文解析核心篇-IoC容器之类路径扫描和组件管理

青年IT男

Spring5 Spring Framework

企业表格技术与风险指标补录系统

Geek_Willie

SpreadJS

区块链数字货币交易所开发,数字交易平台搭建

13530558032

车队管理软件

samhuang

区块链支付系统开发,数字货币支付承兑商APP模式搭建

13530558032

Spring 5 中文解析核心篇-IoC容器之AOP编程(下)

青年IT男

Spring5 Spring Framework

日防夜防,“隐私窃贼“难防? 手把手教你如何使用OPPO手机管理应用权限

OPPO安全

安全 隐私保护 数据隐私 sdk

基于环信sdk在uni-app框架中快速开发一款多平台社交Demo

环信

正交分析法设计理论-InfoQ