zoukankan      html  css  js  c++  java
  • 报告的实现

    六、报告的实现

    先把create_data字典的代码复制到tasks.pyRun类的simple_run方法里,代码如下:

    # 创建报告的数据结构
    create_data = {
    'response': str(response),
    'case': case_obj,
    'batch': task_id,
    'status': status,
    'duration': 100,
    'user': models.User.objects.get(id=user_id),
    'case_collection': models.CaseCollection.objects.get(id=collection_id) if collection_id else None,
    'reason': reason,
    'params': json.dumps(data),
    'url': host + uri,
    'title': case_obj.title,
    'project': case_obj.project
    }

    修改代码,把simple_run方法里传入task_iduser_idcollection_id,collection_id默认=None,在run_case方法里,也要传入task_iduser_id,在create_data下面加上models.Report.objects.create(**create_data),新增代码如下图:

    点击用例管理页面的登录用例后的运行按钮,在日志里没有报错,查看report表里多出来一条数据,如下图:

    可以看到case_collection_id为空,因为在run_case方法里,没有传collection_id,因此默认就是None,用例的报告实现了

    七、更新用例状态

    接下来改变用例的状态,在models.Report.objects.create(**create_data)下面增加如下代码:

    if collection_id:  # 如果collection_id存在,知道是哪个集合的,如果不存在就是运行的用例
    pass
    else:
    models.Case.objects.filter(id=case_id).update(status=status) # status等于上面create_data里传的status

    重启异步任务服务,点击用例管理页面的登录用例后的运行按钮,在日志里没有报错,后台代码没有跑完,刷新页面还是运行中,等代码跑完后再刷新页面,登录用例对应的用例状态从运行中变成了执行完毕,因为case运行是一个异步任务,返回结果的时候case刚运行,运行完了再次刷新的时候状态才能改变,如下图:

    接下来实现集合的运行,新增代码如下图:

    重启异步任务服务,点击用例集合页面,勾选用例平台回归测试,点击运行按钮,在日志里没有报错,刷新页面,用例平台回归测试对应的集合状态从运行中变成了执行完毕,因为collection是异步任务,运行完了刷新的时候状态才能改变,如下图:

    同时在report表里可以看到多了两条记录,都是一个集合id的,如下图:

    接下来执行多用例,勾选两条用例,点击运行按钮,report表里多出三条记录,因为获取项目信息依赖于登录用例,所以登录用例运行两次,但是第二次登录用例和获取项目信息的批次号是一样的,如下图:

    同时页面里也显示两条用例都是执行完毕的状态

    最后开发查看的功能,查看用例,查看集合的状态,点击登录用例后的查看按钮,在NetworkHeaders里看到请求的url是http://127.0.0.1:8000/api/case_report?report_batch=3da0f12a-0de1-4ba6-a50e-cc9bc8943e31&id=11get请求方式,需要传一个report_batch和用例id,现在开发该接口,首先在urls.py里输入path('case_report', views.CaseReportView.as_view()),然后在views.py里输入如下图:

    class CaseReportView(View):
    def get(self, request):
    case_id = request.GET.get('id')
    report_batch = request.GET.get('report_batch')
    case = models.Case.objects.get(id=case_id)
    report = models.Report.objects.filter(batch=report_batch, case_id=case.id).first()
    if report:
    data = {
    'title': case.title,
    'run_time': report.create_time,
    'project_name': case.project.name,
    'status': report.status,
    'case_collection': report.case_collection if report.case_collection else '单用例运行',
    'duration': report.duration,
    'run_user': report.user.username,
    'url': report.url,
    'method': case.get_method_display(),
    'check': case.check,
    'reason': report.reason,
    'params': report.params,
    'response': report.response
    }
    return NbResponse(data=data)
    else:
    return NbResponse(-1, msg='用例运行中,请耐心等待..')

    点击查看按钮,可以看到测试结果的相关信息,如下图:

    但是请求方式是1,不知道是哪种请求方式,于是修改代码views.py里的CaseReportView类里的method字段,将value从case.method改成case.get_method_display(),重启服务再次点击查看,可以看到请求方式变成了POST,如下图:

    从上图发现少了一个header字段,要从表结构里加上,接下来开发集合的查看功能,点击用例平台回归测试后的查看按钮,在NetworkHeaders里看到请求的url是http://127.0.0.1:8000/api/collection_report?id=4&report_batch=31332761-bdee-4cab-8f44-4e64151b5648get请求方式,需要传一个report_batch集合id,现在开发该接口,首先在urls.py里输入path('collection_report', views.CollectionReportView.as_view()),然后在views.py里输入如下:

    class CollectionReportView(View):
    def get(self, request):
    case_collection_id = request.GET.get('id') # 获取集合id
    report_batch = request.GET.get('report_batch')
    case_collection = models.CaseCollection.objects.get(id=case_collection_id)
    report = models.Report.objects.filter(batch=report_batch, case_collection=case_collection.id).first()
    fail_count = models.Report.objects.filter(batch=report_batch, case_collection=case_collection.id,
    status=999).count()
    pass_count = models.Report.objects.filter(batch=report_batch, case_collection=case_collection.id,
    status=1).count()
    if report:
    data = {
    'case_collection': case_collection.name,
    'run_time': report.create_time,
    'case_count': case_collection.case.all().count(),
    'pass_count': pass_count,
    'run_user': report.user.username,
    'fail_count': fail_count,
    'duration': 100,
    'report_batch': case_collection.report_batch,
    }
    return NbResponse(data=data)
    else:
    return NbResponse(-1, msg='用例集合运行中,请耐心等待..')

    重启服务,刷新页面,点击查看按钮,可以看到集合的报告,如下图:

    点击查看详细,在NetworkHeaders里看到请求的url是http://127.0.0.1:8000/api/report?case_collection=4&batch=cfb093ac-0e47-4207-98bf-78ca1316c447get请求方式,现在开发该接口,首先在urls.py里输入path('report', views.ReportView.as_view()),然后在views.py里输入如下:

    class ReportView(BaseView):
    search_field = ['title']
    filter_field = ['project', 'case_collection', 'batch']
    model_class = models.Report
    exclude_fields = ['is_delete']

    def get(self, request):
    page_data, page_obj = self.get_query_set_page_data() # 获取分页之后的数据
    data_list = []
    for instance in page_data: #
    model_dict = model_to_dict(instance, self.fields, self.exclude_fields) # 转成字典
    model_dict['title'] = instance.case.title
    model_dict['project_name'] = instance.case.project.name
    model_dict['case_collection'] = instance.case_collection.name if instance.case_collection else '单用例运行'
    model_dict['status'] = instance.case.status
    model_dict['run_user'] = instance.user.username
    model_dict['run_time'] = instance.create_time
    model_dict['check'] = instance.case.check
    model_dict['method'] = instance.case.get_method_display()
    data_list.append(model_dict)
    return NbResponse(data=data_list, count=page_obj.count)

    重启服务再次刷新页面,点击查看按钮,再点击详细报告,弹出如下图:

    点击下拉按钮,可以看到详细的报告,如下图:

    把鼠标放到鼠标悬浮显示参数上,可以看到返回的所有参数,如下图:

    接收前端的最新代码,在2.0版本里可以看到数据报表,刷新页面,在NetworkHeaders里看到请求的url是http://127.0.0.1:8000/api/home_pageget请求方式,现在开发该接口,首先在urls.py里输入path('home_page', views.HomePageView.as_view()),然后在models.py里输入如下:

    class HomeData(BaseModel):
    date = models.DateField(verbose_name='统计时间', unique=True)
    pass_count = models.IntegerField(verbose_name='成功次数', default=0)
    all_count = models.IntegerField(verbose_name='执行次数', default=0)
    fail_count = models.IntegerField(verbose_name='失败次数', default=0)

    class Meta:
    verbose_name = '首页数据统计'
    verbose_name_plural = verbose_name
    db_table = 'home_data'
    ordering = ['-id']

    migrations生成表结构,migrate生成表,在views.py里输入HomePageView类,如下:

    class HomePageView(View):
    def get_source_data(self, day):
    pass_count = models.Report.objects.filter(create_time__contains=day, status=1).count()
    fail_count = models.Report.objects.filter(create_time__contains=day, status=999).count()
    all_count = models.Report.objects.filter(create_time__contains=day).count()
    data = {
    "pass_count": pass_count,
    "fail_count": fail_count,
    "all_count": all_count
    }
    return data

    def get(self, request):
    import datetime
    today = datetime.date.today()
    # 统计数据 当天数据
    data = self.get_source_data(today)
    if models.HomeData.objects.filter(date=today).first():
    models.HomeData.objects.filter(date=today).update(**data)
    else:
    data.update({"date": today})
    models.HomeData.objects.create(**data)
    # 昨天数据

    yesterday = today - datetime.timedelta(days=1)
    data = self.get_source_data(yesterday)
    if models.HomeData.objects.filter(date=yesterday).first():
    models.HomeData.objects.filter(date=yesterday).update(**data)
    else:
    data.update({"date": yesterday})
    models.HomeData.objects.create(**data)

    # 最大执行次数和最大成功次数,用于确认页面的y轴数据
    max_all_count = models.Report.objects.all().count()
    max_pass_count = models.Report.objects.filter(status=1).count()

    project_count = models.Project.objects.filter(is_delete=1).count()
    interface_count = models.Interface.objects.filter(is_delete=1).count()
    collection_count = models.CaseCollection.objects.filter(is_delete=1).count()
    case_count = models.Case.objects.filter(is_delete=1).count()
    home_data = models.HomeData.objects.all().values()

    pass_count = qs_to_list(home_data, 'pass_count')
    date = qs_to_list(home_data, 'date')
    all_count = qs_to_list(home_data, 'all_count')
    fail_count = qs_to_list(home_data, 'fail_count')
    data = {
    'project_count': project_count,
    'interface_count': interface_count,
    'collection_count': collection_count,
    'case_count': case_count,
    'pass_count': pass_count,
    'date': date,
    'all_count': all_count,
    'fail_count': fail_count,
    'max_all_count': max_all_count,
    'max_pass_count': max_pass_count
    }
    return NbResponse(data=data)

    还要导入from utils.tools import qs_to_list,在utils目录下的tools.py里输入如下:

    def qs_to_list(d, f):
    """
    根据传入的queryset,将qs转成列表
    :param d:
    :param f:
    :return:
    """
    lis = []
    for item in d:
    if isinstance(item[f], datetime.date):
    value = item[f].strftime('%Y-%m-%d')
    lis.append(value)
    else:
    lis.append(item[f])
    return lis

    重启服务,刷新数据报表页面,可以看到项目数量接口数量用例集合用例数量以及昨天和今天执行用例数通过用例数失败用例数,运行用例或用例集合,可以看到图表上变化的用例数,在home_data表里可以看到如下统计:

  • 相关阅读:
    WordPress主题开发:数据调用
    WordPress主题开发:style.css主题信息标记
    WordPress主题开发:开启侧边栏小工具功能
    WordPress主题开发:开启导航菜单功能
    Instrument 实用详解
    IOS开发~GCD--讲的巨详细,而且还有例子工程
    CATransition 实践
    让提示界面始终保持在页面的最前端(页面置顶)
    xcode调试查看变量的值
    GCD实现多线程 实践
  • 原文地址:https://www.cnblogs.com/laosun0204/p/12705551.html
Copyright © 2011-2022 走看看