简介
状态迁移测试方法,多用于一个具有多种状态的产品,其中的状态有些可以互相转移,比如播放器,有播放/暂停/快进/快退等状态。如何写这种用例呢,传统的手工方法是画一个树状图,可以按照深度优先规则。然后每条树杈就是一条用例。最终所有可能状态转移都会出现在这组用例中了。今天要研究的是用python代码自动生成这些用例
首先我们来看下用户录入的界面,本文只着重讨论后台生成算法,界面等请大家忽略
4 种状态如图。 播放状态可以直接暂停,快进,快退 暂停状态只能转为播放状态 快进状态只能转为播放和暂停 快退状态也只能转为播放和暂停。
按照正常手动逻辑要先画出树状图(深度优先)
所以最终的用例是:
用例1:播放-暂停-播放
用例2:播放-快进-播放
用例3:播放-快进-暂停
用例4:播放-快退-播放
用例5:播放-快退-暂停
用本文要研究的工具生成的最终结果如图:
后端代码
从前端用户输入的里面得到一个二维列表:
其中,每个元素就是一个状态,再里面的第一个元素是该状态自己的序号,第二个元素是状态名字,第三个元素是可以跳转到其他状态的序号
cases = []
代码语言:javascript复制cases = []
def digui(which,have): #证明这次解决which,have为本次已走的路径记录
# 判断which序号是否还在old中,如果在,则继续,不在,则返回结束
# 给have添加后续状态
if have == '':
have = which[1]
else:
have = '-' which[1]
if int(which[0]) not in old:
cases.append(have)
# 判断是否old为空,为空则全部结束
if old == []:
return
else:
# 在old中删除which的序号,以免之后再调用。
old.remove(int(which[0]))
# 判断which[2]是否为空,为空则说明也就此结束,否则继续递归
if which[2] == '':
cases.append(have)
else:
for i in which[2].split(','): #遍历which可连接的其他状态序号
digui(all[int(i)-1],have) #此时all[int(i)-1] 就是新的which
digui(all[0],'')
我们要做的就是用一个递归来计算所有的用例。其中 cases 是用来储存用例的列表,初始为空列表
all 为前面得到的二维列表,储存的是用户输入的状态
最后调用这个递归函数需要传入 all 的第一个状态,也就是 ‘播放’,和一个空字串
递归函数需要俩个参数,一个是 which,一个是 have
which 是本次要遍历的节点,have 是这个节点上面已经走过的路线组成的字符串,最终合成的每条用例都是一个大字符串
得出的结果请看:
和我们手动画图的结果一模一样。