用状态矩阵解决有序操作的case爆炸问题-1

上一篇 / 下一篇  2012-07-27 13:06:01 / 个人分类:杂谈

 一、简介

k1k r Gl"f]*T0  我们在测试中可能都会面对case爆炸问题。有的case组合是无序的,我们可以通过pict组合case,让pict成最优化的case组合,在保证覆盖率的同时控制case数,这个方式在业界使用广泛,收效也不错。51Testing软件测试网+V}OR3mT9y"L

Cb Wo]w8t0  但是对于有序操作的case爆炸,pict不能支持。目前没有很好的办法,总是让我们很伤脑筋。51Testing软件测试网sy@-h^0dv

.C#GGM?0  本文从状态矩阵出发,讨论了用遍历状态矩阵、先生成所有case、再组合case的方法来解决有序操作的case爆炸问题。51Testing软件测试网L(|{Vw G

&YL4H&^8JM0  二、基于ajax的网站测试遇到的问题

oj_6G.]!b S051Testing软件测试网VCp)wV(l DL,aik^4u

  1、ajax简介

p A#Jp!Q5L S051Testing软件测试网/?;lQ H&o_;fJ!L

  有序操作的case爆炸问题在javascripts 测试或是应用ajax技术的产品测试中,尤为明显。51Testing软件测试网)f"xH)q9u(bK"Q2o+h

51Testing软件测试网-h"cH g-\9m i

  AJAX(Asynchronous JavaScript. and XML),异步 JavaScript. 和XML,不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。51Testing软件测试网UyzI'Arq9H

51Testing软件测试网w%tam2P

   传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个 做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器 的响应时间。这导致了用户界面的响应比本地应用慢得多。

3~w6n0d S051Testing软件测试网#wJyO lqq S

  与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或 其它一些基于 XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快 的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。51Testing软件测试网 t `` ? Sv ^]0[OK^ j

k+i h ouN1Z0  但应用ajax技术也面临着许多问题。无可避免的第一个问题即是浏览器的兼容性问题。各家浏览器对于JavaScript/DOM/CSS的支持总有部分不太相同或是有Bug,甚至同一浏览器的各个版本间对于JavaScript/DOM/CSS的支持也有可能部分不一样。这导致程序员在写 Ajax应用时花大部分的时间在调试浏览器的兼容性而非在应用程序本身。51Testing软件测试网T2Yx!|7Tf

[(av%J2g0   Ajax技术之主要目的在于局部交换客户端及服务器之间的数据。如同传统之主从架构,无可避免的会有部分的业务逻辑会实现在客户端,或部分在客户端部分 在服务器。由于业务逻辑可能分散在客户端及服务器,采用异步交互的方式,而javascript语言本身之能力可能不足以处理复杂的业务逻辑,这导致 Ajax应用程序极难维护。51Testing软件测试网4_.T|T$|q&u@

51Testing软件测试网A"pS9Pj I8a

  2、测试中遇到的问题51Testing软件测试网*z7}b'x'gyd&Y

7C(iT/^ Yj9u%Qb0  测试过java script的同学都知道,js有一些功能,单独验证时不会有问题,而将几个功能组合起来时,却很容易出现bug。一些bug可能需要3~4次操作才能够发现。51Testing软件测试网1Ds^^4B:EbQ e

51Testing软件测试网JUpdT-k-\

   基于ajax的网站测试中,关于组合操作的测试设计通常依赖测试人员的经验和开发者的设计文档,将可能发生关联的case组合起来。测试执行时也加入一 些“随意测试”,即随意组合各种操作,以发现组合操作的问题。这个测试方法在较简单的场景中取得了一定的效果,可以用较小的投入发现问题。但随着网站的 ajax技术越来越复杂,更新越来越快,这样做可能存在一些问题:51Testing软件测试网 sdZ:~7\0m'vD2W

51Testing软件测试网2BS{6dL%W`4uc

  1)测试设计的覆盖率不能保证。只凭测试人员的经验,可能不能覆盖到大多数情况,容易漏掉一些分支。51Testing软件测试网!Vb&Ab/Zl+i1E

t'c&|"@(x-E7S$F0  2)测试执行时的“随意测试”没有依据,测试效果可能因测试人员的不同或测试人员的状态而异。51Testing软件测试网Jn,u-kA?,W-TG

wy\0E*@#yG`] ~0  因此,我们亟待解决的一对矛盾是:51Testing软件测试网+`8q6`w9Q n

V&w['c.A0  ● 测试设计的覆盖率。51Testing软件测试网2b1G"~3bIl%``

51Testing软件测试网Go9Oh7}-mw)}

  ● 测试case要在有限的范围内。

/t Q.y&s|hqNt0

8G,~;?1mms0  三、现成的解决方案?51Testing软件测试网Ub9s+[*qmEt

5_f.wG^r0  想解决覆盖率和case爆炸的矛盾,目前了解到的解决办法有:51Testing软件测试网uD4o,X9O|?

51Testing软件测试网2f-zi q8?%H*N7r2}1r `e3[

  1、pict

J|H4P8fE&[0

T)pcpq)w;Q cqcJ0  ● 优势:51Testing软件测试网A&e3RE/}3u

51Testing软件测试网b!\db(d/Mn9B] l

  有一些组合可能是我们不需要进行测试的。通过给组合间加入条件限制,pict可以自动生成需要测试的组合。通过pict的优化和筛选,case组合可以有效的减少。pict工具成熟,应用很广泛,取得了不错的效果。51Testing软件测试网 m7XNT"c/Yq

51Testing软件测试网YFV7ia#Z(J9q

  ● 不足:51Testing软件测试网'p_P8kXQ B)v

-r2Tt_4k$M,{"c"@0  pict所处理的组合之间是无序的,也就是说用pict得到的是一个“组合”而不是“排列”。有时候我们需要处理的是一个操作序列,例如 1-2-3、1-3-2、2-3-1 都是不一样的。而pict对这种顺序关系不能区分。

4? T?%K9dW ?0

G{ T*h,l]0  2、状态图

N ]gs*J051Testing软件测试网bY A9CBZ ?7J

  ● 优势:51Testing软件测试网F_ GT%L.m

*XY$T,l/NV3V0  操作间顺序关系一目了然。51Testing软件测试网5L#U7}6h-iY

51Testing软件测试网4U(m];|(EA8U9vE8fS

  ● 不足:

|"~Ke#fB^b BT051Testing软件测试网:w7A%fi5Z F"] XV

  无法得出操作序列,仍然只能是看图随机操作。51Testing软件测试网kzIg3X$@9S

51Testing软件测试网QtL5u@:`

  四、我们的解决办法

;Rp,a/x)S:o3[%xM0

-I8c\7nm\^W0  既然状态图可以反映有序操作的关系,我们打算从状态图着手来解决这个问题。

V;[{r8hf0

&Z-WY%x3W@&d0  1、应用场景

8s8w.fS0f.l/vp-y051Testing软件测试网7nB&m w4t0qm-@,d

  我们假设一个常规的电子商务网站。51Testing软件测试网4bzP(zz3or:D

51Testing软件测试网1W1kf;E X7Y4a}m

  这个网站中,用户首先进入首页,然后可以搜索产品,进入产品列表页;也可以直接点击首页中的促销产品,进入产品的详细介绍页。51Testing软件测试网g#i V+S-w%m^

$]8O1]Ib-_,BP0  进一步,在产品列表页中,用户可以点击“加入购物车”将商品放入购物车或点击购买直接进入订单页,或对搜索结果不满意而再次搜索;在详细介绍页中,也可以进行如上的操作。51Testing软件测试网m7Tp0e-c;q`

$HaW s0z^o"k$a0  在购物车的页面中,用户可以增、删、改购物车的内容,或继续购物;在订单页中,用户也可以一步步提交订单或继续购物。

&B-V$r!e+`3hzr"u051Testing软件测试网C,X0Q{T Rf!S

  我们发现涉及的页面越来越多,其间的关联关系也越来越复杂,大概像下面一张状态图,图中加入了一些“其他功能页”,并假定了他们之间的跳转关系。51Testing软件测试网LE x Z5a O}

51Testing软件测试网B5C1z&y f/] D

51Testing软件测试网3pS9F{-{;Cu0XK}

  2、首先要解决的是覆盖率问题

&z#n%c2Ll+M%~5J4M#R0

.rK4jc|ik0  对这样一个网站,只测试单个页面时,一般问题不大。按照通常的思路来处理,例如搜索产品,订购产品,提交订单,那么问题也不大。可是有时有这样的情况:

(n^:A t5E#dAOiG0

-T'W4y+F tvi0  ● 用户习惯先添加到购物车,再统一提交51Testing软件测试网a W)W7v6j X0G

ddt#f-{9q _R.L$p0  ● 提交到一半,发现有的东西不想要了,去掉一两件,重新提交。

#\M:S$i8n7hj051Testing软件测试网!Ji&e\P9g

  ● 有一部分商品来自购物车,有一部分商品来自新选择的东西。51Testing软件测试网x'H oB0v?X

51Testing软件测试网5x)?6IZ"P#U5c

  ● 已经提交的订单,后台还没处理时,用户有权力修改。51Testing软件测试网 dz)z1i3u"L

51Testing软件测试网W6C,Ag0}:]

  说白了,上面状态图里的各种可能组合,都可以发生,用户可以沿着箭头所指的方向,不停的走下去。如果我们有某种组合没有测到,可能发生一些异常。51Testing软件测试网 m cVN ka

51Testing软件测试网U&C3t,_%zh%k

  为了避免异常的发生,我们要测试尽量多的组合。组合的覆盖率要达到怎样的程度?51Testing软件测试网/]hr,`%G%J]Z"sH-G

51Testing软件测试网DjY$F!?6WOxK

  根据pairwise的理论,90%以上的bug都是由两两成对的操作导致的。而在网站ajax页面测试中,可能这个数值会稍低一些。依据经验,我们发现大于两步操作的bug还是有一定数量,但是一定要大于三步操作才能发现的bug则很少。51Testing软件测试网pn{or

51Testing软件测试网P P] mP v9F

  因此我们暂时将覆盖率“拍”为“覆盖所有的三步操作组合”。如果测试设计能够达到这个覆盖率,那应当是非常全面了。

Y7N t'u3I051Testing软件测试网Q3^]n,QE"b{S

  我们先制定这样一个覆盖率目标,事实上这个三步可以理解为N步,只是一个宏定义,再看怎么能简化。51Testing软件测试网3W/h9z w6A5@B

GX4_&c0E0  3、怎样达到这个覆盖率?

n/N3h^\.Mp%G0

-I%~ya C#aJ/Az0  目标是“覆盖所有三步操作”,有了上面的状态图,通过遍历状态图,就可以做到了。画状态图,是不是有点麻烦?51Testing软件测试网 Ddl;dg:}@;K s

51Testing软件测试网&i*k;t e|

  进一步,将状态图抽象一下,用状态矩阵来表示,遍历这个状态矩阵,就可以穷尽三步操作。51Testing软件测试网-x)_UX'fx;g)u:ME!p

/zX%f'a4D;Wm0  那首先要完成状态矩阵这个体力活,根据上面的状态图,图中的页面用0-9来表示,从行号到列号,可以转换为1,不可以转换为0。

'hj:xt#l0

Hw1e6[N7e!z0  我们可以得出如下的矩阵:

/nh$BZ8Y#o0

Cf@K4J,S)F0

  接下来用程序遍历这个矩阵,找出所有2步及3步的操作,可以得到162个组合case:51Testing软件测试网g}}f.VS

  0 1
{;kw}S}-u0  0 2
"tT/b-~%vD0  0 3
@j*M`"d0  0 451Testing软件测试网(TtOV;cF9P
  0 2 151Testing软件测试网(zy^ DsO(L
  0 2 3
k$[5H!MYkp0  0 2 4
p&K'\*RL-k}0  0 2 651Testing软件测试网.N*x-R `6omLm v
  0 3 151Testing软件测试网Bx#gNz?@
  0 3 251Testing软件测试网^N.Mb#S
  0 3 4
,iKy-Ff\[S3R0  0 3 751Testing软件测试网${M#yB D NJ s
  0 4 151Testing软件测试网'Z1m)K9Cp
  0 4 251Testing软件测试网|J#N[}[:E
  0 4 351Testing软件测试网 pJ,KOTUt%G
  0 4 7
1g#]^s!in0  2 151Testing软件测试网xVp'c&^$Vw
  2 351Testing软件测试网$B;hU YQ.pQ%[
  2 451Testing软件测试网)~TGHX6l
  2 6
W7d+q A9Vrl0  。。。。
51Testing软件测试网#r-] ]F |

  有了这些case,覆盖率一定很全了。

1X2h"r| EX!F0

TAG:

 

评分:0

我来说两句

Open Toolbar