解决依赖关系(单层和递归两种方式)、获取依赖用例去运行
在用例管理页面,编辑的时候选择依赖用例,登录用例和获取项目信息两个接口互相依赖,点击确定的时候调用更新操作,会将两条用例绑定,A依赖B,B依赖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,要不然提示,依赖关系如下图:
配好依赖关系后,把False改成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.py的NO_LOGIN_LIST里不能有api,否则获取不到token,views.py下CaseRunView代码修改后如下图:
接下来启动异步任务,通过debug的方式celery -A celery_tasks.main worker -l debug -P eventlet启动,保证run_case和run_collection这两个方法加载进来,点击获取项目信息的运行按钮,打印出task_id、case_id和user_id,按照流程图点击运行时,拿到运行的case_id,调用celery异步任务更新task_id和status,获取到用例的异步任务,无论是多个还是单个用例都要获取依赖用例,复制case_utils.py里的Premise类下面的__init__(self)方法到tasks.py下的Run类中,self.rely_cases用来存找到的依赖用例,同时把get_premise_case_id和loop_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方法修改的代码如下图:
点击获取参数用例后面的运行按钮,前端ok,celery_tasks里可以看到如下: