平台分析
页面模板
adminlte
bootstrap
jquery
django
表
接口表
- 接口title
- 描述
- 接口数量
- 通过数量
接口用例表
- 所属接口,外键
- 用例title
- 用例描述
- 预期值
- url
- 参数
- 请求类型
- 用例报告
- 执行状态: 执行和未执行
- 通过:已通过和未通过
Excel上传
import xlrd from django.shortcuts import render, redirect, HttpResponse from django.db import transaction
def import_case(request, pk):
""" 为接口批量导入用例, pk:接口的pk """
if request.method == "POST":
try:
with transaction.atomic(): # 事务
# 读取Excel表格
book = xlrd.open_workbook(file_contents=request.FILES.get('excel').read())
sheet = book.sheet_by_index(0)title = sheet.row_values(0) ''' ['cnodejs项目', 'get /topics 主题首页', 'https://cnodejs.org/api/v1/topics', 'get', '', '{"success":true}'] ''' for row in range(1, sheet.nrows): row = sheet.row_values(row) # break models.Case.objects.create( case_API_id=pk, case_title=row[0], case_desc=row[1], case_url=row[2], case_method=row[3], case_params=row[4], case_expect=row[-1], ) return redirect('/case_list/{}'.format(pk)) except Exception as e: return render(request, 'import_case.html', {"error": "文件格式不对,只能上传 xls/xlsx 的 {}".format(e)}) else: return render(request, 'import_case.html',{"error": ""})
下载
from utils.execute_case import execute
from django.http import JsonResponse
from django.http import FileResponse
def case_execute(request, pk):
""" 执行用例 PK:要执行用例的pk"""
if request.method == "POST":
pass
else:
# 1. 从前端获取要执行的用例id,然后从数据库取出这个用例对象
case_obj = models.Case.objects.filter(pk=pk).first()
# 2. 从用例对象中,提取相关字段,执行这个用例
file_path = execute(case_obj)
response = FileResponse(open(file_path, 'rb'))
response['Content-Type'] = 'application/octet-stream'
# filename的名称不能含有中文
response['Content-Disposition'] = 'attachment;filename="{}.html"'.format('report')
# print(111111, case_obj.case_title)
return response
models 自定义字段
from django.db import models class API(models.Model): """ 接口表 """ api_title = models.CharField(max_length=32, verbose_name='接口名称') api_desc = models.CharField(max_length=128, verbose_name='接口描述')
def __str__(self): return self.api_title def xxoo(self): if self.case_set.count(): a = "%s%% " % (self.case_set.filter(case_pass_status=1).count() / self.case_set.count() * 100) return a else: return 0
前端调用:
{% for foo in api_obj %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ foo.api_title }}</td>
<td>{{ foo.api_desc }}</td>
<td>{{ foo.case_set.count }}</td> <!-- 接口下面有多少用例 -->
<td>{{ foo.xxoo }} </td> <!-- 接口下面的用例有多少通过的,计算公式: 通过/总数*100 -->
<td>
<a href="{% url 'api_edit' foo.pk %}" class="btn btn-success btn-sm">编辑接口</a>
<a href="{% url 'api_del' foo.pk %}" class="btn btn-success btn-sm">删除接口</a>
<a href="{% url 'case_add' foo.pk %}" class="btn btn-success btn-sm">添加用例</a>
<a href="{% url 'import_case' foo.pk %}" class="btn btn-success btn-sm">批量导入</a>
<a href="{% url 'case_list' foo.pk %}" class="btn btn-success btn-sm">查看用例</a>
</td>
</tr>
{% endfor %}
执行用例的思路
第一种,执行单个用例
点击执行
后台过滤出来当前的用例,将用例对象返回
unittest/pytest框架做
从用例对象中,提取各个参数,发请求
校验请求结果
断言
生成测试报告
将该测试报告存储到数据库
- 将HTML文件存储都某个目录下,数据库存储文件的路径
- 直接将HTML文本存储数据的字段
用例的执行状态,通过状态,都要改
如何将测试报告返回给前端
- 直接将报告下载到本地
批量执行(可选)
定时任务
定时任务,https://www.cnblogs.com/Neeo/p/10435059.html 发邮件:https://www.cnblogs.com/Neeo/articles/11199085.html
- 每天检查接口表,检查有没有当天要结束的接口
- 如果检查到有当天要结束的接口
- 就把该接口下的所有用例执行一遍
- 生成测试报告
实现步骤
- 接口表,添加字段,接口的开始/结束时间
- 每天固定的时间,读取接口表,判断结束时间是否为当天
- 如果为当天要结束的,把该接口下的用例执行一遍
- 生成测试报告,保存到数据库
- 前端能查询该条执行记录
- 下载这个记录的测试报告
datetime
import os import datetime import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MB.settings") django.setup() from app01 import models
if name == 'main':
print(datetime.datetime.now())
today = datetime.date.today()
print(today.year, today.month)