zoukankan      html  css  js  c++  java
  • 解决依赖关系(单层和递归两种方式)、获取依赖用例去运行

    用例管理页面,编辑的时候选择依赖用例,登录用例获取项目信息两个接口互相依赖,点击确定的时候调用更新操作,会将两条用例绑定,A依赖BB依赖A,添加时不存在递归,post方法不需求修改,找到CaseView类里的put方法,重新创建自关联绑定关系这里出了问题,修改这里的代码,在编辑页面点击确定时提示依赖用例存在递归,请查证!,新增代码如下图:

    用例管理页面,当前有两条用例,用例标题是获取项目信息登录用例获取项目信息依赖于登录用例,点击获取项目信息,点击确定的时候,提示如下:

    接下来写代码实现,首先实现check_premise方法,传入当前用例id依赖用例id,views.py里put方法里修改的代码如下:

    然后在core目录下的case_utils.py里实现check_premise方法,如下图:

    然后在views.py里导入from .core.case_utils import get_premise_case, check_premise,让put方法的标红消失,在case_utils.py里导入from sksystem import models,check_premise方法实现的代码逻辑如下图:

    编辑登录用例,勾选获取项目信息,点击确定,提示依赖用例存在递归,请查证!,在日志中打印出来信息如下图:

    接下来开发多层依赖递归结束的条件,最终一定会有一个用例没有依赖,根据这个进行判断,因此需要在case_utils.py里开发一个类Premise,定义一个获取依赖用例的方法get_premise_case_id以及递归的方法loop_premise,通过当前用例查找到它所依赖的用例,因此实现get_premise_case_id的代码如下:

    def get_premise_case_id(self, case_id):
    case_obj = models.Case.objects.get(id=case_id) # 根据当前用例查询依赖用例的case_obj
    qs = case_obj.case.all() # 通过case_obj拿到了依赖用例
    return qs

    Premise类里新增一个构造方法,把rely_cases置为空,保证每次实例化类的时候,rely_cases一直为空,把依赖用例追加进去,新增的方法如下:

    def __init__(self):
    self.rely_cases = []

    loop_premise里新增的代码如下:

    def loop_premise(self, case_id, premise_id):
    """A依赖B,B依赖C,C依赖A"""
    qs = self.get_premise_case_id(premise_id) # premise_id是B,通过B拿到了C
    for item in qs:
    self.rely_cases.append(item.premise_case.id) # item.premise_case.id是C
    if self.get_premise_case_id(item.premise_case.id): # 如果C下面还有依赖用例,再调用一下自己
    self.loop_premise(case_id, item.premise_case.id)
    return self.rely_cases # 没有依赖用例返回这个list

    最终Premise类的代码如下:

    修改check_premise方法,实例化Premise类,调用loop_premise,返回一个list,check_premise修改后的代码如下:

    用例管理页面,点击获取下面信息,提示依赖用例存在递归,请查证!,在Terminal里看到打印的递归获取到的的依赖用例是[12],再新建一条用例,让三条用例先解除依赖,然后再互相依赖,能够互相依赖的前提是return True,要不然提示,依赖关系如下图:

    点击用例id13,直接点击确定按钮,打印出来的依赖用例:递归获取到的的依赖用例是[11, 13]

    只取到11和13,12没有取到,代码有问题,查看一下代码,在loop_premise方法里查到依赖用例后,先把依赖用例存起来,加一行代码self.rely_cases.append(premise_id),点击用例id13,直接点击确定按钮,打印出来的依赖用例:

    递归获取到的的依赖用例是[12, 11, 11, 13],重复没有问题

    最终Premise类里和check_premise里的代码如下图:

    接下来将用例运行起来,先把用例修改一下,登录用例不依赖其他用例,登录用例的默认参数和默认header都为空,登录用例的参数如下图:

    获取项目信息依赖于登录用例,默认header有值,获取项目信息的参数如下图:

    先在tasks.py里定义一个类Run,这个类主要用来提供执行单个用例的方法,用例和集合都可以用这个类,分两步进行,1、获取依赖用例 2、运行方法,在views.py里找到CaseRunView这个类,user_id是通过request.POST.get取的,现在不需要从前端取,这里通过middlewares.py取,在SessionMiddleware类下的process_request方法里找到token的情况下,把user加到request里,因此注掉上面的user_id,把task_id中的user_id换成request.user.id,因为运行走的是/api的方法,所以在settings.pyNO_LOGIN_LIST里不能有api,否则获取不到token,views.py下CaseRunView代码修改后如下图:

    接下来启动异步任务,通过debug的方式celery -A celery_tasks.main worker -l debug -P eventlet启动,保证run_caserun_collection这两个方法加载进来,点击获取项目信息运行按钮,打印出task_idcase_iduser_id,按照流程图点击运行时,拿到运行的case_id,调用celery异步任务更新task_id和status,获取到用例的异步任务,无论是多个还是单个用例都要获取依赖用例,复制case_utils.py里的Premise类下面的__init__(self)方法到tasks.py下的Run类中,self.rely_cases用来存找到的依赖用例,同时把get_premise_case_idloop_premise方法也复制过去,get_premise_case_id不需要修改,但是要导入from sksystem import models,主要修改loop_premise,修改后Run里中的代码如下图:

    为了能让用例真实运行,需要在接口管理里添加一个接口,接口信息里如下图:

    默认header里是token${token},新增接口,如下图:

    然后在用例管理页面添加一条用例,基本信息如下图:

    保证三条用例的关系是登录用例什么都不依赖,获取项目信息依赖于登录用例,获取参数用例依赖于获取项目信息,运行时执行顺序是登录用例获取项目信息获取参数用例,用例如下图:

    修改后run_case方法的代码,如下图:

    点击获取参数用例后面的运行按钮,该用例状态提示运行中,会生成最新的report_batch插到该条用例里,看celery_tasks里打印的信息,如下图:

    通过打印的list可以看出顺序是对的,但是有重复的用例id,接下来解决这个问题,Run类中loop_premise方法修改的代码如下图:

    点击获取参数用例后面的运行按钮,前端okcelery_tasks里可以看到如下:

  • 相关阅读:
    jmeter中生成html测试报告
    jmeter插件管理
    Jmeter参数化
    jmeter测试实例
    jmeter调用时间函数
    Jmeter参数关联
    JMeter的使用流程
    Jmeter 响应结果乱码解决
    使用BadBoy录制JMeter脚本
    jemter安装
  • 原文地址:https://www.cnblogs.com/laosun0204/p/12678407.html
Copyright © 2011-2022 走看看