软件测试 - 状态迁移自动生成算法研究

2022-05-18 21:13:22 浏览数 (1)

简介

状态迁移测试方法,多用于一个具有多种状态的产品,其中的状态有些可以互相转移,比如播放器,有播放/暂停/快进/快退等状态。如何写这种用例呢,传统的手工方法是画一个树状图,可以按照深度优先规则。然后每条树杈就是一条用例。最终所有可能状态转移都会出现在这组用例中了。今天要研究的是用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 是这个节点上面已经走过的路线组成的字符串,最终合成的每条用例都是一个大字符串

得出的结果请看:

和我们手动画图的结果一模一样。

0 人点赞