前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >软件测试 - 状态迁移自动生成算法研究

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

作者头像
我去热饭
发布2022-05-18 21:13:22
3510
发布2022-05-18 21:13:22
举报
文章被收录于专栏:测试开发干货测试开发干货

简介

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

得出的结果请看:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发干货 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 按照正常手动逻辑要先画出树状图(深度优先)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档