Python 关于递归找出依赖用例,请教一下各位大佬

底层贫困人员 · 2021年06月16日 · 最后由 jinglebell 回复于 2021年06月17日 · 701 次阅读

下面这段 json 为用例数据,譬如 我要执行用例 1,我要先执行用例 2,执行用例 2 前提下,要先执行用例 3 4 5,执行用例 5 就先执行 6 ,总体顺序就是 先执行依赖用例列表 [3,4,6,5,2 ],最后在执行用例 1。

问题:如何实现输出依赖用例列表?如上面例子

[
    {
        "api_id": 1,
        "name": "用例1",
        "step": [
            2
        ]
    },
{
        "api_id": 2,
        "name": "用例2",
        "step": [
            3,
            4,
            5
        ]
    },
{
        "api_id": 3,
        "name": "用例3",
        "step": null
    },
{
        "api_id": 4,
        "name": "用例4",
        "step": null
    },{
        "api_id": 5,
        "name": "用例5",
        "step":[6]
    },
{
        "api_id": 6,
        "name": "用例6",
        "step": null
    }
]

目前代码实现,不确定是否有隐藏 bug

class Cases(object):

    @classmethod
    def get_steps(cls, case_data, steps, steps_list):
        steps = list(reversed(steps))
        for i in steps:
            for index, case in enumerate(case_data):
                if case['api_id'] == i:
                    steps_list.insert(0, case_data[index])
                    if case['step'] is not None:
                        cls.get_steps(case_data, case['step'], steps_list)
        return steps_list

steps = [2]
steps_data = Cases.get_steps(data,steps,[])
print(json.dumps(steps_data,ensure_ascii=False))      
共收到 9 条回复 时间 点赞

1、是不是需要做下循环依赖的校验?比如 1 依赖 2,2 依赖 3,3 依赖 1 这种。
2、这里最深的 if 已经是第四层了,嵌套略深,而且也缺少对 step id 没有对应 api_id 这种异常情况的检测,目前只是直接忽略返回空列表,而非抛异常。
3、有一个场景没有描述,比如 1 依赖 2、3,2 和 3 都依赖 4。此时应该生成的是 [4, 2, 3, 1] ,还是 [4, 2, 4, 3, 1] ?按照目前实现,会出现的应该是后者。

建议按照这几个信息,分块编写相关逻辑:

  1. 递归结束条件:step 数组内元素个数为 0、值为 null 或者不存在此 key
  2. 每次递归需要进行的操作:把依赖的 step id ,在验证确认对应 id 的用例存在后,加到执行顺序列表中当前 step 的前面
  3. 其它需要抛出异常的场景:循环依赖校验、step id 在用例列表中不存在

同类逻辑 java testng 框架的 depends 逻辑也有类似实现,建议也可以参考下。

为什么不对用例执行顺序进行一下排序。要搞这么复杂

body 回复

这不就是对用例执行顺序排序的过程么。。。

testng 个人觉得是标准做法。
用有向图判断强连通子图来检测循环依赖,区分顺序执行的方法列表和独立的方法列表。
独立方法列表可以考虑并发执行。

依赖检测找到另一个算法,看起来逻辑比有向图判断环更简单,可以参考下:
https://github.com/scarcoco/projx/issues/38

陈恒捷 回复

谢谢大佬的建议😀

陈恒捷 回复

第 3 点,我理解的是生成 [4, 2, 4, 3, 1]

个人觉得,都能写出这个 json 的使用者,他就不能自己手工排下 case 的执行顺序到某个任务中吗?自动化脚本或代码负责自动跑任务。如果纯粹练下编码思维和手感,倒也不错

jinglebell 回复

手动编排试过了,其他人说难排 (其实是懒)

额,可能不只是懒,是对接口到功能的这层映射理解有限。。。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册