adminlte
bootstrap
jquery
表
接口表
接口用例表
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
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框架做
从用例对象中,提取各个参数,发请求
校验请求结果
断言
生成测试报告
将该测试报告存储到数据库
用例的执行状态,通过状态,都要改
如何将测试报告返回给前端
定时任务,https://www.cnblogs.com/Neeo/p/10435059.html 发邮件:https://www.cnblogs.com/Neeo/articles/11199085.html
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)
Excel上传、下载、models 自定义字段、批量执行(可选)
原文:https://www.cnblogs.com/g15009428458/p/12168754.html