Commit 973374a0 authored by liangfenglong's avatar liangfenglong

234

parent ff3eb667
File added
from .tasks import *
\ No newline at end of file
from django.contrib import admin
# Register your models here.
from django.apps import AppConfig
class BaseConfig(AppConfig):
name = 'base'
def task():
print('$' * 100)
# Generated by Django 2.2.3 on 2020-11-04 19:04
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Case',
fields=[
('case_id', models.AutoField(primary_key=True, serialize=False)),
('case_name', models.CharField(max_length=100)),
('description', models.CharField(max_length=200)),
('content', models.TextField()),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
),
migrations.CreateModel(
name='Development',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('tel', models.CharField(max_length=20)),
],
),
migrations.CreateModel(
name='Environment',
fields=[
('env_id', models.AutoField(primary_key=True, serialize=False)),
('env_name', models.CharField(max_length=100)),
('description', models.CharField(max_length=200)),
('url', models.CharField(max_length=100)),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
),
migrations.CreateModel(
name='HomeIndex',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('img_name', models.CharField(default='', max_length=255)),
('project_num', models.IntegerField(null=True)),
('env_num', models.IntegerField(null=True)),
('interface_num', models.IntegerField(null=True)),
('case_num', models.IntegerField(null=True)),
('plan_num', models.IntegerField(null=True)),
('report_num', models.IntegerField(null=True)),
('task_num', models.IntegerField(null=True)),
('qrcode_name', models.CharField(default='', max_length=255)),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
),
migrations.CreateModel(
name='Plan',
fields=[
('plan_id', models.AutoField(primary_key=True, serialize=False)),
('plan_name', models.CharField(max_length=100)),
('description', models.CharField(max_length=200)),
('content', models.TextField()),
('report_name', models.CharField(default='', max_length=255)),
('make', models.IntegerField(null=True)),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('case', models.ManyToManyField(to='base.Case')),
('environment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='base.Environment')),
],
),
migrations.CreateModel(
name='Variable',
fields=[
('variable_id', models.AutoField(primary_key=True, serialize=False)),
('variable_name', models.CharField(max_length=100)),
('variable_value', models.CharField(max_length=100)),
('description', models.CharField(max_length=200)),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
),
migrations.CreateModel(
name='Report',
fields=[
('report_id', models.AutoField(primary_key=True, serialize=False)),
('report_name', models.CharField(max_length=255)),
('pic_name', models.CharField(default='', max_length=255)),
('totalTime', models.CharField(default='', max_length=50)),
('startTime', models.CharField(default='', max_length=50)),
('content', models.TextField()),
('case_num', models.IntegerField(null=True)),
('pass_num', models.IntegerField(null=True)),
('fail_num', models.IntegerField(null=True)),
('error_num', models.IntegerField(null=True)),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('path', models.FilePathField(null=True)),
('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='base.Plan')),
('update_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Project',
fields=[
('prj_id', models.AutoField(primary_key=True, serialize=False)),
('prj_name', models.CharField(max_length=100)),
('description', models.CharField(max_length=200)),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('update_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.AddField(
model_name='plan',
name='project',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='base.Project'),
),
migrations.AddField(
model_name='plan',
name='update_user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.CreateModel(
name='Interface',
fields=[
('if_id', models.AutoField(primary_key=True, serialize=False)),
('if_name', models.CharField(max_length=100)),
('url', models.CharField(max_length=100)),
('method', models.CharField(max_length=10)),
('data_type', models.CharField(max_length=10)),
('description', models.CharField(max_length=200)),
('request_headers', models.TextField()),
('request_params', models.TextField()),
('request_body', models.TextField()),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='base.Project')),
('update_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.AddField(
model_name='environment',
name='project',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='base.Project'),
),
migrations.AddField(
model_name='environment',
name='update_user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='case',
name='interface',
field=models.ManyToManyField(to='base.Interface'),
),
migrations.AddField(
model_name='case',
name='project',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='base.Project'),
),
migrations.AddField(
model_name='case',
name='update_user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]
# Generated by Django 2.2.3 on 2020-11-23 15:25
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('base', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='TestUser',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('telephone', models.CharField(max_length=15)),
('password', models.CharField(max_length=20)),
('desc', models.CharField(max_length=100, null=True)),
('create_time', models.DateTimeField(auto_now_add=True)),
('update_time', models.DateTimeField(auto_now=True)),
('operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
],
),
migrations.AddField(
model_name='case',
name='login_user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='base.TestUser'),
),
]
# Generated by Django 2.2.3 on 2020-12-11 17:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('base', '0002_auto_20201123_1525'),
]
operations = [
migrations.AddField(
model_name='variable',
name='params_used',
field=models.BooleanField(default=False),
),
]
from django.db import models
from django.contrib.auth.models import User
# `
class Project(models.Model):
prj_id = models.AutoField(primary_key=True, null=False)
prj_name = models.CharField(max_length=100)
# sign = models.ForeignKey('Sign', on_delete=models.CASCADE, default='')
description = models.CharField(max_length=200)
update_time = models.DateTimeField('更新时间', auto_now=True)
update_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
def __str__(self):
return self.prj_name
class Environment(models.Model):
env_id = models.AutoField(primary_key=True, null=False)
env_name = models.CharField(max_length=100)
project = models.ForeignKey('Project', on_delete=models.CASCADE)
description = models.CharField(max_length=200)
url = models.CharField(max_length=100)
update_time = models.DateTimeField('更新时间', auto_now=True)
update_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
def __str__(self):
return self.env_name
class Interface(models.Model):
if_id = models.AutoField(primary_key=True, null=False)
if_name = models.CharField(max_length=100)
url = models.CharField(max_length=100)
method = models.CharField(max_length=10)
data_type = models.CharField(max_length=10)
project = models.ForeignKey('Project', on_delete=models.CASCADE)
description = models.CharField(max_length=200)
request_headers = models.TextField()
request_params = models.TextField()
request_body = models.TextField()
update_time = models.DateTimeField('更新时间', auto_now=True)
update_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
def __str__(self):
return self.if_name
class Case(models.Model):
case_id = models.AutoField(primary_key=True, null=False)
case_name = models.CharField(max_length=100)
project = models.ForeignKey('Project', on_delete=models.CASCADE)
description = models.CharField(max_length=200)
content = models.TextField()
update_time = models.DateTimeField('更新时间', auto_now=True)
update_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
interface = models.ManyToManyField(Interface)
login_user = models.ForeignKey('TestUser',on_delete=models.SET_NULL,null=True)
def __str__(self):
return self.case_name
class Plan(models.Model):
plan_id = models.AutoField(primary_key=True, null=False)
plan_name = models.CharField(max_length=100)
project = models.ForeignKey('Project', on_delete=models.CASCADE)
environment = models.ForeignKey('Environment', on_delete=models.CASCADE)
description = models.CharField(max_length=200)
content = models.TextField()
report_name = models.CharField(max_length=255, default="")
make = models.IntegerField(null=True)
update_time = models.DateTimeField('更新时间', auto_now=True)
update_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
case = models.ManyToManyField(Case)
def __str__(self):
return self.plan_name
class Report(models.Model):
report_id = models.AutoField(primary_key=True, null=False)
report_name = models.CharField(max_length=255)
pic_name = models.CharField(max_length=255, default='')
totalTime = models.CharField(max_length=50, default='')
startTime = models.CharField(max_length=50, default='')
plan = models.ForeignKey('Plan', on_delete=models.CASCADE)
content = models.TextField()
case_num = models.IntegerField(null=True)
pass_num = models.IntegerField(null=True)
fail_num = models.IntegerField(null=True)
error_num = models.IntegerField(null=True)
update_time = models.DateTimeField('更新时间', auto_now=True)
update_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
path = models.FilePathField(null=True)
def __str__(self):
return self.report_name
class HomeIndex(models.Model):
id = models.AutoField(primary_key=True, null=False)
img_name = models.CharField(max_length=255, default='')
project_num = models.IntegerField(null=True)
env_num = models.IntegerField(null=True)
interface_num = models.IntegerField(null=True)
case_num = models.IntegerField(null=True)
plan_num = models.IntegerField(null=True)
# sign_num = models.IntegerField(null=True)
report_num = models.IntegerField(null=True)
task_num = models.IntegerField(null=True)
qrcode_name = models.CharField(max_length=255, default='')
update_time = models.DateTimeField('更新时间', auto_now=True)
def __str__(self):
return
# 全局变量
class Variable(models.Model):
variable_id = models.AutoField(primary_key=True, null=False)
variable_name = models.CharField(max_length=100)
variable_value = models.CharField(max_length=100)
description = models.CharField(max_length=200)
update_time = models.DateTimeField('更新时间', auto_now=True)
params_used = models.BooleanField(default=False)
def __str__(self):
return self.variable_name
# 开发对应表
class Development(models.Model):
name = models.CharField(max_length=100) # 开发名称
tel = models.CharField(max_length=20) # 手机号
def __str__(self):
return self.name
class TestUser(models.Model):
telephone = models.CharField(max_length=15)
password = models.CharField(max_length=20)
desc = models.CharField(max_length=100,null=True)
operator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
# !/usr/bin/env python
# coding=utf-8
from django.core.cache import cache
from django.conf import settings
from redis import Redis
r = Redis(**settings.REDIS)
def page_cache(timeout):
def wrap1(view_func): # page_cache装饰器
def wrap2(request, *args, **kwargs):
key = 'Response-{}'.format(request.get_full_path()) # 拼接唯一的key
response = cache.get(key) # 从缓存中获取数据
print('从缓存中获取数据:{}'.format(response))
if response is None:
# 获取数据库中的数据,在添加到缓存中
response = view_func(request, *args, **kwargs)
cache.set(key, response, timeout)
print('从数据库中获取:{}'.format(response))
return response
return wrap2
return wrap1
#!/user/bin/env python
# coding=utf-8
'''
# 创 建 人: 李木子
# 文 件 名: performance.py
# 说 明: locust 方法
# 创建时间: 2019/6/23
'''
import sys
sys.path.insert(0, r'/Users/edz/Downloads/EasyTest_master')
from locust import HttpLocust, TaskSet, task, Locust, events
from locust.clients import HttpSession
import queue, json, subprocess, os
from lib.sql_parameter import get_parameters
from lib.public import get_extract
import logging
log = logging.getLogger('log')
class UserBehavior(TaskSet): # 定义用户行为
def on_start(self):
self.if_dict_list, self.url = get_parameters()
self.extract_dict = ''
def teardown(self):
log.info('结束!')
@task(1)
def test_request(self):
session = HttpSession(self.url)
for interface_ in self.if_dict_list:
for interface in interface_:
if isinstance(interface['body'], dict):
for k, v in interface['body'].items():
if '$' in str(v):
interface['body'][k] = self.extract_dict[v[1:]]
if interface['method'] in ["post", "put"]:
if interface['data_type'] == 'json':
res = session.request(method=interface['method'], url=interface['url'],
json=interface['body'], headers=interface['header'])
elif interface['data_type'] == 'data':
res = session.request(method=interface['method'], url=interface['url'],
data=interface['body'], headers=interface['header'])
elif interface['method'] in ["get", "delete"]:
if interface['is_sign']:
if interface['sign_type'] == 4:
res = session.request(method=interface['method'], url=interface['url'],
params={'data': interface['body']},
headers=interface['header'])
else:
res = session.request(method=interface['method'], url=interface['url'],
params=interface['body'],
headers=interface['header'])
if interface['extract']:
self.extract_dict = get_extract(interface['extract'], res.text)
log.info(res.text)
class WebsiteUser(Locust): # 设置性能测试;
task_set = UserBehavior # 指向一个定义了的用户行为类;
min_wait = 3000 # 用户执行任务之间等待时间的下界,单位:毫秒;
max_wait = 6000 # 用户执行任务之间等待时间的上界,单位:毫秒;
def run():
subprocess.check_call(
'locust -f /Users/edz/Downloads/EasyTest_master/base/performance.py')
if __name__ == '__main__':
run()
"""
需要 在 Terminal 中 手动执行 locust -f /Users/edz/Downloads/EasyTest_master/base/performance.py
"""
# !/usr/bin/python
# coding:utf-8
from __future__ import absolute_import
from EasyTest.celery import app
from celery import shared_task
import time, logging, os
from common.connectMySql import SqL
from lib.public import DrawPie, remove_logs
from datetime import datetime
from lib.sql_parameter import test_case, get_sign, get_env
from run_this import send_email
from common import readConfig
log = logging.getLogger('log')
sql = SqL()
# @app.task
# def add(x, y):
# return x + y
# @shared_task
# def hello_world():
# log.info('运行定时任务!')
# with open("output.txt", "a") as f:
# f.write("hello world --->{}".format(time.strftime('%Y-%m-%d %H-%M-%S')))
# f.write("\n")
@shared_task
def run_plan():
log.info('run plan------->执行测试计划中<--------------')
start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
plan = sql.execute_sql(
'select bp.environment_id, bp.content,bp.plan_name,bp.plan_id from base_plan as bp where bp.is_task = 1',
dict_type=True)
if plan == None:
log.error('查询定时任务计划为空!')
return
plan_id = plan['plan_id']
env_id = plan['environment_id']
case_id_list = eval(plan['content'])
begin_time = time.clock()
prj_id, env_url, private_key = get_env(env_id)
sign_type = get_sign(prj_id)
case_num = len(case_id_list)
content = []
pass_num = 0
fail_num = 0
error_num = 0
i = 0
for case_id in case_id_list:
case_result = test_case(case_id, env_id, case_id_list, sign_type, private_key, env_url, begin_time)
content.append(case_result)
end_time = time.clock()
totalTime = str(end_time - begin_time) + 's'
for step in content:
for s in step['step_list']:
if s["result"] == "pass":
pass_num += 1
i += 1
s['id'] = i
if s["result"] == "fail":
fail_num += 1
i += 1
s['id'] = i
if s["result"] == "error":
error_num += 1
i += 1
s['id'] = i
pic_name = DrawPie(pass_num, fail_num, error_num)
report_name = plan['plan_name'] + "-" + str(start_time)
sql.execute_sql(
'insert into base_report(report_name,pic_name,totalTime,startTime,content,case_num,pass_num,fail_num,error_num,plan_id,update_time, update_user) values("{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}", "{}")'.format(
report_name,pic_name,totalTime,start_time,str(content).replace('"', "'"), case_num,pass_num,fail_num,
error_num,plan_id, str(datetime.now()), 'root'))
sql.execute_sql('update base_plan set make=0, update_time="{}"'.format(datetime.now()))
if fail_num or error_num:
# report_file_html = get_new_report_html(report_path)
# report_file_list.append(report_file_html)
user = readConfig.user
# qq邮箱授权码
pwd = readConfig.pwd
user_163 = readConfig.user_163
# 163邮箱授权码
pwd_163 = readConfig.pwd_163
# _to = ['1977907603@qq.com', 'liyongfeng@tzx.com.cn']
_to = readConfig.to
smtp_service = readConfig.smtp_service
smtp_service_163 = readConfig.smtp_service_163
# send_email(user, pwd, user_163, pwd_163, _to, smtp_service, smtp_service_163)
log.info('测试任务执行完成!')
@shared_task
def delete_logs():
log.info('remove logs------->删除过期日志中<--------------')
report_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/templates' + '/report'
# report_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\templates' + '\\report'
logs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/' + 'logs' # 拼接删除目录完整路径
# logs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\' + 'logs' # 拼接删除目录完整路径
pic_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/media'
report_num = remove_logs(report_path)
logs_num = remove_logs(logs_path)
pic_num = remove_logs(pic_path)
total_num = report_num + logs_num + pic_num
if total_num == 0:
log.info('remove logs------->没有要删除的文件.<--------------')
else:
log.info('remove logs------->删除过期日志文件数量:{}<--------------'.format(total_num))
from django.test import TestCase
# Create your tests here.
# !/usr/bin/env python
# coding=utf-8
# from django.conf import settings
from django.conf.urls import url
# from django.conf.urls.static import static
# from django.views.generic.base import RedirectView
from . import views, web_views
urlpatterns = [
# 项目
url(r'project/', view=views.project_index, name='project'),
url(r'project_add/', view=views.project_add, name='project_add'),
url(r'project_update/', view=views.project_update, name='project_update'),
url(r'project_delete/', view=views.project_delete, name='project_delete'),
# 测试环境
url(r'env/', view=views.env_index, name='env'),
url(r'env_add/', view=views.env_add, name='env_add'),
url(r'env_update/', view=views.env_update, name='env_update'),
url(r'env_delete/', view=views.env_delete, name='env_delete'),
# 接口
url(r'interface/', view=views.interface_index, name='interface'),
url(r'interface_add/', view=views.interface_add, name='interface_add'),
url(r'interface_update/', view=views.interface_update, name='interface_update'),
url(r'interface_delete/', view=views.interface_delete, name='interface_delete'),
#测试账号
url(r'test_user/index',view=views.test_user_index,name='test_user_index'),
url(r'test_user/(\d+)',view=views.test_user,name='test_user_edit'),
url(r'test_user/add',view=views.test_user_add,name='test_user_add'),
url(r'test_user/del',view=views.test_user_del),
# 用例
url(r'case/', view=views.case_index, name='case'),
url(r'case_add/', view=views.case_add, name='case_add'),
url(r'case_update/', view=views.case_update, name='case_update'),
url(r'case_delete/', view=views.case_delete, name='case_delete'),
url(r'case_run/', view=views.case_run, name='case_run'),
url(r'case_logs/', view=views.case_logs, name='case_logs'),
url(r'case_copy/', view=views.case_copy, name='case_copy'),
# 测试计划
url(r'plan/', view=views.plan_index, name='plan'),
url(r'plan_add/', view=views.plan_add, name='plan_add'),
url(r'plan_update/', view=views.plan_update, name='plan_update'),
url(r'plan_delete/', view=views.plan_delete, name='plan_delete'),
url(r'plan_run/', view=views.plan_run, name='plan_run'),
url(r'plan_unittest_run/', view=views.plan_unittest_run, name='plan_unittest_run'),
# 报告
url(r'report/', view=views.report_index, name='report_page'),
url(r'report_search/', view=views.report_search, name='report_search'),
# 异步请求获取数据
url(r'findata/', view=views.findata, name='findata'),
# 报告页面展示
url(r'report_page/', view=views.report_page, name='report'),
url(r'report_logs/', view=views.report_logs, name='report_logs'), # 日志
url(r'report_delete/', view=views.report_delete, name='report_delete'),
# 下载
url(r'file_download/', view=views.file_download, name='file_download'),
# 添加用户
url(r'user/', view=views.user_index, name='user_index'),
# 全局变量
url(r'variable/', view=views.variable, name='variable'),
url(r'variable_add/', view=views.variable_add, name='variable_add'),
url(r'variable_update/', view=views.variable_update, name='variable_update'),
url(r'variable_delete/', view=views.variable_delete, name='variable_delete'),
# web
url(r'web/', view=web_views.webcase_index, name='webcase_index'),
url(r'web_add/', view=web_views.webcase_add, name='webcase_add'),
]
import os
import sys
import time
import json
import logging
import unittest
import importlib
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.conf import settings
from django.http import StreamingHttpResponse
from base.models import Project, Environment, Interface, Case, Plan, Report, Variable, Development, TestUser
from django.contrib.auth.models import User # django自带user
from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
from django.db.models import Q # 与或非 查询
from lib.execute import Test_execute, get_user # 执行接口
# from dj .models import PeriodicTask, CrontabSchedule, IntervalSchedule
from datetime import timedelta, datetime
from lib.swagger import AnalysisJson
from common.config import testDate
# from base.page_cache import page_cache # redis缓存
from lib.public import get_new_report_html, DrawPie, is_number, paginator
import run_this
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
log = logging.getLogger('log') # 初始化log
report_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/templates' + '/report'
# report_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\templates' + '\\report'
logs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/' + 'logs' # 拼接删除目录完整路径
# logs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\' + 'logs' # 拼接删除目录完整路径
start_time = '' # 执行测试计划开始时间
totalTime = '' # 执行测试计划运行时间
now_time = '' # 饼图命名区分
class_name = '' # 执行测试类
data_types = ["data", 'json', 'sql', 'file']
method_types = ['get', 'post', 'delete', 'put']
# 先写一个form放在这里
from django.forms import forms, widgets, fields
class TestUserForm(forms.Form):
telephone = fields.CharField(label='手机号', max_length=11, min_length=11,
widget=widgets.Input(attrs={'class': "form-control"}),
validators=[RegexValidator(r'^1\d{10}$', '这不是手机号吧~~')])
password = fields.CharField(label='登录密码', empty_value='密码', widget=widgets.Input(attrs={'class': "form-control"}))
desc = fields.CharField(label='描述信息', widget=widgets.Textarea(attrs={'class': "form-control"}), required=False)
def test_user_index(request):
user_list = TestUser.objects.all()
page = request.GET.get('page')
contacts = paginator(user_list, page)
return render(request, 'base/user/index.html', {'user_list': user_list, "contacts": contacts})
def test_user(request, uid):
data = TestUser.objects.get(id=uid)
if request.method.upper() == 'GET':
info = TestUserForm(data.__dict__)
return render(request, 'base/user/update.html', {"formd": info})
else:
info = TestUserForm(request.POST)
error_msg = None
if info.is_valid():
data = info.clean()
# 先判断是否重复了手机号
_q = TestUser.objects.exclude(id=uid).filter(telephone=data.get('telephone'))
if _q.exists():
error_msg = '该手机号已被创建!'
return render(request, 'base/user/update.html', {"formd": info, 'error_msg': error_msg})
data.update(operator=request.user)
TestUser.objects.filter(id=uid).update(**data)
return redirect('test_user/index')
else:
return render(request, 'base/user/update.html', {"formd": info})
def test_user_add(request):
if request.method.upper() == 'GET':
info = TestUserForm()
return render(request, 'base/user/add.html', {"formd": info})
else:
info = TestUserForm(request.POST)
error_msg = None
if info.is_valid():
data = info.clean()
# 先判断是否重复了手机号
_q = TestUser.objects.filter(telephone=data.get('telephone'))
if _q.exists():
error_msg = '该手机号已被创建!'
return render(request, 'base/user/add.html', {"formd": info, 'error_msg': error_msg})
data.update(operator=request.user)
TestUser.objects.create(**data)
return redirect('test_user/index')
else:
return render(request, 'base/user/add.html', {"formd": info})
def test_user_del(req):
data = req.POST
TestUser.objects.filter(id=data.get('uid')).delete()
return HttpResponse(json.dumps({'code': 0, 'message': ''}))
# 项目首页
@login_required(login_url=settings.LOGIN_URL)
def project_index(request):
print('request.META:', request.META)
prj_list = Project.objects.all() # 按照user_id查询项目
page = request.GET.get('page')
contacts = paginator(prj_list, page)
return render(request, "base/project/index.html", {"prj_list": prj_list, 'contacts': contacts})
# 增加项目
@login_required(login_url=settings.LOGIN_URL)
def project_add(request):
if request.method == 'POST':
error = ''
prj_name = request.POST['prj_name'].strip()
if prj_name == '': # 判断输入框
error = '项目名称不能为空!'
else:
name_same = Project.objects.filter(prj_name=prj_name).exists()
if name_same:
error = '项目: {},已存在!'.format(prj_name)
else:
description = request.POST['description']
prj = Project(prj_name=prj_name, description=description)
prj.save()
return HttpResponseRedirect("/base/project/")
return render(request, "base/project/add.html", {"error": error})
return render(request, "base/project/add.html")
# 项目编辑
@login_required(login_url=settings.LOGIN_URL)
def project_update(request):
if request.method == 'POST':
error = ''
prj_name = request.POST['prj_name'].strip()
prj_id = int(request.POST['prj_id'])
if prj_name == '': # 判断输入框
error = '项目名称不能为空!'
else:
name_same = Project.objects.exclude(prj_id=prj_id).filter(prj_name=prj_name).exists()
if name_same:
error = '项目: {},已存在!'.format(prj_name)
else:
description = request.POST['description']
obj = Project.objects.get(prj_id=prj_id)
obj.prj_name = prj_name
obj.description = description
obj.save()
return redirect("/base/project/")
return render(request, "base/project/update.html", {"error": error})
prj_id = int(request.GET['prj_id'])
prj = Project.objects.get(prj_id=prj_id)
return render(request, "base/project/update.html", {"prj": prj})
# 删除项目
@login_required(login_url=settings.LOGIN_URL)
def project_delete(request):
if request.method == 'GET':
res = {'code': 0, 'message': ''}
# 不能随意删,需要去掉使用了该项目的其他内容
prj_id = request.GET['prj_id']
if Environment.objects.filter(project_id=prj_id).exists():
res = {'code': 1, 'message': '有测试环境使用了该项目,请先删除测试环境。'}
elif Interface.objects.filter(project_id=prj_id).exists():
res = {'code': 1, 'message': '有接口使用了该项目,请先删除相关接口。'}
elif Case.objects.filter(project_id=prj_id).exists():
res = {'code': 1, 'message': '有用例使用了该项目,请先删除相关用例。'}
elif Plan.objects.filter(project_id=prj_id).exists():
res = {'code': 1, 'message': '有测试计划使用了该项目,请先删除相关测试计划。'}
else:
Project.objects.filter(prj_id=prj_id).delete()
return HttpResponse(json.dumps(res))
# return redirect("base/project/")
# 测试环境首页
# @login_required
# @page_cache(5)
@login_required(login_url=settings.LOGIN_URL)
def env_index(request):
envs = Environment.objects.all()
# if env:
# env_list.append(env)
page = request.GET.get('page')
contacts = paginator(envs, page)
return render(request, "base/env/index.html", {"contacts": contacts})
# 添加环境
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def env_add(request):
prj_list = Project.objects.all()
if request.method == 'POST':
env_name = request.POST['env_name'].strip()
if env_name == '':
return render(request, 'base/env/add.html', {'name_error': '环境名称不能为空!', "prj_list": prj_list})
# name_same = Environment.objects.filter(project__user_id=user_id).filter(env_name=env_name)
name_exit = Environment.objects.filter(env_name=env_name)
if name_exit:
return render(request, 'base/env/add.html',
{'name_error': '环境: {},已存在!'.format(env_name), "prj_list": prj_list})
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
url = request.POST['url'].strip()
if url == '':
return render(request, 'base/env/add.html', {'url_error': 'url不能为空!', "prj_list": prj_list})
description = request.POST['description']
name = request.user
userid = User.objects.filter(username=name).first()
env = Environment(env_name=env_name, url=url, project=project,
description=description, update_user_id=userid.id)
env.save()
return HttpResponseRedirect("/base/env/")
return render(request, "base/env/add.html", {"prj_list": prj_list})
# 测试环境更新
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def env_update(request):
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
if request.method == 'POST':
env_id = request.POST['env_id']
env_name = request.POST['env_name'].strip()
if env_name == '':
env = Environment.objects.get(env_id=env_id)
return render(request, 'base/env/update.html',
{'name_error': '环境名称不能为空!', "env": env, "prj_list": prj_list})
# name_exit = Environment.objects.filter(project__user_id=user_id).filter(env_name=env_name).exclude(
# env_id=env_id)
name_exit = Environment.objects.filter(env_name=env_name).exclude(env_id=env_id)
if name_exit:
env = Environment.objects.get(env_id=env_id)
return render(request, 'base/env/update.html',
{'name_error': '环境: {},已存在!'.format(env_name), "env": env, "prj_list": prj_list})
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
url = request.POST['url'].strip()
if url == '':
env = Environment.objects.get(env_id=env_id)
return render(request, 'base/env/update.html',
{'url_error': 'url不能为空!', "env": env, "prj_list": prj_list})
description = request.POST['description']
name = request.user
userid = User.objects.filter(username=name).first()
Environment.objects.filter(env_id=env_id).update(env_name=env_name, url=url, project=project,
description=description, update_user_id=userid.id)
return HttpResponseRedirect("/base/env/")
env_id = request.GET['env_id']
env = Environment.objects.get(env_id=env_id)
return render(request, "base/env/update.html", {"env": env, "prj_list": prj_list})
# 删除测试环境
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def env_delete(request):
if request.method == 'GET':
res = {'code': 0, 'message': ''}
env_id = request.GET['env_id']
if Plan.objects.filter(environment_id=env_id).exists():
res = {'code': 1, 'message': '有测试计划使用了该环境,请先删除相关测试计划'}
else:
Environment.objects.filter(env_id=env_id).delete()
return HttpResponse(json.dumps(res))
# 接口首页
@login_required(login_url=settings.LOGIN_URL)
def interface_index(request):
search = request.GET.get('search', None)
if search == None:
return render(request, "base/interface/index.html")
if search != '':
ins = Interface.objects.filter(Q(if_name__contains=search) | Q(project__prj_name__contains=search) | Q(
description__icontains=search) | Q(update_user__username__contains=search) | Q(method__contains=search))
else:
ins = Interface.objects.all()
rows = []
offset = int(request.GET.get('offset', 0))
limit = int(request.GET.get('limit', 0))
for item in ins:
row = {}
row['offset'] = offset
row['id'] = item.if_id
row['ins_name'] = item.if_name
row['method'] = item.method
row['project_name'] = item.project.prj_name
row['description'] = item.description
row['update_time'] = datetime.strftime(item.update_time, '%Y-%m-%d %H:%M:%S')
row['update_user'] = item.update_user.username
rows.append(row)
return HttpResponse(json.dumps({'total': len(rows), 'rows': rows[offset:offset + limit]}),
content_type='application/json')
@login_required(login_url=settings.LOGIN_URL)
def interface_add(request):
prj_list = Project.objects.all()
if request.method == 'POST':
name_error = url_error = method_error = headers_error = params_error = body_error = ""
if_name = request.POST['if_name'].strip()
if if_name == "":
name_error = '你整个空几个意思?'
name_same = Interface.objects.filter(if_name=if_name).exists()
if name_same:
name_error = '和其他接口有重复老弟!!'
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
url = request.POST['url'].strip()
if url == "":
url_error = '你整个空几个意思?'
method = request.POST.get('method', '')
if method == "":
method_error = '请选择请求方式。'
request_header_key_list = request.POST.getlist('request_header_key', [])
request_header_key = request_header_key_list
request_header_value_list = request.POST.getlist('request_header_value', [])
request_header_value = request_header_value_list
if not all(request_header_key_list) or len(request_header_key_list) != len(set(request_header_key_list)):
headers_error = 'key有空或者重复,瞅瞅!'
request_header_data = json.dumps(dict(zip(request_header_key, request_header_value)))
request_params_key_list = request.POST.getlist('request_params_key', [])
request_params_key = request_params_key_list
request_params_value_list = request.POST.getlist('request_params_value', [])
request_params_value = request_params_value_list
if not all(request_params_key_list) or len(request_params_key_list) != len(set(request_params_key_list)):
params_error = 'key有空或者重复,瞅瞅!'
request_params_data = json.dumps(dict(zip(request_params_key, request_params_value)))
request_body_key_list = request.POST.getlist('request_body_key', [])
request_body_key = request_body_key_list
request_body_value_list = request.POST.getlist('request_body_value', [])
request_body_value = request_body_value_list
if not all(request_body_key_list) or len(request_body_key_list) != len(set(request_body_key_list)):
body_error = 'key有空或者重复,瞅瞅!'
request_body_data = json.dumps(dict(zip(request_body_key, request_body_value)))
data_type = request.POST['data_type']
description = request.POST['description']
if any((name_error, url_error, method_error, headers_error, params_error, body_error)):
return render(request, 'base/interface/add.html',
{'name_error': name_error,
'url_error': url_error,
'method_error': method_error,
'headers_error': headers_error,
'params_error': params_error,
'body_error': body_error,
'request_headers': json.loads(request_header_data),
'request_params': json.loads(request_params_data),
'request_body': json.loads(request_body_data),
'method': method,
'description': description,
'url': url,
'name': if_name,
"prj_list": prj_list,
'project_c': project,
'data_types': data_types,
'data_type': data_type,
'method_types': method_types})
name = request.user
userid = User.objects.filter(username=name).first().id
Interface.objects.create(if_name=if_name, url=url, project=project, method=method,
data_type=data_type,
description=description,
request_headers=request_header_data,
request_params=request_params_data,
request_body=request_body_data,
update_time=datetime.now(),
update_user_id=userid)
return HttpResponseRedirect("/base/interface/")
return render(request, "base/interface/add.html",
{"prj_list": prj_list, 'data_types': data_types, 'method_types': method_types})
# 接口编辑
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def interface_update(request):
prj_list = Project.objects.all()
if request.method == 'POST':
if_id = int(request.POST['if_id'])
interface = Interface.objects.get(if_id=if_id)
name_error = url_error = method_error = headers_error = params_error = body_error = ""
if_name = request.POST['if_name'].strip()
if if_name == "":
name_error = '你整个空几个意思?'
name_same = Interface.objects.filter(if_name=if_name).exclude(if_id=if_id).exists()
if name_same:
name_error = '和其他接口有重复老弟!!'
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
url = request.POST['url'].strip()
if url == "":
url_error = '你整个空几个意思?'
method = request.POST.get('method', '')
if method == "":
method_error = '请选择请求方式。'
request_header_key_list = request.POST.getlist('request_header_key', [])
request_header_key = request_header_key_list
request_header_value_list = request.POST.getlist('request_header_value', [])
request_header_value = request_header_value_list
if not all(request_header_key_list) or len(request_header_key_list) != len(set(request_header_key_list)):
headers_error = 'key有空或者重复,瞅瞅!'
request_header_data = json.dumps(dict(zip(request_header_key, request_header_value)))
request_params_key_list = request.POST.getlist('request_params_key', [])
request_params_key = request_params_key_list
request_params_value_list = request.POST.getlist('request_params_value', [])
request_params_value = request_params_value_list
if not all(request_params_key_list) or len(request_params_key_list) != len(set(request_params_key_list)):
params_error = 'key有空或者重复,瞅瞅!'
request_params_data = json.dumps(dict(zip(request_params_key, request_params_value)))
request_body_key_list = request.POST.getlist('request_body_key', [])
request_body_key = request_body_key_list
request_body_value_list = request.POST.getlist('request_body_value', [])
request_body_value = request_body_value_list
if not all(request_body_key_list) or len(request_body_key_list) != len(set(request_body_key_list)):
body_error = 'key有空或者重复,瞅瞅!'
request_body_data = json.dumps(dict(zip(request_body_key, request_body_value)))
description = request.POST['description']
if any((name_error, url_error, method_error, headers_error, params_error, body_error)):
return render(request, 'base/interface/update.html',
{'name_error': name_error,
'url_error': url_error,
'method_error': method_error,
'headers_error': headers_error,
'params_error': params_error,
'body_error': body_error,
"interface": interface,
'request_headers': request_header_data,
'request_params': request_params_data,
'request_body': request_body_data,
'method': method,
'description': description,
'url': url,
"prj_list": prj_list,
'data_types': data_types})
data_type = request.POST['data_type']
name = request.user
userid = User.objects.filter(username=name).first().id
Interface.objects.filter(if_id=if_id).update(if_name=if_name, url=url, project=project, method=method,
data_type=data_type,
description=description,
request_headers=request_header_data,
request_params=request_params_data,
request_body=request_body_data,
update_time=datetime.now(),
update_user_id=userid)
return HttpResponseRedirect("/base/interface/")
if_id = request.GET['if_id']
interface = Interface.objects.get(if_id=if_id)
request_headers = json.loads(interface.request_headers)
request_params = json.loads(interface.request_params)
request_body = json.loads(interface.request_body)
return render(request, "base/interface/update.html",
{"interface": interface,
'request_headers': request_headers,
'request_params': request_params,
'request_body': request_body,
'method': interface.method,
"prj_list": prj_list,
'data_types': data_types})
# 接口删除
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def interface_delete(request):
if request.method == 'GET':
res = {'code': 0, 'message': ''}
if_id = request.GET['if_id']
if Interface.objects.get(if_id=if_id).case_set.all().exists():
res = {'code': 1, 'message': '有用例使用了该用例,请先删除相关用例!'}
else:
Interface.objects.filter(if_id=if_id).delete()
return HttpResponse(json.dumps(res))
# 用例首页
@login_required(login_url=settings.LOGIN_URL)
def case_index(request):
search = request.GET.get('search', None)
if search == None:
return render(request, "base/case/index.html")
if search != '':
cases = Case.objects.filter(
Q(case_name__contains=search) | Q(project__prj_name__contains=search) | Q(
description__icontains=search) | Q(
update_user__username__contains=search))
else:
cases = Case.objects.all()
rows = []
offset = int(request.GET.get('offset', 0))
limit = int(request.GET.get('limit', 0))
for item in cases:
row = {}
row['offset'] = offset
row['id'] = item.case_id
row['project_id'] = item.project.prj_id
row['case_name'] = item.case_name
row['project_name'] = item.project.prj_name
row['description'] = item.description
row['update_time'] = datetime.strftime(item.update_time, '%Y-%m-%d %H:%M:%S')
row['update_user'] = item.update_user.username
rows.append(row)
return HttpResponse(json.dumps({'total': len(rows), 'rows': rows[offset:offset + limit]}),
content_type='application/json')
# 添加用例
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def case_add(request):
if request.method == 'POST':
user = User.objects.get(id=request.session['uid'])
case_name = request.POST.get('case_name', '')
if case_name == '':
return HttpResponse('用例名称不能为空!')
# name_same = Case.objects.filter(project__user_id=user_id).filter(case_name=case_name)
name_same = Case.objects.filter(case_name=case_name)
if name_same:
return HttpResponse('用例:{}, 已存在!'.format(case_name))
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
description = request.POST['description']
content = request.POST.get('content')
login_id = int(request.POST['login_id'])
login_user = None
if login_id != 0:
login_user = TestUser.objects.get(id=login_id)
if content == '[]':
return HttpResponse('请输入接口参数信息!')
name = request.user
userid = User.objects.filter(username=name).first().id
print(userid)
case = Case(case_name=case_name, project=project, description=description,
content=content, update_user_id=userid, login_user=login_user)
case.save()
case.interface.set([item['if_id'] for item in json.loads(content)])
log.info(
'add case {} success. case info: {} // {} // {}'.format(case_name, project, description, content))
return HttpResponseRedirect("/base/case/")
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
usr_list = TestUser.objects.all()
return render(request, "base/case/add.html", {"prj_list": prj_list, 'usr_list': usr_list})
# 编辑用例
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def case_update(request):
if request.method == 'POST':
case_id = request.POST['case_id']
case_name = request.POST.get('case_name', '')
if case_name == '':
return HttpResponse('用例名称不能为空!')
# name_same = Case.objects.filter(project__user_id=user_id).filter(case_name=case_name).exclude(
# case_id=case_id)
name_same = Case.objects.filter(case_name=case_name).exclude(case_id=case_id)
if name_same:
return HttpResponse('用例:{}, 已存在!'.format(case_name))
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
description = request.POST['description']
content = request.POST.get('content')
# 单独维护断言对应表
content_n = eval(content)
login_id = int(request.POST['login_id'])
login_user = None
if login_id != 0:
login_user = TestUser.objects.get(id=login_id)
extract_fpdict = {}
for item in content_n:
extract_fpdict.update({k.strip('$'): v.strip('$') for k, v in item.get('extract', {}).items()})
# 写完收工
username = request.session.get('user', '')
if content == '[]':
return HttpResponse('请编辑接口参数信息!')
name = request.user
userid = User.objects.filter(username=name).first()
Case.objects.filter(case_id=case_id).update(case_name=case_name, project=project, description=description,
content=content, update_user_id=userid, login_user=login_user)
Case.objects.get(case_id=case_id).interface.set([item['if_id'] for item in json.loads(content)])
log.info(
'edit case {} success. case info: {} // {} // {}'.format(case_name, project, description, content))
return HttpResponseRedirect("/base/case/")
elif request.method == 'GET':
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
usr_list = TestUser.objects.all()
case_id = request.GET['case_id']
case = Case.objects.get(case_id=case_id)
interface = Interface.objects.filter(project_id=case.project_id).all().values()
if_list = ''
for i in eval(case.content):
if_list += i['if_id'] + ','
if eval(case.content):
if_id = eval(case.content)[0]['if_id'] # 默认显示第一个接口名称
if_name = eval(case.content)[0]['if_name']
else:
if_id = '1'
if_name = '请选择接口'
interface_list = [] # 返回所有接口
for i in interface:
interface_list.append(i)
return render(request, 'base/case/update.html',
{"prj_list": prj_list, 'case': case, 'interface': interface, 'case_id': case_id,
'if_id': if_id, 'if_list': str(if_list), 'if_name': if_name, 'usr_list': usr_list})
@login_required(login_url=settings.LOGIN_URL)
def case_copy(request):
"""复制case"""
if request.method == 'GET':
case_id = request.GET.get('case_id', '')
case_ = Case.objects.get(case_id=case_id)
case_name = case_.case_name
content = case_.content
project = case_.project
description = case_.description
name = request.user
userid = User.objects.filter(username=name).first().id
case = Case(case_name=case_name + '(复制)', project=project, description=description, update_time=datetime.now(),
content=content, update_user_id=userid)
case.save()
log.info(
'copy case {} success. case info: {} // {} '.format(case_name, project, content))
return HttpResponseRedirect("base/case/")
# @login_required
def case_logs(request):
"""单个用例运行日志"""
log_file_list = os.listdir(logs_path)
data_list = []
file_list = []
now = time.strftime('%Y-%m-%d')
for file in log_file_list:
if 'all' in file and now in file:
file_list.append(file)
if not file_list:
yesterday = datetime.today() + timedelta(-1)
yesterday_format = yesterday.strftime('%Y_%m_%d')
for file in log_file_list:
if 'all' in file and yesterday_format in file:
file_list.apppend(file)
file_list.sort()
log_file = os.path.join(logs_path, file_list[0])
with open(log_file, 'rb') as f:
off = -1024 * 1024
if f.tell() < -off:
data = f.readlines()
else:
f.seek(off, 2)
data = f.readlines()
for line in data:
data_list.append(line.decode())
return render(request, 'base/case/log.html', {'data': data_list, 'make': True, 'log_file': log_file})
# 删除用例
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def case_delete(request):
if request.method == 'GET':
res = {'code': 0, 'message': ''}
case_id = request.GET['case_id']
if Case.objects.get(case_id=case_id).plan_set.all().exists():
res = {'code': 1, 'message': '有测试任务使用了该用例,请先删除相关测试任务!'}
else:
Case.objects.filter(case_id=case_id).delete()
return HttpResponse(json.dumps(res))
# 运行用例
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def case_run(request):
if request.method == 'POST':
case_id = request.POST['case_id']
env_id = request.POST['env_id']
# username = request.session.get('user', '')
log.info('用户 {} 在 {} 环境 运行用例 {} 成功.'.format(request.user.username, env_id, case_id))
execute = Test_execute(case_id, env_id)
# print(execute)
case_result = execute.test_case()
# print(case_result)
Case.objects.filter(case_id=case_id).update(update_user=request.user)
print(case_result)
return JsonResponse(case_result)
# 测试计划首页
# @login_required
# @page_cache(5)
def plan_index(request):
plans = Plan.objects.all()
page = request.GET.get('page')
contacts = paginator(plans, page)
return render(request, "base/plan/index.html", {"contacts": contacts})
# 测试计划添加
# @login_required
def plan_add(request):
prj_list = Project.objects.all()
if request.method == 'POST':
plan_name = request.POST['plan_name'].strip()
if plan_name == '':
return render(request, 'base/plan/add.html',
{'name_error': '计划名称不能为空!', "prj_list": prj_list})
# name_same = Plan.objects.filter(project__user_id=user_id).filter(plan_name=plan_name)
name_same = Plan.objects.filter(plan_name=plan_name)
if name_same:
return render(request, 'base/plan/add.html',
{'name_error': '计划: {},已存在!'.format(plan_name), "prj_list": prj_list})
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
env_id = request.POST['env_id']
environment = Environment.objects.get(env_id=env_id)
description = request.POST['description']
content = request.POST.getlist("case_id")
name = request.user
userid = User.objects.filter(username=name).first().id
if content == []:
return render(request, 'base/plan/add.html',
{'content_error': '请选择用例编号!', 'plan_name': plan_name, "prj_list": prj_list})
plan = Plan(plan_name=plan_name, project=project, environment=environment, description=description,
content=content, update_user_id=userid)
plan.save()
plan.case.set(content)
return HttpResponseRedirect("/base/plan/")
return render(request, "base/plan/add.html", {"prj_list": prj_list})
# 测试计划编辑
# @login_required
def plan_update(request):
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
if request.method == 'POST':
plan_id = request.POST['plan_id']
plan = Plan.objects.get(plan_id=plan_id)
environments = Environment.objects.filter(project_id=plan.project_id).all().values()
case_list = []
for case_id in eval(plan.content):
case = Case.objects.get(case_id=case_id)
case_list.append(case)
plan_name = request.POST['plan_name'].strip()
if plan_name == '':
return render(request, 'base/plan/update.html',
{'name_error': '计划名称不能为空!', "prj_list": prj_list, 'plan': plan, 'case_list': case_list,
'environments': environments})
# name_same = Plan.objects.filter(project__user_id=user_id).filter(plan_name=plan_name).exclude(
# plan_id=plan_id)
name_same = Plan.objects.filter(plan_name=plan_name).exclude(plan_id=plan_id)
if name_same:
return render(request, 'base/plan/update.html',
{'name_error': '计划: {},已存在!'.format(plan_name), "prj_list": prj_list, 'plan': plan,
'case_list': case_list, 'environments': environments})
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
env_id = request.POST['env_id']
environment = Environment.objects.get(env_id=env_id)
description = request.POST['description']
content = request.POST.getlist("case_id")
name = request.user
userid = User.objects.filter(username=name).first()
if content == []:
return render(request, 'base/plan/update.html',
{'content_error': '请选择用例编号!', 'plan': plan, "prj_list": prj_list,
'case_list': case_list, 'environments': environments})
Plan.objects.filter(plan_id=plan_id).update(plan_name=plan_name, project=project, environment=environment,
description=description, content=content,
update_time=datetime.now(),
update_user_id=userid.id)
Plan.objects.get(plan_id=plan_id).case.set(content)
log.info('edit plan {} success. plan info: {} // {} // {} // {}'.format(plan_name, project, environment,
description, content))
return HttpResponseRedirect("/base/plan/")
plan_id = request.GET['plan_id']
plan = Plan.objects.get(plan_id=plan_id)
environments = Environment.objects.filter(project_id=plan.project_id).all().values()
case_list = []
for case_id in eval(plan.content):
try:
case = Case.objects.get(case_id=case_id)
case_list.append(case)
except Case.DoesNotExist as e:
log.error('计划 {} 中的 用例 {} 已被删除!!!'.format(plan.plan_name, case_id))
plans = Plan.objects.all()
page = request.GET.get('page')
contacts = paginator(plans, page)
return render(request, "base/plan/index.html",
{"contacts": contacts, 'error': '计划 {} 中的 用例 {} 已被删除!!!'.format(plan.plan_name, case_id)})
return render(request, "base/plan/update.html",
{"prj_list": prj_list, 'plan': plan, 'case_list': case_list, 'environments': environments})
# 删除测试计划
# @login_required
def plan_delete(request):
if request.method == 'GET':
plan_id = request.GET['plan_id']
Plan.objects.filter(plan_id=plan_id).delete()
return HttpResponseRedirect("base/plan/")
# 运行测试计划
# @login_required
def plan_run(request):
if request.method == 'POST':
global totalTime, start_time, now_time
begin_time = time.clock()
start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
now_time = int(time.mktime(time.strptime(start_time, '%Y-%m-%d %H:%M:%S')))
plan_id = request.POST['plan_id']
plan = Plan.objects.get(plan_id=plan_id)
env_id = plan.environment.env_id
case_id_list = eval(plan.content)
case_num = len(case_id_list)
content = []
pass_num = 0
fail_num = 0
error_num = 0
i = 0
for case_id in case_id_list:
execute = Test_execute(case_id, env_id, case_id_list)
case_result = execute.test_case() # 运行用例
if isinstance(case_result, dict):
content.append(case_result)
else:
return HttpResponse(case_result)
end_time = time.clock()
# 运行报告运行时长
now_timea = end_time - begin_time
totalTime = str(round(now_timea, 3)) + 's'
for step in content:
for s in step['step_list']:
if s["result"] == "pass":
pass_num += 1
i += 1
s['id'] = i
if s["result"] == "fail":
fail_num += 1
i += 1
s['id'] = i
if s["result"] == "error":
error_num += 1
i += 1
s['id'] = i
pic_name = DrawPie(pass_num, fail_num, error_num)
report_name = plan.plan_name + "-" + str(start_time)
username = request.session.get('user', '')
report = Report(plan=plan, report_name=report_name, content=content, case_num=case_num,
pass_num=pass_num, fail_num=fail_num, error_num=error_num, pic_name=pic_name,
totalTime=totalTime, startTime=start_time, update_user=username)
report.save()
Plan.objects.filter(plan_id=plan_id).update(make=0, update_time=datetime.now(), update_user=username)
return HttpResponse(plan.plan_name + " 执行成功!")
# 执行unittest
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def plan_unittest_run(request):
if request.method == 'POST':
global totalTime, start_time, now_time
plan_id = request.POST['plan_id']
plan = Plan.objects.get(plan_id=plan_id)
case_id_list = eval(plan.content)
env = Environment.objects.get(env_id=plan.environment_id)
all_case = unittest.TestSuite()
for case_id in case_id_list:
test_data = []
try:
case = Case.objects.get(case_id=int(case_id))
except Case.DoesNotExist as e:
log.error('计划:{} 中的 用例 {} 已被删除!'.format(plan.plan_name, case_id))
return HttpResponse('计划:{} 中的 用例 {} 已被删除!'.format(plan.plan_name, case_id))
if_list = eval(case.content)
for i in if_list:
interface = Interface.objects.get(if_id=i['if_id'])
test_data.append(
{'case_name': case.case_name, 'if_id': interface.if_id, 'if_name': interface.if_name,
'method': interface.method, 'url': env.url + interface.url, 'data_type': interface.data_type,
'headers': i['header'], 'body': i['body'], 'checkpoint': i['validators'], 'params': i['params'],
'extract': i['extract']
})
testDate.test_data = test_data
testDate.case = case
testDate.env_id = plan.environment_id
ms = __import__('test_api')
importlib.reload(ms)
discover = unittest.defaultTestLoader.discover('.', pattern='test*.py', top_level_dir=None)
all_case.addTests(discover)
sesu = run_this.run_email(all_case) # 取出报告的值
testDate.test_data = []
df_ = sesu.fields
# 对报告内容进行格式化
for item in df_['testResult']:
item['className'] = plan.plan_name
case_num = df_.get('testAll', 0)
pass_num = df_.get('testPass', 0)
fail_num = df_.get('testFail', 0)
error_num = df_.get('testError', 0)
start_time = df_.get('beginTime', '--')
totalTime = df_.get('totalTime', '--')
report_filepath = get_new_report_html(report_path)
report_name = plan.plan_name + "-" + str(start_time)
print('report_name:', report_name)
username = request.user
# # 报告结果写入数据库
report = Report(plan=plan, report_name=report_name, content='', case_num=case_num,
pass_num=pass_num, fail_num=fail_num, error_num=error_num, pic_name='',
totalTime=totalTime, startTime=start_time, update_user=username, path=report_filepath)
report.save()
Plan.objects.filter(plan_id=plan_id).update(make=1, report_name=report_name, update_time=datetime.now(),
update_user=username)
content = Plan.objects.get(plan_id=plan_id)
pass_num = len(eval(content.content))
log.info('-------------------------->plan_unittest_run plan_id: {}'.format(plan_id))
return HttpResponse(plan.plan_name + " 执行成功!")
# 查看报告页面
# @login_required
# @page_cache(5)
def report_page(request):
if request.method == 'GET':
plan_id = request.GET.get('plan_id', '')
if plan_id:
report_list = Report.objects.filter(plan_id=plan_id).order_by('-report_id')
else:
report_list = Report.objects.all().order_by('-report_id')
for item in report_list:
path = item.path
if path:
item.path = path.split('/')[-1]
page = request.GET.get('page')
contacts = paginator(report_list, page)
return render(request, "base/report_page/report_page.html",
{"contacts": contacts, 'plan_id': plan_id})
# 显示日志信息
# @login_required
def report_logs(request):
report_id = request.GET.get('report_id')
plan_id = Report.objects.get(report_id=report_id).plan_id
make = Plan.objects.get(plan_id=plan_id).make
if make: # unittest日志
file_list = []
now = time.strftime('%Y-%m-%d')
log_file_list = os.listdir(logs_path)
for file in log_file_list:
if file[0].isdigit() and now in file:
file_list.append(file)
if not file_list:
return render(request, 'base/report_page/log.html', {'unicode': True})
data_list = []
file_list.sort()
log_file = os.path.join(logs_path, file_list[0])
try:
with open(log_file, 'rb') as f:
off = -1024 * 1024
if f.tell() < -off:
data = f.readlines()
else:
f.seek(off, 2)
data = f.readlines()
for line in data:
data_list.append(line.decode())
return render(request, 'base/report_page/log.html', {'data': data_list, 'make': True})
except UnicodeDecodeError:
return render(request, 'base/report_page/log.html', {'unicode': True})
else:
try:
report = Report.objects.get(report_id=report_id)
except Report.DoesNotExist:
return render(request, "base/report_page/log.html")
else:
report_content = eval(report.content)
for case in report_content:
global class_name
class_name = case['class_name']
return render(request, "base/report_page/log.html",
{"report": report, 'plan_id': plan_id, "report_content": report_content,
'class_name': class_name})
# 展示报告
# @login_required
def report_index(request):
if request.method == 'GET':
report_id = request.GET.get('report_id', '')
if not report_id:
return render(request, "report.html")
try:
report = Report.objects.get(report_id=report_id)
report_file = report.path
if report_file:
return HttpResponse(open(report_file, 'rb'))
except Report.DoesNotExist:
return render(request, 'report.html')
plan_id = Report.objects.get(report_id=report_id).plan_id
make = Plan.objects.get(plan_id=plan_id).make
plan_name = Plan.objects.get(plan_id=plan_id).report_name
# if make: # unittest报告
# log.info(
# '-------------------------->report_index plan_id: {} , plan_name: {}'.format(plan_id,
# plan_name))
# print("返回unittest")
# return render(request, '{}'.format(plan_name))
report = Report.objects.get(report_id=report_id)
case_num = report.case_num
pass_num = report.pass_num
fail_num = report.fail_num
error_num = report.error_num
report_content = eval(report.content)
for case in report_content:
global class_name
class_name = case['class_name']
return render(request, "report.html",
{"report": report, 'plan_id': plan_id, 'case_num': case_num, "error_num": error_num,
'pass_num': pass_num, 'fail_num': fail_num, "report_content": report_content,
'img_name': str(now_time) + 'pie.png', 'class_name': class_name})
# @login_required
def report_search(request):
if request.method == 'POST':
result = request.POST['result']
report_id = request.POST['report_id']
try:
report = Report.objects.get(report_id=report_id)
except Report.DoesNotExist:
return render(request, "report.html")
report_content = eval(report.content)
if result not in ['pass', 'fail']:
return HttpResponse(str(report_content))
for case in report_content:
global class_name
class_name = case['class_name']
step_list = case['step_list']
case['step_list'] = []
for step in step_list:
if result == step['result']:
case['step_list'].append(step)
else:
pass
return HttpResponse(str(report_content))
# 删除报告
# @login_required
def report_delete(request):
if request.method == 'GET':
report_id = request.GET['report_id']
Report.objects.filter(report_id=report_id).delete()
return HttpResponseRedirect("base/report_page/")
# 下载unittest报告
# @login_required
def file_download(request):
# do something...
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/report_page/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
plan_id = request.GET.get('plan_id', '')
name = request.GET.get('log_file', '')
if plan_id:
name = Plan.objects.get(plan_id=plan_id).report_name
if not name:
if plan_id:
report_list = Report.objects.filter(plan_id=plan_id).order_by('-report_id')
else:
report_list = Report.objects.all().order_by('-report_id')
page = request.GET.get('page')
contacts = paginator(report_list, page)
return render(request, "base/report_page/report_page.html",
{"contacts": contacts, 'plan_id': plan_id,
'error': '计划 {} 不存在unittest报告'.format(
plan_id)})
def file_iterator(file_name, chunk_size=512):
with open(file_name, encoding='utf-8') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
response = StreamingHttpResponse(file_iterator(name))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(name)
log.info('用户 {} 下载测试报告或日志文件:{} 成功.'.format(user_id, name))
return response
# 添加用户
# @login_required
# @page_cache(5)
def user_index(request):
user = User.objects.all()
page = request.GET.get('page')
contacts = paginator(user, page)
return render(request, 'system/user/user_index.html', {"contacts": contacts})
# 异步请求数据
def findata(request):
if request.method == 'GET':
get_type = request.GET["type"]
if get_type == "get_all_if_by_prj_id":
prj_id = request.GET["prj_id"]
# 返回字典列表
if_list = Interface.objects.filter(project=prj_id).all().values()
# list(if_list)将QuerySet转换成list
return JsonResponse(list(if_list), safe=False)
if get_type == "get_if_by_search_name":
search_name = request.GET["search_name"]
prj_id = request.GET["prj_id"]
# 返回字典列表
if_list = Interface.objects.filter(project=prj_id).filter(if_name__contains=search_name).all().values()
# list(if_list)将QuerySet转换成list
return JsonResponse(list(if_list), safe=False)
if get_type == "get_if_by_if_id":
if_id = request.GET["if_id"]
# 查询并将结果转换为json
interface = Interface.objects.filter(if_id=if_id).values()
return JsonResponse(list(interface), safe=False)
if get_type == "get_env_by_prj_id":
prj_id = request.GET["prj_id"]
# 查询并将结果转换为json
env = Environment.objects.all().values()
return JsonResponse(list(env), safe=False)
if get_type == "get_case_by_case_id": # 增加 get_case_by_case_id 类型,编辑 用例 使用
case_id = request.GET["case_id"]
# 查询并将结果转换为json
case = Case.objects.get(case_id=case_id).__dict__
case.pop('_state')
# 替换if_name
content_new = eval(case['content'])
for i in content_new:
inf = Interface.objects.filter(if_id=i['if_id'])
if inf.exists():
i['if_name'] = inf[0].if_name
case['content'] = content_new
return JsonResponse(case)
if get_type == "get_all_case_by_prj_id":
prj_id = request.GET["prj_id"]
# 查询并将结果转换为json
env = Case.objects.filter(project_id=prj_id).values()
return JsonResponse(list(env), safe=False)
if get_type == 'get_log':
log_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/logs'
log_file_list = os.listdir(log_path)
file_list = []
now = time.strftime('%Y-%m-%d')
for file in log_file_list:
if 'all' in file and now in file:
file_list.append(file)
if not file_list:
yesterday = datetime.today() + timedelta(-1)
yesterday_format = yesterday.strftime('%Y_%m_%d')
for file in log_file_list:
if 'all' in file and yesterday_format in file:
file_list.apppend(file)
file_list.sort()
log_file = os.path.join(log_path, file_list[0])
data_list = []
with open(log_file, 'r', encoding='utf-8') as f:
off = -1024 * 1024
if f.tell() < -off:
data = f.readlines()
else:
f.seek(off, 2)
data = f.readlines()
# data = f.readlines()
for i in data:
data_list.append(i.replace('True', 'true').replace('False', 'false').replace('None', 'null'))
return JsonResponse(data_list, safe=False)
# 全局变量
# @login_required
# @page_cache(5)
@login_required(login_url=settings.LOGIN_URL)
def variable(request):
search = request.GET.get('search', None)
if search == None:
return render(request, "system/variable/common_variable.html")
if search != '':
ins = Variable.objects.filter(Q(variable_name__contains=search) | Q(variable_value__contains=search) | Q(
description__icontains=search))
else:
ins = Variable.objects.all()
rows = []
offset = int(request.GET.get('offset', 0))
limit = int(request.GET.get('limit', 0))
for item in ins:
row = {}
row['offset'] = offset
row['id'] = item.variable_id
row['v_name'] = item.variable_name
row['v_value'] = item.variable_value
row['description'] = item.description
row['update_time'] = datetime.strftime(item.update_time, '%Y-%m-%d %H:%M:%S')
rows.append(row)
return HttpResponse(json.dumps({'total': len(rows), 'rows': rows[offset:offset + limit]}),
content_type='application/json')
# 全局变量新增
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def variable_add(request):
try:
if request.method == 'POST':
variable_name = request.POST['variable_name'].strip()
variable_value = request.POST['variable_value'].strip()
# 判断值是否为空
if variable_name == '':
return render(request, 'system/variable/variable_add.html', {'error': '变量名不能为空!'})
elif variable_value == '':
return render(request, 'system/variable/variable_add.html', {'error': '变量值不能为空!'})
name_exit = Variable.objects.filter(variable_name=variable_name)
# value_exit = Variable.objects.filter(variable_value=variable_value)
# 判断值是否在数据库
if name_exit:
return render(request, 'system/variable/variable_add.html',
{'error': '变量名: {},已存在!'.format(variable_name)})
# elif value_exit:
# return render(request, 'system/variable/variable_add.html', {'error': '变量名: {},已存在!'.format(variable_value)})
# 获取描述字段的值
description = request.POST['description']
variable = Variable(variable_name=variable_name, variable_value=variable_value, description=description)
variable.save()
log.info('add variable_name {} success, and variable_value {} success. variable info: {} '.format(
variable_name, variable_value, description))
return HttpResponseRedirect("/base/variable/")
return render(request, "system/variable/variable_add.html")
finally:
# 更新全局变量文件
from common.base_api import res_global_path
value_item = Variable.objects.all()
json_data = {item.variable_name: item.variable_value for item in value_item}
with open(res_global_path, 'w') as f:
json.dump(json_data, f)
# 全局变量编辑
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def variable_update(request):
try:
if request.method == 'POST':
variable_id = request.POST['variable_id']
variable_name = request.POST['variable_name'].strip()
variable_value = request.POST['variable_value'].strip()
# 判断变量名、值不能为空
if variable_name == '':
variable = Variable.objects.get(variable_name=variable_name)
return render(request, 'system/variable/variable_update.html',
{'error': '变量名称不能为空!', "variable": variable})
elif variable_value == '':
variable = Variable.objects.get(variable_value=variable_value)
return render(request, 'system/variable/variable_update.html',
{'error': '变量名称不能为空!', "variable": variable})
# 判断变量是否存在
name_exit = Variable.objects.filter(variable_name=variable_name).exclude(variable_id=variable_id)
# value_exit = Variable.objects.filter(variable_value=variable_value).exclude(variable_id=variable_id)
if name_exit:
variable = Variable.objects.get(name_exit=name_exit)
return render(request, 'system/variable/variable_update.html',
{'error': '变量名: {},已存在!'.format(variable_name), "variable": variable})
# elif value_exit:
# variable = Variable.objects.get(name_exit=name_exit)
# return render(request, 'system/variable/variable_update.html',
# {'error': '变量值: {},已存在!'.format(variable_value), "variable": variable})
# 获取描述字段的值
description = request.POST['description']
# 获取user 名称
username = request.session.get('user', '')
Variable.objects.filter(variable_id=variable_id).update(variable_name=variable_name,
variable_value=variable_value,
description=description,
update_time=datetime.now())
return HttpResponseRedirect("/base/variable/")
variable_id = request.GET['variable_id']
variable = Variable.objects.get(variable_id=variable_id)
return render(request, "system/variable/variable_update.html", {"variable": variable})
finally:
# 更新全局变量文件
from common.base_api import res_global_path
value_item = Variable.objects.all()
json_data = {item.variable_name: item.variable_value for item in value_item}
with open(res_global_path, 'w') as f:
json.dump(json_data, f)
# 全局变量删除
# @login_required
@login_required(login_url=settings.LOGIN_URL)
def variable_delete(request):
res = {'code': 0, 'message': ''}
try:
if request.method == 'GET':
variable_id = request.GET['variable_id']
Variable.objects.filter(variable_id=variable_id).delete()
return HttpResponse(json.dumps(res))
except Exception as e:
res = {'code': 1, 'message': str(e)}
return HttpResponse(json.dumps(res))
finally:
# 更新全局变量文件
from common.base_api import res_global_path
value_item = Variable.objects.all()
json_data = {item.variable_name: item.variable_value for item in value_item}
with open(res_global_path, 'w') as f:
json.dump(json_data, f)
import os
import time
import json
import logging
import markdown
from django.shortcuts import render, redirect
# from django.contrib.auth.decorators import login_required
# from django.conf import settings
from django.http import StreamingHttpResponse
from base.models import Project, Sign, Environment, Interface, Case, Plan, Report, Variable, Development
from django.contrib.auth.models import User # django自带user
from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
from django.db.models import Q # 与或非 查询
from lib.execute import Test_execute, get_user # 执行接口
from djcelery.models import PeriodicTask, CrontabSchedule, IntervalSchedule
from datetime import timedelta, datetime
from lib.swagger import AnalysisJson
# from base.page_cache import page_cache # redis缓存
from lib.public import get_new_report_html, DrawPie, is_number, paginator
import run_this
log = logging.getLogger('log') # 初始化log
report_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/templates' + '/report'
# report_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\templates' + '\\report'
logs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/' + 'logs' # 拼接删除目录完整路径
# logs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\' + 'logs' # 拼接删除目录完整路径
start_time = '' # 执行测试计划开始时间
totalTime = '' # 执行测试计划运行时间
now_time = '' # 饼图命名区分
class_name = '' # 执行测试类
# 项目首页
# @login_required
# @page_cache(5)
def project_index(request):
user_id = request.session.get('user_id', '') # 从session中获取user_id
if get_user(user_id):
# prj_list = Project.objects.filter(user_id=user_id) # 按照user_id查询项目
prj_list = Project.objects.all() # 按照user_id查询项目
# project_list = []
# for prj in prj_list:
# project_list.append(str(prj.prj_id))
page = request.GET.get('page')
contacts = paginator(prj_list, page)
# request.session['project_list'] = project_list # 保存项目id
return render(request, "base/project/index.html", {"prj_list": prj_list, 'contacts': contacts})
else:
request.session['login_from'] = '/base/project/'
return render(request, 'user/login_action.html')
# 增加项目
# @login_required
def project_add(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/project/'
return render(request, 'user/login_action.html')
else:
sign_list = Sign.objects.all() # 所有签名
if request.method == 'POST':
prj_name = request.POST['prj_name'].strip()
if prj_name == '': # 判断输入框
return render(request, 'base/project/add.html', {'error': '项目名称不能为空!', "sign_list": sign_list})
else:
# name_same = Project.objects.filter(user_id=user_id).filter(prj_name=prj_name)
name_same = Project.objects.filter(prj_name=prj_name)
if name_same:
return render(request, 'base/project/add.html',
{'error': '项目: {},已存在!'.format(prj_name), "sign_list": sign_list})
else:
description = request.POST['description']
sign_id = request.POST['sign']
sign = Sign.objects.get(sign_id=sign_id)
user = User.objects.get(id=user_id)
prj = Project(prj_name=prj_name, description=description, sign=sign, user=user)
prj.save()
log.info('add project {} success. project info: {} // {} '.format(prj_name, description, sign))
return HttpResponseRedirect("/base/project/")
return render(request, "base/project/add.html", {"sign_list": sign_list})
# 项目编辑
# @login_required
def project_update(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/project/'
return render(request, 'user/login_action.html')
else:
sign_list = Sign.objects.all()
if request.method == 'POST':
prj_id = request.POST['prj_id']
prj_name = request.POST['prj_name'].strip()
if prj_name == '':
prj = Project.objects.get(prj_id=prj_id)
return render(request, 'base/project/update.html',
{'error': '项目名称不能为空!', "prj": prj, "sign_list": sign_list})
else:
# name_exit = Project.objects.filter(user_id=user_id).filter(prj_name=prj_name).exclude(
# prj_id=prj_id)
name_exit = Project.objects.filter(prj_name=prj_name).exclude(prj_id=prj_id)
if name_exit:
prj = Project.objects.get(prj_id=prj_id)
return render(request, 'base/project/update.html',
{'error': '项目: {},已存在!'.format(prj_name), "prj": prj, "sign_list": sign_list})
else:
description = request.POST['description']
sign_id = request.POST['sign_id']
sign = Sign.objects.get(sign_id=sign_id)
user = User.objects.get(id=user_id)
Project.objects.filter(prj_id=prj_id).update(prj_name=prj_name, description=description, sign=sign,
user=user, update_time=datetime.now())
log.info('edit project {} success. project info: {} // {} '.format(prj_name, description, sign))
return HttpResponseRedirect("/base/project/")
prj_id = request.GET['prj_id']
prj = Project.objects.get(prj_id=prj_id)
return render(request, "base/project/update.html", {"prj": prj, "sign_list": sign_list})
# 删除项目
# @login_required
def project_delete(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/project/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
prj_id = request.GET['prj_id']
Project.objects.filter(prj_id=prj_id).delete()
log.info('用户 {} 删除项目 {} 成功.'.format(user_id, prj_id))
return HttpResponseRedirect("base/project/")
# 签名首页
# @login_required
# @page_cache(5)
def sign_index(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/sign/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
sign_list = Sign.objects.all()
page = request.GET.get('page')
contacts = paginator(sign_list, page)
return render(request, "system/sign/sign_index.html", {"sign_list": contacts})
# 添加签名
# @login_required
def sign_add(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/sign/'
return render(request, 'user/login_action.html')
else:
if request.method == 'POST':
sign_name = request.POST['sign_name'].strip()
if sign_name == '':
return render(request, 'system/sign/sign_add.html', {'error': '签名名称不能为空!'})
name_exit = Sign.objects.filter(sign_name=sign_name)
if name_exit:
return render(request, 'system/sign/sign_add.html', {'error': '签名: {},已存在!'.format(sign_name)})
description = request.POST['description']
username = request.session.get('user', '')
# print(username)
sign = Sign(sign_name=sign_name, description=description, update_user=username)
sign.save()
log.info('add sign {} success. sign info: {} '.format(sign_name, description))
return HttpResponseRedirect("/base/sign/")
return render(request, "system/sign/sign_add.html")
# 更新签名
# @login_required
def sign_update(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/sign/'
return render(request, 'user/login_action.html')
else:
if request.method == 'POST':
sign_id = request.POST['sign_id']
sign_name = request.POST['sign_name'].strip()
if sign_name == '':
sign = Sign.objects.get(sign_id=sign_id)
return render(request, 'system/sign/sign_update.html', {'error': '签名名称不能为空!', "sign": sign})
name_exit = Sign.objects.filter(sign_name=sign_name).exclude(sign_id=sign_id)
if name_exit:
sign = Sign.objects.get(sign_id=sign_id)
return render(request, 'system/sign/sign_update.html',
{'error': '签名: {},已存在!'.format(sign_name), "sign": sign})
description = request.POST['description']
username = request.session.get('user', '')
Sign.objects.filter(sign_id=sign_id).update(sign_name=sign_name, description=description,
update_time=datetime.now(), update_user=username)
log.info('edit sign {} success. sign info: {} '.format(sign_name, description))
return HttpResponseRedirect("/base/sign/")
sign_id = request.GET['sign_id']
sign = Sign.objects.get(sign_id=sign_id)
return render(request, "system/sign/sign_update.html", {"sign": sign})
# 删除签名
# @login_required
def sign_delete(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/sign/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
sign_id = request.GET['sign_id']
Sign.objects.filter(sign_id=sign_id).delete()
log.info('用户 {} 删除签名 {} 成功.'.format(user_id, sign_id))
return HttpResponseRedirect("base/sign/")
# 测试环境首页
# @login_required
# @page_cache(5)
def env_index(request):
user_id = request.session.get('user_id', '')
if get_user(user_id):
# project_list = request.session.get('project_list', [])
# env_list = []
# for project_id in project_list:
# env = Environment.objects.filter(project_id=int(project_id))
envs = Environment.objects.all()
# if env:
# env_list.append(env)
page = request.GET.get('page')
contacts = paginator(envs, page)
return render(request, "base/env/index.html", {"contacts": contacts})
else:
request.session['login_from'] = '/base/env/'
return render(request, 'user/login_action.html')
# 设置默认headers
# @login_required
def set_headers(request):
"""设置默认headers"""
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/env/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
env_id = request.GET.get('env_id', '')
set_headers = Environment.objects.get(env_id=env_id).set_headers
if set_headers:
set_headers = eval(set_headers)['header']
return render(request, "base/env/set_headers.html", {'env_id': env_id, 'env': set_headers})
elif request.method == 'POST':
content = request.POST.get('content', '')
env_id = request.POST.get('env_id', '')
now_time = datetime.now()
username = request.session.get('user', '')
Environment.objects.filter(env_id=env_id).update(set_headers=content, update_time=now_time,
update_user=username)
log.info(
'env {} set headers success. headers info: {} '.format(env_id, content))
return HttpResponseRedirect("/base/env/")
# 添加环境
# @login_required
def env_add(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/env/'
return render(request, 'user/login_action.html')
else:
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
if request.method == 'POST':
env_name = request.POST['env_name'].strip()
if env_name == '':
return render(request, 'base/env/add.html', {'name_error': '环境名称不能为空!', "prj_list": prj_list})
# name_same = Environment.objects.filter(project__user_id=user_id).filter(env_name=env_name)
name_exit = Environment.objects.filter(env_name=env_name)
if name_exit:
return render(request, 'base/env/add.html',
{'name_error': '环境: {},已存在!'.format(env_name), "prj_list": prj_list})
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
url = request.POST['url'].strip()
if url == '':
return render(request, 'base/env/add.html', {'url_error': 'url不能为空!', "prj_list": prj_list})
description = request.POST['description']
is_swagger = request.POST['is_swagger']
username = request.session.get('user', '')
if is_swagger == '1':
Environment.objects.filter(is_swagger=1).update(is_swagger=0)
env = Environment(env_name=env_name, url=url, project=project, private_key=private_key,
description=description, is_swagger=is_swagger, update_user=username)
env.save()
log.info(
'add env {} success. env info: {} // {} // {} // {} // {} '.format(env_name, project, url,
private_key,
description, is_swagger))
return HttpResponseRedirect("/base/env/")
return render(request, "base/env/add.html", {"prj_list": prj_list})
# 测试环境更新
# @login_required
def env_update(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/env/'
return render(request, 'user/login_action.html')
else:
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
if request.method == 'POST':
env_id = request.POST['env_id']
env_name = request.POST['env_name'].strip()
if env_name == '':
env = Environment.objects.get(env_id=env_id)
return render(request, 'base/env/update.html',
{'name_error': '环境名称不能为空!', "env": env, "prj_list": prj_list})
# name_exit = Environment.objects.filter(project__user_id=user_id).filter(env_name=env_name).exclude(
# env_id=env_id)
name_exit = Environment.objects.filter(env_name=env_name).exclude(env_id=env_id)
if name_exit:
env = Environment.objects.get(env_id=env_id)
return render(request, 'base/env/update.html',
{'name_error': '环境: {},已存在!'.format(env_name), "env": env, "prj_list": prj_list})
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
url = request.POST['url'].strip()
if url == '':
env = Environment.objects.get(env_id=env_id)
return render(request, 'base/env/update.html',
{'url_error': 'url不能为空!', "env": env, "prj_list": prj_list})
description = request.POST['description']
is_swagger = request.POST['is_swagger']
username = request.session.get('user', '')
if is_swagger == '1':
Environment.objects.filter(is_swagger=1).update(is_swagger=0)
Environment.objects.filter(env_id=env_id).update(env_name=env_name, url=url, project=project,
private_key=private_key, description=description,
update_time=datetime.now(), is_swagger=is_swagger,
update_user=username)
log.info(
'edit env {} success. env info: {} // {} // {} // {} // {}'.format(env_name, project, url,
private_key,
description, is_swagger))
return HttpResponseRedirect("/base/env/")
env_id = request.GET['env_id']
env = Environment.objects.get(env_id=env_id)
return render(request, "base/env/update.html", {"env": env, "prj_list": prj_list})
# 删除测试环境
# @login_required
def env_delete(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/env/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
env_id = request.GET['env_id']
Environment.objects.filter(env_id=env_id).delete()
log.info('用户 {} 删除环境 {} 成功.'.format(user_id, env_id))
return HttpResponseRedirect("base/env/")
# 接口首页
# @login_required
# @page_cache(5)
def interface_index(request):
user_id = request.session.get('user_id', '')
if get_user(user_id):
# project_list = request.session.get('project_list', [])
# if_list = []
# for project_id in project_list:
interface = Interface.objects.all()
# if interface:
# if_list.append(interface)
page = request.GET.get('page')
contacts = paginator(interface, page)
return render(request, "base/interface/index.html", {"contacts": contacts})
else:
request.session['login_from'] = '/base/interface/'
return render(request, 'user/login_action.html')
# 接口搜索功能
# @login_required
def interface_search(request):
if request.method == 'POST':
user_id = request.session.get('user_id', '')
if get_user(user_id):
search = request.POST.get('search', '').strip()
# project_list = request.session.get('project_list', [])
if_list = []
# interface_lists = []
# for project_id in project_list: # 跨项目查询
if not search:
return HttpResponse('0')
else:
if search in ['get', 'post', 'delete', 'put']: # 请求方式查询
interface_list = Interface.objects.filter(method__contains=search)
elif search in ['data', 'json']: # 数据传输类型查询
interface_list = Interface.objects.filter(data_type__contains=search)
else:
try:
if isinstance(int(search), int): # ID查询
interface_list = Interface.objects.filter(if_id__exact=search)
if not interface_list:
interface_list = Interface.objects.filter(if_name__contains=search)
except ValueError:
interface_list = Interface.objects.filter(
Q(if_name__contains=search) | Q(project__prj_name__contains=search)) # 接口名称、项目名称查询
if not interface_list: # 查询为空
return HttpResponse('1')
else:
for interface in interface_list:
interface_dict = {'if_id': str(interface.if_id), 'if_name': interface.if_name,
'project': interface.project.prj_name, 'method': interface.method,
'data_type': interface.data_type, 'is_sign': interface.is_sign,
'description': interface.description,
'update_time': str(interface.update_time).split('.')[0],
'update_user': interface.update_user}
if_list.append(interface_dict)
return HttpResponse(str(if_list))
else:
return HttpResponse('2')
# 添加接口
# @login_required
def interface_add(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/interface/'
return render(request, 'user/login_action.html')
else:
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
if request.method == 'POST':
if_name = request.POST['if_name']
if if_name.strip() == '':
return HttpResponse('接口名称不能为空!')
# name_same = Interface.objects.filter(project__user_id=user_id).filter(if_name=if_name)
name_same = Interface.objects.filter(if_name=if_name)
if name_same:
return HttpResponse('接口: {},已存在!'.format(if_name))
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
url = request.POST['url']
if url.strip() == '':
return HttpResponse('url不能为空!')
# 获取接口开发人员
DevelopmentManager = request.POST['DevelopmentManager']
# print(DevelopmentManager)
Development_id = Development.objects.get(name=DevelopmentManager).id
# print(Development_id)
if DevelopmentManager.strip() == '':
return HttpResponse('DevelopmentManager不能为空!')
method = request.POST.get('method', '')
if method == '':
return HttpResponse('请选择接口的请求方式!')
data_type = request.POST['data_type']
is_sign = request.POST.get('is_sign', '')
is_headers = request.POST.get('is_headers', '')
if is_sign == '':
return HttpResponse('请设置接口是否需要签名!')
description = request.POST['description']
request_header_data = request.POST['request_header_data']
request_body_data = request.POST['request_body_data']
response_header_data = request.POST['response_header_data']
response_body_data = request.POST['response_body_data']
username = request.session.get('user', '')
interface = Interface(if_name=if_name, url=url, project=project, method=method, data_type=data_type,
DevelopmentManager_id=Development_id,
is_sign=is_sign, description=description, request_header_param=request_header_data,
request_body_param=request_body_data, response_header_param=response_header_data,
response_body_param=response_body_data, is_header=is_headers, update_user=username)
interface.save()
log.info(
'add interface {} success. interface info: {} // {} // {} // {} // {} // {} // {} // {} // {} // {} '.format(
if_name, project, url, method, data_type, is_sign, description, request_header_data,
request_body_data, response_header_data, response_body_data, is_header=is_headers))
return HttpResponseRedirect("/base/interface/")
return render(request, "base/interface/add.html", {"prj_list": prj_list})
# 接口编辑
# @login_required
def interface_update(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/interface/'
return render(request, 'user/login_action.html')
else:
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
if request.method == 'POST':
if_id = request.POST['if_id']
interface = Interface.objects.get(if_id=if_id)
request_header_param_list = interface_get_params(interface.request_header_param)
request_body_param_list = interface_get_params(interface.request_body_param)
response_header_param_list = interface_get_params(interface.response_header_param)
response_body_param_list = interface_get_params(interface.response_body_param)
if interface.method == 'get':
method = 0
elif interface.method == 'post':
method = 1
elif interface.method == 'delete':
method = 2
elif interface.method == 'put':
method = 3
else:
method = ''
if interface.is_sign == 0:
is_sign = 0
elif interface.is_sign == 1:
is_sign = 1
else:
is_sign = ''
if_name = request.POST['if_name'].strip()
if if_name == '':
return render(request, 'base/interface/update.html',
{'name_error': '接口名称不能为空!', "interface": interface,
'request_header_param_list': request_header_param_list,
'request_body_param_list': request_body_param_list, 'method': method, 'is_sign': is_sign,
'response_header_param_list': response_header_param_list,
'response_body_param_list': response_body_param_list,
"prj_list": prj_list})
# name_same = Interface.objects.filter(project__user_id=user_id).filter(if_name=if_name).exclude(
# if_id=if_id)
name_same = Interface.objects.filter(if_name=if_name).exclude(if_id=if_id)
if name_same:
return render(request, 'base/interface/update.html',
{'name_error': '接口:{},已存在!'.format(if_name), "interface": interface,
'request_header_param_list': request_header_param_list,
'request_body_param_list': request_body_param_list, 'method': method, 'is_sign': is_sign,
'response_header_param_list': response_header_param_list,
'response_body_param_list': response_body_param_list,
"prj_list": prj_list})
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
url = request.POST['url'].strip()
if url == '':
return render(request, 'base/interface/update.html',
{'url_error': '接口url不能为空!', "interface": interface,
'request_header_param_list': request_header_param_list,
'request_body_param_list': request_body_param_list, 'method': method, 'is_sign': is_sign,
'response_header_param_list': response_header_param_list,
'response_body_param_list': response_body_param_list,
"prj_list": prj_list})
DevelopmentManager = request.POST['DevelopmentManager'].strip()
Development_id = Development.objects.get(name=DevelopmentManager).id
if DevelopmentManager == '':
return render(request, 'base/interface/update.html',
{'DevelopmentManager_error': '接口DevelopmentManager不能为空!', "interface": interface,
'request_header_param_list': request_header_param_list,
'request_body_param_list': request_body_param_list, 'method': method, 'is_sign': is_sign,
'response_header_param_list': response_header_param_list,
'response_body_param_list': response_body_param_list,
"prj_list": prj_list})
method = request.POST.get('method', '')
if method == '':
return render(request, 'base/interface/update.html',
{'method_error': '请选择接口请求方式!', "interface": interface,
'request_header_param_list': request_header_param_list,
'request_body_param_list': request_body_param_list, 'method': method, 'is_sign': is_sign,
'response_header_param_list': response_header_param_list,
'response_body_param_list': response_body_param_list,
"prj_list": prj_list})
data_type = request.POST['data_type']
is_sign = request.POST.get('is_sign', '')
is_headers = request.POST.get('is_headers', '')
if is_sign == '':
return render(request, 'base/interface/update.html',
{'sign_error': '请选择接口是否需要签名!', "interface": interface,
'request_header_param_list': request_header_param_list,
'request_body_param_list': request_body_param_list, 'method': method, 'is_sign': is_sign,
'response_header_param_list': response_header_param_list,
'response_body_param_list': response_body_param_list,
"prj_list": prj_list})
description = request.POST['description']
print('request.POST:',request.POST)
request_header_data_list = request.POST.getlist('request_header_data', [])
request_header_data = interface_format_params(request_header_data_list)
request_body_data_list = request.POST.getlist('request_body_data', [])
request_body_data = interface_format_params(request_body_data_list)
response_header_data_list = request.POST.getlist('response_header_data', [])
response_header_data = interface_format_params(response_header_data_list)
response_body_data_list = request.POST.getlist('response_body_data', [])
response_body_data = interface_format_params(response_body_data_list)
username = request.session.get('user', '')
Interface.objects.filter(if_id=if_id).update(if_name=if_name, url=url, project=project, method=method,
DevelopmentManager_id=Development_id,
data_type=data_type, is_header=is_headers,
is_sign=is_sign, description=description,
request_header_param=request_header_data,
request_body_param=request_body_data,
response_header_param=response_header_data,
response_body_param=response_body_data,
update_time=datetime.now(), update_user=username)
log.info(
'edit interface {} success. interface info: {} // {} // {} // {} // {} // {} // {} // {} // {} // {}// {} '.format(
if_name, project, url, method, data_type, is_sign, description, request_header_data,
request_body_data,
response_header_data, response_body_data, is_headers))
return HttpResponseRedirect("/base/interface/")
if_id = request.GET['if_id']
interface = Interface.objects.get(if_id=if_id)
request_header_param_list = interface_get_params(interface.request_header_param)
request_body_param_list = interface_get_params(interface.request_body_param)
response_header_param_list = interface_get_params(interface.response_header_param)
response_body_param_list = interface_get_params(interface.response_body_param)
if interface.method == 'get':
method = 0
elif interface.method == 'post':
method = 1
elif interface.method == 'delete':
method = 2
elif interface.method == 'put':
method = 3
else:
method = ''
if interface.is_sign == 0:
is_sign = 0
elif interface.is_sign == 1:
is_sign = 1
else:
is_sign = ''
if interface.is_header == 0:
is_headers = 0
elif interface.is_header == 1:
is_headers = 1
else:
is_headers = ''
print('request_header_param_list:',request_header_param_list)
return render(request, "base/interface/update.html",
{"interface": interface, 'request_header_param_list': request_header_param_list,
'request_body_param_list': request_body_param_list, 'method': method, 'is_sign': is_sign,
'response_header_param_list': response_header_param_list,
'response_body_param_list': response_body_param_list, 'is_headers': is_headers,
"prj_list": prj_list})
# 解析数据库中格式化前的参数
def interface_get_params(params):
# if params:
# param_list = []
# for i in range(len(eval(params))):
# request_header_param = eval(params)[i]['var_name']
# param_list.append(request_header_param)
# return param_list
# else:
# return []
# 上述仅返回key,不能满足,使用全返回
return eval(params)
# 格式化存入数据库中的参数
def interface_format_params(params_list):
if params_list:
var = []
for i in range(len(params_list)):
var.append({"var_name": "", "var_remark": ""})
var[i]['var_name'] = params_list[i]
return json.dumps(var)
else:
return []
# 接口删除
# @login_required
def interface_delete(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/interface/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
if_id = request.GET['if_id']
Interface.objects.filter(if_id=if_id).delete()
log.info('用户 {} 删除接口 {} 成功.'.format(user_id, if_id))
return HttpResponseRedirect("base/interface/")
# 批量导入接口
def batch_import_interface(interface_params, interface, request):
for interface_ in interface:
if_name = interface_.get('name', '')
method = interface_.get('method', '')
name = Interface.objects.filter(if_name=if_name).filter(method=method)
if name:
log.warning('接口名称已存在. ==> {}'.format(if_name))
continue
else:
url = interface_.get('url', '')
method = interface_.get('method', '')
data_type = interface_.get('type', '')
headers = interface_.get('headers', '')
body_ = interface_.get('body', '')
if body_:
body = interface_params[body_]
project_id = interface_.get('prj_id', '')
is_sign = 0
is_headers = 0
description = ''
if headers[0]:
request_header_data = [{"var_name": "", "var_remark": ""}]
request_header_data[0]['var_name'] = headers[0]
else:
request_header_data = []
if body[0]:
request_body_data = [{"var_name": "", "var_remark": ""}]
request_body_data[0]['var_name'] = body[0]
else:
request_body_data = []
response_header_data = []
response_body_data = []
project = Project.objects.get(prj_id=int(project_id))
username = request.session.get('user', '')
log.info('interface:{} 正在批量导入中...'.format(if_name))
interface_tbl = Interface(if_name=if_name, url=url, project=project, method=method,
data_type=data_type, is_header=is_headers,
is_sign=is_sign, description=description,
request_header_param=json.dumps(request_header_data),
request_body_param=json.dumps(request_body_data),
response_header_param=response_header_data,
response_body_param=response_body_data, update_user=username)
interface_tbl.save()
# 批量导入
# @login_required
def batch_index(request):
"""批量导入"""
user_id = request.session.get('user_id', '')
if not get_user(user_id):
return HttpResponse('用户未登录!')
else:
if request.method == 'GET':
# Interface.objects.all().delete() # 清空接口表
# Case.objects.all().delete() # 清空用例表
# Plan.objects.all().delete() # 清空计划表
# Report.objects.all().delete() # 清空报告表
try:
env = Environment.objects.get(is_swagger=1)
env_url = env.url
prj_id = env.project_id
interface_params, interface = AnalysisJson(prj_id, env_url).retrieve_data()
log.info('项目 {} 开始批量导入...'.format(prj_id))
batch_import_interface(interface_params, interface, request)
return HttpResponse('批量导入成功! ==> {}'.format(prj_id))
except Environment.DoesNotExist:
return HttpResponse('测试环境中未设置从swagger导入!')
# 用例首页
# @login_required
# @page_cache(5)
def case_index(request):
user_id = request.session.get('user_id', '')
if get_user(user_id):
# project_list = request.session.get('project_list', [])
# case_list = []
# for project_id in project_list:
# case = Case.objects.filter(project_id=int(project_id))
cases = Case.objects.all()
# if case:
# case_list.append(case)
page = request.GET.get('page')
contacts = paginator(cases, page)
return render(request, "base/case/index.html", {"contacts": contacts})
else:
request.session['login_from'] = '/base/case/'
return render(request, 'user/login_action.html')
# 添加用例
# @login_required
def case_add(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/case/'
return render(request, 'user/login_action.html')
else:
if request.method == 'POST':
case_name = request.POST.get('case_name', '')
if case_name == '':
return HttpResponse('用例名称不能为空!')
# name_same = Case.objects.filter(project__user_id=user_id).filter(case_name=case_name)
name_same = Case.objects.filter(case_name=case_name)
if name_same:
return HttpResponse('用例:{}, 已存在!'.format(case_name))
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
description = request.POST['description']
content = request.POST.get('content')
username = request.session.get('user', '')
if content == '[]':
return HttpResponse('请输入接口参数信息!')
case = Case(case_name=case_name, project=project, description=description,
content=content, update_user=username)
case.save()
log.info(
'add case {} success. case info: {} // {} // {}'.format(case_name, project, description, content))
return HttpResponseRedirect("/base/case/")
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
return render(request, "base/case/add.html", {"prj_list": prj_list})
# 编辑用例
# @login_required
def case_update(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/case/'
return render(request, 'user/login_action.html')
else:
if request.method == 'POST':
# print(request.POST)
case_id = request.POST['case_id']
case_name = request.POST.get('case_name', '')
if case_name == '':
return HttpResponse('用例名称不能为空!')
# name_same = Case.objects.filter(project__user_id=user_id).filter(case_name=case_name).exclude(
# case_id=case_id)
name_same = Case.objects.filter(case_name=case_name).exclude(case_id=case_id)
if name_same:
return HttpResponse('用例:{}, 已存在!'.format(case_name))
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
description = request.POST['description']
content = request.POST.get('content')
# 单独维护断言对应表
content_n = eval(content)
extract_fpdict = {}
for item in content_n:
extract_fpdict.update({k.strip('$'): v.strip('$') for k, v in item.get('extract', {}).items()})
# 写完收工
username = request.session.get('user', '')
if content == '[]':
return HttpResponse('请编辑接口参数信息!')
Case.objects.filter(case_id=case_id).update(case_name=case_name, project=project, description=description,
content=content, update_time=datetime.now(),
update_user=username)
log.info(
'edit case {} success. case info: {} // {} // {}'.format(case_name, project, description, content))
return HttpResponseRedirect("/base/case/")
elif request.method == 'GET':
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
case_id = request.GET['case_id']
case = Case.objects.get(case_id=case_id)
interface = Interface.objects.filter(project_id=case.project_id).all().values()
if_list = ''
for i in eval(case.content):
if_list += i['if_id'] + ','
if eval(case.content):
if_id = eval(case.content)[0]['if_id'] # 默认显示第一个接口名称
if_name = eval(case.content)[0]['if_name']
else:
if_id = '1'
if_name = '请选择接口'
interface_list = [] # 返回所有接口
for i in interface:
interface_list.append(i)
return render(request, 'base/case/update.html',
{"prj_list": prj_list, 'case': case, 'interface': interface, 'case_id': case_id,
'if_id': if_id, 'if_list': str(if_list), 'if_name': if_name})
# @login_required
def case_copy(request):
"""复制case"""
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/case/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
case_id = request.GET.get('case_id', '')
case_ = Case.objects.get(case_id=case_id)
case_name = case_.case_name
content = case_.content
project = case_.project
description = case_.description
username = request.session.get('user', '')
case = Case(case_name=case_name, project=project, description=description, update_time=datetime.now(),
content=content, update_user=username)
case.save()
log.info(
'copy case {} success. case info: {} // {} '.format(case_name, project, content))
return HttpResponseRedirect("base/case/")
# @login_required
def case_logs(request):
"""单个用例运行日志"""
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/case/'
return render(request, 'user/login_action.html')
else:
log_file_list = os.listdir(logs_path)
data_list = []
file_list = []
now = time.strftime('%Y-%m-%d')
for file in log_file_list:
if 'all' in file and now in file:
file_list.append(file)
if not file_list:
yesterday = datetime.today() + timedelta(-1)
yesterday_format = yesterday.strftime('%Y_%m_%d')
for file in log_file_list:
if 'all' in file and yesterday_format in file:
file_list.apppend(file)
file_list.sort()
log_file = os.path.join(logs_path, file_list[0])
with open(log_file, 'rb') as f:
off = -1024 * 1024
if f.tell() < -off:
data = f.readlines()
else:
f.seek(off, 2)
data = f.readlines()
for line in data:
data_list.append(line.decode())
return render(request, 'base/case/log.html', {'data': data_list, 'make': True, 'log_file': log_file})
# 删除用例
# @login_required
def case_delete(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/case/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
case_id = request.GET['case_id']
Case.objects.filter(case_id=case_id).delete()
log.info('用户 {} 删除用例 {} 成功.'.format(user_id, case_id))
return HttpResponseRedirect("base/case/")
# 运行用例
# @login_required
def case_run(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
return HttpResponse('0')
else:
if request.method == 'POST':
case_id = request.POST['case_id']
env_id = request.POST['env_id']
username = request.session.get('user', '')
log.info('用户 {} 在 {} 环境 运行用例 {} 成功.'.format(username, env_id, case_id))
execute = Test_execute(case_id, env_id, ['1'])
# print(execute)
case_result = execute.test_case()
# print(case_result)
Case.objects.filter(case_id=case_id).update(update_user=username)
return JsonResponse(case_result)
# 测试计划首页
# @login_required
# @page_cache(5)
def plan_index(request):
user_id = request.session.get('user_id', '')
if get_user(user_id):
# project_list = request.session.get('project_list', [])
# plan_list = []
# for project_id in project_list:
# plan = Plan.objects.filter(project_id=int(project_id))
plans = Plan.objects.all()
# if plan:
# plan_list.append(plan)
page = request.GET.get('page')
contacts = paginator(plans, page)
return render(request, "base/plan/index.html", {"contacts": contacts})
else:
request.session['login_from'] = '/base/plan/'
return render(request, 'user/login_action.html')
# 测试计划添加
# @login_required
def plan_add(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/plan/'
return render(request, 'user/login_action.html')
else:
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
if request.method == 'POST':
plan_name = request.POST['plan_name'].strip()
if plan_name == '':
return render(request, 'base/plan/add.html',
{'name_error': '计划名称不能为空!', "prj_list": prj_list})
# name_same = Plan.objects.filter(project__user_id=user_id).filter(plan_name=plan_name)
name_same = Plan.objects.filter(plan_name=plan_name)
if name_same:
return render(request, 'base/plan/add.html',
{'name_error': '计划: {},已存在!'.format(plan_name), "prj_list": prj_list})
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
is_locust = request.POST['is_locust']
is_task = request.POST['is_task']
env_id = request.POST['env_id']
environment = Environment.objects.get(env_id=env_id)
description = request.POST['description']
content = request.POST.getlist("case_id")
username = request.session.get('user', '')
if content == []:
return render(request, 'base/plan/add.html',
{'content_error': '请选择用例编号!', 'plan_name': plan_name, "prj_list": prj_list})
if is_locust == '1':
Plan.objects.filter(is_locust=1).update(is_locust=0)
if is_task == '1':
Plan.objects.filter(is_task=1).update(is_task=0)
plan = Plan(plan_name=plan_name, project=project, environment=environment, description=description,
content=content, is_locust=is_locust, is_task=is_task, update_user=username)
plan.save()
log.info('add plan {} success. plan info: {} // {} // {} // {} //{} //{}'.
format(plan_name, project, environment, description, content, is_locust, is_task))
return HttpResponseRedirect("/base/plan/")
return render(request, "base/plan/add.html", {"prj_list": prj_list})
# 测试计划编辑
# @login_required
def plan_update(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/plan/'
return render(request, 'user/login_action.html')
else:
# prj_list = Project.objects.filter(user_id=user_id)
prj_list = Project.objects.all()
if request.method == 'POST':
plan_id = request.POST['plan_id']
plan = Plan.objects.get(plan_id=plan_id)
environments = Environment.objects.filter(project_id=plan.project_id).all().values()
case_list = []
for case_id in eval(plan.content):
case = Case.objects.get(case_id=case_id)
case_list.append(case)
plan_name = request.POST['plan_name'].strip()
if plan_name == '':
return render(request, 'base/plan/update.html',
{'name_error': '计划名称不能为空!', "prj_list": prj_list, 'plan': plan, 'case_list': case_list,
'environments': environments})
# name_same = Plan.objects.filter(project__user_id=user_id).filter(plan_name=plan_name).exclude(
# plan_id=plan_id)
name_same = Plan.objects.filter(plan_name=plan_name).exclude(plan_id=plan_id)
if name_same:
return render(request, 'base/plan/update.html',
{'name_error': '计划: {},已存在!'.format(plan_name), "prj_list": prj_list, 'plan': plan,
'case_list': case_list, 'environments': environments})
prj_id = request.POST['prj_id']
project = Project.objects.get(prj_id=prj_id)
is_locust = request.POST['is_locust']
env_id = request.POST['env_id']
is_task = request.POST['is_task']
environment = Environment.objects.get(env_id=env_id)
description = request.POST['description']
content = request.POST.getlist("case_id")
username = request.session.get('user', '')
if content == []:
return render(request, 'base/plan/update.html',
{'content_error': '请选择用例编号!', 'plan': plan, "prj_list": prj_list,
'case_list': case_list, 'environments': environments})
if is_locust == '1':
Plan.objects.filter(is_locust=1).update(is_locust=0)
if is_task == '1':
Plan.objects.filter(is_task=1).update(is_task=0)
Plan.objects.filter(plan_id=plan_id).update(plan_name=plan_name, project=project, environment=environment,
description=description, content=content, is_locust=is_locust,
is_task=is_task, update_time=datetime.now(),
update_user=username)
log.info('edit plan {} success. plan info: {} // {} // {} // {}'.format(plan_name, project, environment,
description, content))
return HttpResponseRedirect("/base/plan/")
plan_id = request.GET['plan_id']
plan = Plan.objects.get(plan_id=plan_id)
environments = Environment.objects.filter(project_id=plan.project_id).all().values()
case_list = []
for case_id in eval(plan.content):
try:
case = Case.objects.get(case_id=case_id)
case_list.append(case)
except Case.DoesNotExist as e:
log.error('计划 {} 中的 用例 {} 已被删除!!!'.format(plan.plan_name, case_id))
plans = Plan.objects.all()
page = request.GET.get('page')
contacts = paginator(plans, page)
return render(request, "base/plan/index.html",
{"contacts": contacts, 'error': '计划 {} 中的 用例 {} 已被删除!!!'.format(plan.plan_name, case_id)})
return render(request, "base/plan/update.html",
{"prj_list": prj_list, 'plan': plan, 'case_list': case_list, 'environments': environments})
# 删除测试计划
# @login_required
def plan_delete(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/plan/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
plan_id = request.GET['plan_id']
Plan.objects.filter(plan_id=plan_id).delete()
log.info('用户 {} 删除计划 {} 成功.'.format(user_id, plan_id))
return HttpResponseRedirect("base/plan/")
# 运行测试计划
# @login_required
def plan_run(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
return HttpResponse('用户未登录')
else:
if request.method == 'POST':
global totalTime, start_time, now_time
begin_time = time.clock()
start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
now_time = int(time.mktime(time.strptime(start_time, '%Y-%m-%d %H:%M:%S')))
plan_id = request.POST['plan_id']
plan = Plan.objects.get(plan_id=plan_id)
env_id = plan.environment.env_id
case_id_list = eval(plan.content)
case_num = len(case_id_list)
content = []
pass_num = 0
fail_num = 0
error_num = 0
i = 0
for case_id in case_id_list:
execute = Test_execute(case_id, env_id, case_id_list)
case_result = execute.test_case() # 运行用例
if isinstance(case_result, dict):
content.append(case_result)
else:
return HttpResponse(case_result)
end_time = time.clock()
# 运行报告运行时长
now_timea = end_time - begin_time
totalTime = str(round(now_timea, 3)) + 's'
for step in content:
for s in step['step_list']:
if s["result"] == "pass":
pass_num += 1
i += 1
s['id'] = i
if s["result"] == "fail":
fail_num += 1
i += 1
s['id'] = i
if s["result"] == "error":
error_num += 1
i += 1
s['id'] = i
pic_name = DrawPie(pass_num, fail_num, error_num)
report_name = plan.plan_name + "-" + str(start_time)
username = request.session.get('user', '')
report = Report(plan=plan, report_name=report_name, content=content, case_num=case_num,
pass_num=pass_num, fail_num=fail_num, error_num=error_num, pic_name=pic_name,
totalTime=totalTime, startTime=start_time, update_user=username)
report.save()
Plan.objects.filter(plan_id=plan_id).update(make=0, update_time=datetime.now(), update_user=username)
return HttpResponse(plan.plan_name + " 执行成功!")
# @login_required
def plan_unittest_run(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
return HttpResponse('用户未登录')
else:
if request.method == 'POST':
global totalTime, start_time, now_time
plan_id = request.POST['plan_id']
plan = Plan.objects.get(plan_id=plan_id)
case_id_list = eval(plan.content)
env = Environment.objects.get(env_id=plan.environment_id)
# case_path = os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))), 'case')
# if not os.path.exists(case_path): os.mkdir(case_path) # 如果不存在这个logs文件夹,就自动创建一个
# py_path = os.path.join(case_path, 'test_api.py')
py_path = os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))), 'test_api.py')
test_data = []
for case_id in case_id_list:
try:
case = Case.objects.get(case_id=int(case_id))
except Case.DoesNotExist as e:
log.error('计划:{} 中的 用例 {} 已被删除!'.format(plan.plan_name, case_id))
return HttpResponse('计划:{} 中的 用例 {} 已被删除!'.format(plan.plan_name, case_id))
set_headers = env.set_headers
if_list = eval(case.content)
for i in if_list:
interface = Interface.objects.get(if_id=i['if_id'])
test_data.append(
{'case_name': case.case_name, 'if_id': interface.if_id, 'if_name': interface.if_name,
'method': interface.method, 'url': env.url + interface.url, 'data_type': interface.data_type,
'headers':i['header'], 'body': i['body'], 'checkpoint': i['validators'],'params':i['params'],
'extract': i['extract']})
with open(py_path, 'w', encoding='utf-8') as f:
data = '#!/user/bin/env python \n' + '# coding=utf-8\n' + 'import json\n' + 'import ddt\n' + 'from common.logger import Log\n' + 'from common import base_api\n' + 'import unittest\n' + 'import requests\n' \
+ '\ntest_data = {}'.format(
test_data) + '\n' + 'log = Log() # 初始化log\n\n\n' + 'log.warning("*=-"*100)\n' + '@ddt.ddt\n' + 'class Test_api(unittest.TestCase):\n\t' + \
'@classmethod\n\t' + 'def setUpClass(cls):\n\t\t' + 'cls.s = requests.session()\n\n\t' + '@ddt.data(*test_data)\n\t' + 'def test_api(self, data):\n\t\t' + '"""{0}"""\n\t\t' + 'self._testMethodDoc=data.get("if_name","---")\n\t\t' \
+ 'res = base_api.send_requests(self.s, data) # 调用send_requests方法,请求接口,返回结果\n\t\t' + 'checkpoint = res["checkpoint"] # 检查点 checkpoint\n\t\t' + 'res_text = res["text"] # 返回结果\n\t\t' + \
'text = json.loads(res_text)\n\t\t' + "for inspect in checkpoint:\n\t\t\t" + 'self.assertEqual(str(inspect["expect"]),str(text[inspect["check"]]), "检查点验证失败!") # 断言\n\n\n' \
+ "if __name__ == '__main__':\n\t" + 'unittest.main()'
f.write(data)
sesu = run_this.run_email() # 取出报告的值
df_ = sesu.fields
case_num = df_.get('testAll', 0)
pass_num = df_.get('testPass', 0)
fail_num = df_.get('testFail', 0)
error_num = df_.get('testError', 0)
start_time = df_.get('beginTime', '--')
totalTime = df_.get('totalTime', '--')
# print(vars(a))
report_filepath = get_new_report_html(report_path)
report_name = plan.plan_name + "-" + str(start_time)
username = request.session.get('user', '')
# # 报告结果写入数据库
# pic_name = DrawPie(pass_num, fail_num, error_num)
# report_name = plan.plan_name + "-" + str(start_time)
report = Report(plan=plan, report_name=report_name, content='', case_num=case_num,
pass_num=pass_num, fail_num=fail_num, error_num=error_num, pic_name='',
totalTime=totalTime, startTime=start_time, update_user=username, path=report_filepath)
report.save()
Plan.objects.filter(plan_id=plan_id).update(make=1, report_name=report_name, update_time=datetime.now(),
update_user=username)
content = Plan.objects.get(plan_id=plan_id)
pass_num = len(eval(content.content))
log.info('-------------------------->plan_unittest_run plan_id: {}'.format(plan_id))
return HttpResponse(plan.plan_name + " 执行成功!")
# 定时任务
# @login_required
# @page_cache(5)
def timing_task(request):
user_id = request.session.get('user_id', '')
if get_user(user_id):
task_list = PeriodicTask.objects.all()
task_count = PeriodicTask.objects.all().count() # 统计数
periodic_list = IntervalSchedule.objects.all() # 周期任务 (如:每隔1小时执行1次)
crontab_list = CrontabSchedule.objects.all() # 定时任务 (如:某年月日的某时,每天的某时)
return render(request, "system/task/task_index.html",
{"tasks": task_list, "taskcounts": task_count, "periodics": periodic_list,
"crontabs": crontab_list})
else:
request.session['login_from'] = '/base/timing_task/'
return render(request, 'user/login_action.html')
# 查看报告页面
# @login_required
# @page_cache(5)
def report_page(request):
if request.method == 'GET':
user_id = request.session.get('user_id', '')
if get_user(user_id):
plan_id = request.GET.get('plan_id', '')
if plan_id:
report_list = Report.objects.filter(plan_id=plan_id).order_by('-report_id')
else:
report_list = Report.objects.all().order_by('-report_id')
for item in report_list:
path = item.path
if path:
item.path = path.split('/')[-1]
page = request.GET.get('page')
contacts = paginator(report_list, page)
return render(request, "base/report_page/report_page.html",
{"contacts": contacts, 'plan_id': plan_id})
else:
request.session['login_from'] = '/base/report_page/'
return render(request, 'user/login_action.html')
# 显示日志信息
# @login_required
def report_logs(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/report_page/'
return render(request, 'user/login_action.html')
else:
report_id = request.GET.get('report_id')
plan_id = Report.objects.get(report_id=report_id).plan_id
make = Plan.objects.get(plan_id=plan_id).make
if make: # unittest日志
file_list = []
now = time.strftime('%Y-%m-%d')
log_file_list = os.listdir(logs_path)
for file in log_file_list:
if file[0].isdigit() and now in file:
file_list.append(file)
if not file_list:
return render(request, 'base/report_page/log.html', {'unicode': True})
data_list = []
file_list.sort()
log_file = os.path.join(logs_path, file_list[0])
try:
with open(log_file, 'rb') as f:
off = -1024 * 1024
if f.tell() < -off:
data = f.readlines()
else:
f.seek(off, 2)
data = f.readlines()
for line in data:
data_list.append(line.decode())
return render(request, 'base/report_page/log.html', {'data': data_list, 'make': True})
except UnicodeDecodeError:
return render(request, 'base/report_page/log.html', {'unicode': True})
else:
try:
report = Report.objects.get(report_id=report_id)
except Report.DoesNotExist:
return render(request, "base/report_page/log.html")
else:
report_content = eval(report.content)
for case in report_content:
global class_name
class_name = case['class_name']
return render(request, "base/report_page/log.html",
{"report": report, 'plan_id': plan_id, "report_content": report_content,
'class_name': class_name})
# 展示报告
# @login_required
def report_index(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/report_page/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
report_id = request.GET.get('report_id', '')
if not report_id:
return render(request, "report.html")
try:
report = Report.objects.get(report_id=report_id)
report_file = report.path
if report_file:
return HttpResponse(open(report_file,'rb'))
except Report.DoesNotExist:
return render(request, 'report.html')
plan_id = Report.objects.get(report_id=report_id).plan_id
make = Plan.objects.get(plan_id=plan_id).make
plan_name = Plan.objects.get(plan_id=plan_id).report_name
# if make: # unittest报告
# log.info(
# '-------------------------->report_index plan_id: {} , plan_name: {}'.format(plan_id,
# plan_name))
# print("返回unittest")
# return render(request, '{}'.format(plan_name))
report = Report.objects.get(report_id=report_id)
case_num = report.case_num
pass_num = report.pass_num
fail_num = report.fail_num
error_num = report.error_num
report_content = eval(report.content)
for case in report_content:
global class_name
class_name = case['class_name']
return render(request, "report.html",
{"report": report, 'plan_id': plan_id, 'case_num': case_num, "error_num": error_num,
'pass_num': pass_num, 'fail_num': fail_num, "report_content": report_content,
'img_name': str(now_time) + 'pie.png', 'class_name': class_name})
# @login_required
def report_search(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
return HttpResponse('0')
else:
if request.method == 'POST':
result = request.POST['result']
report_id = request.POST['report_id']
try:
report = Report.objects.get(report_id=report_id)
except Report.DoesNotExist:
return render(request, "report.html")
report_content = eval(report.content)
if result not in ['pass', 'fail']:
return HttpResponse(str(report_content))
for case in report_content:
global class_name
class_name = case['class_name']
step_list = case['step_list']
case['step_list'] = []
for step in step_list:
if result == step['result']:
case['step_list'].append(step)
else:
pass
return HttpResponse(str(report_content))
# 删除报告
# @login_required
def report_delete(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/report_page/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
report_id = request.GET['report_id']
Report.objects.filter(report_id=report_id).delete()
log.info('用户 {} 删除报告 {} 成功.'.format(user_id, report_id))
return HttpResponseRedirect("base/report_page/")
# 下载unittest报告
# @login_required
def file_download(request):
# do something...
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/report_page/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
plan_id = request.GET.get('plan_id', '')
name = request.GET.get('log_file', '')
if plan_id:
name = Plan.objects.get(plan_id=plan_id).report_name
if not name:
if plan_id:
report_list = Report.objects.filter(plan_id=plan_id).order_by('-report_id')
else:
report_list = Report.objects.all().order_by('-report_id')
page = request.GET.get('page')
contacts = paginator(report_list, page)
return render(request, "base/report_page/report_page.html",
{"contacts": contacts, 'plan_id': plan_id,
'error': '计划 {} 不存在unittest报告'.format(
plan_id)})
def file_iterator(file_name, chunk_size=512):
with open(file_name, encoding='utf-8') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
response = StreamingHttpResponse(file_iterator(name))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(name)
log.info('用户 {} 下载测试报告或日志文件:{} 成功.'.format(user_id, name))
return response
# locust页面
# @login_required
# @page_cache(5)
def performance_index(request):
if request.method == 'GET':
user_id = request.session.get('user_id', '')
if get_user(user_id):
return render(request, 'base/performance/performance.html')
else:
request.session['login_from'] = '/base/performance/'
return render(request, 'user/login_action.html')
# 添加用户
# @login_required
# @page_cache(5)
def user_index(request):
user_id = request.session.get('user_id', '')
if get_user(user_id):
user = User.objects.all()
page = request.GET.get('page')
contacts = paginator(user, page)
return render(request, 'system/user/user_index.html', {"contacts": contacts})
else:
request.session['login_from'] = '/base/user/'
return render(request, 'user/login_action.html')
# 异步请求数据
def findata(request):
if request.method == 'GET':
get_type = request.GET["type"]
if get_type == "get_all_if_by_prj_id":
prj_id = request.GET["prj_id"]
# 返回字典列表
if_list = Interface.objects.filter(project=prj_id).all().values()
# list(if_list)将QuerySet转换成list
return JsonResponse(list(if_list), safe=False)
if get_type == "get_if_by_search_name":
search_name = request.GET["search_name"]
prj_id = request.GET["prj_id"]
# 返回字典列表
if_list = Interface.objects.filter(project=prj_id).filter(if_name__contains=search_name).all().values()
# list(if_list)将QuerySet转换成list
return JsonResponse(list(if_list), safe=False)
if get_type == "get_if_by_if_id":
if_id = request.GET["if_id"]
# 查询并将结果转换为json
interface = Interface.objects.filter(if_id=if_id).values()
return JsonResponse(list(interface), safe=False)
if get_type == "get_env_by_prj_id":
prj_id = request.GET["prj_id"]
# 查询并将结果转换为json
env = Environment.objects.filter(project_id=prj_id).values()
return JsonResponse(list(env), safe=False)
if get_type == "get_case_by_case_id": # 增加 get_case_by_case_id 类型,编辑 用例 使用
case_id = request.GET["case_id"]
# 查询并将结果转换为json
case = Case.objects.filter(case_id=case_id).values()
return JsonResponse(list(case), safe=False)
if get_type == "get_all_case_by_prj_id":
prj_id = request.GET["prj_id"]
# 查询并将结果转换为json
env = Case.objects.filter(project_id=prj_id).values()
return JsonResponse(list(env), safe=False)
if get_type == 'get_log':
log_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/logs'
log_file_list = os.listdir(log_path)
file_list = []
now = time.strftime('%Y-%m-%d')
for file in log_file_list:
if 'all' in file and now in file:
file_list.append(file)
if not file_list:
yesterday = datetime.today() + timedelta(-1)
yesterday_format = yesterday.strftime('%Y_%m_%d')
for file in log_file_list:
if 'all' in file and yesterday_format in file:
file_list.apppend(file)
file_list.sort()
log_file = os.path.join(log_path, file_list[0])
data_list = []
with open(log_file, 'r', encoding='utf-8') as f:
off = -1024 * 1024
if f.tell() < -off:
data = f.readlines()
else:
f.seek(off, 2)
data = f.readlines()
# data = f.readlines()
for i in data:
data_list.append(i.replace('True', 'true').replace('False', 'false').replace('None', 'null'))
return JsonResponse(data_list, safe=False)
# 全局变量
# @login_required
# @page_cache(5)
def variable(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/variable/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
variable_list = Variable.objects.all().values()
page = request.GET.get('page')
contacts = paginator(variable_list, page)
return render(request, "system/variable/common_variable.html", {"variable_list": contacts})
# 全局变量新增
# @login_required
def variable_add(request):
try:
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/sign/'
return render(request, 'user/login_action.html')
else:
if request.method == 'POST':
variable_name = request.POST['variable_name'].strip()
variable_value = request.POST['variable_value'].strip()
# 判断值是否为空
if variable_name == '':
return render(request, 'system/variable/variable_add.html', {'error': '变量名不能为空!'})
elif variable_value == '':
return render(request, 'system/variable/variable_add.html', {'error': '变量值不能为空!'})
name_exit = Variable.objects.filter(variable_name=variable_name)
# value_exit = Variable.objects.filter(variable_value=variable_value)
# 判断值是否在数据库
if name_exit:
return render(request, 'system/variable/variable_add.html',
{'error': '变量名: {},已存在!'.format(variable_name)})
# elif value_exit:
# return render(request, 'system/variable/variable_add.html', {'error': '变量名: {},已存在!'.format(variable_value)})
# 获取描述字段的值
description = request.POST['description']
# 获取user 名称
username = request.session.get('user', '')
# print(username)
variable = Variable(variable_name=variable_name, variable_value=variable_value, description=description,
update_user=username)
variable.save()
log.info('add variable_name {} success, and variable_value {} success. variable info: {} '.format(
variable_name, variable_value, description))
return HttpResponseRedirect("/base/variable/")
return render(request, "system/variable/variable_add.html")
finally:
# 更新全局变量文件
from common.base_api import res_global_path
value_item = Variable.objects.all()
json_data = {item.variable_name: item.variable_value for item in value_item}
with open(res_global_path, 'w') as f:
json.dump(json_data, f)
# 全局变量编辑
# @login_required
def variable_update(request):
try:
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/variable/'
return render(request, 'user/login_action.html')
else:
if request.method == 'POST':
variable_id = request.POST['variable_id']
variable_name = request.POST['variable_name'].strip()
variable_value = request.POST['variable_value'].strip()
# 判断变量名、值不能为空
if variable_name == '':
variable = Variable.objects.get(variable_name=variable_name)
return render(request, 'system/variable/variable_update.html',
{'error': '变量名称不能为空!', "variable": variable})
elif variable_value == '':
variable = Variable.objects.get(variable_value=variable_value)
return render(request, 'system/variable/variable_update.html',
{'error': '变量名称不能为空!', "variable": variable})
# 判断变量是否存在
name_exit = Variable.objects.filter(variable_name=variable_name).exclude(variable_id=variable_id)
value_exit = Variable.objects.filter(variable_value=variable_value).exclude(variable_id=variable_id)
if name_exit:
variable = Variable.objects.get(name_exit=name_exit)
return render(request, 'system/variable/variable_update.html',
{'error': '变量名: {},已存在!'.format(variable_name), "variable": variable})
elif value_exit:
variable = Variable.objects.get(name_exit=name_exit)
return render(request, 'system/variable/variable_update.html',
{'error': '变量值: {},已存在!'.format(variable_value), "variable": variable})
# 获取描述字段的值
description = request.POST['description']
# 获取user 名称
username = request.session.get('user', '')
Variable.objects.filter(variable_id=variable_id).update(variable_name=variable_name,
variable_value=variable_value,
description=description,
update_time=datetime.now(),
update_user=username)
log.info('edit variable_name {} success. edit variable_value {} success. sign info: {} '.format(
variable_name, variable_value, description))
return HttpResponseRedirect("/base/variable/")
variable_id = request.GET['variable_id']
variable = Variable.objects.get(variable_id=variable_id)
return render(request, "system/variable/variable_update.html", {"variable": variable})
finally:
# 更新全局变量文件
from common.base_api import res_global_path
value_item = Variable.objects.all()
json_data = {item.variable_name: item.variable_value for item in value_item}
with open(res_global_path, 'w') as f:
json.dump(json_data, f)
# 全局变量删除
# @login_required
def variable_delete(request):
try:
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/variable/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
variable_id = request.GET['variable_id']
Variable.objects.filter(variable_id=variable_id).delete()
log.info('用户 {} 删除变量 {} 成功.'.format(user_id, variable_id))
return HttpResponseRedirect("base/variable/")
finally:
# 更新全局变量文件
from common.base_api import res_global_path
value_item = Variable.objects.all()
json_data = {item.variable_name: item.variable_value for item in value_item}
with open(res_global_path, 'w') as f:
json.dump(json_data, f)
# markdown
# @login_required
def markdownPlan(request):
user_id = request.session.get('user_id', '')
if not get_user(user_id):
request.session['login_from'] = '/base/markdown/'
return render(request, 'user/login_action.html')
else:
if request.method == 'GET':
return render(request, "base/markdown/markdownPlan.html")
import os
import time
import json
import logging
from django.shortcuts import render, redirect
from django.http import StreamingHttpResponse
from base.models import Project, Environment, Interface, Case, Plan, Report, Variable
from lib.execute import Test_execute, get_user # 执行接口
log = logging.getLogger('log') # 初始化log
report_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/templates' + '/report'
logs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/' + 'logs' # 拼接删除目录完整路径
# web首页
# @login_required
# @page_cache(5)
def webcase_index(request):
user_id = request.session.get('user_id', '') # 从session中获取user_id
# if get_user(user_id):
# prj_list = Project.objects.all() # 按照user_id查询项目
# page = request.GET.get('page')
# contacts = paginator(prj_list, page)
# return render(request, "base/project/index.html", {"prj_list": prj_list, 'contacts': contacts})
# else:
# request.session['login_from'] = '/base/project/'
return render(request, 'web_base/index.html')
# 新增web用例
# @login_required
# @page_cache(5)
def webcase_add(request):
user_id = request.session.get('user_id', '') # 从session中获取user_id
# if get_user(user_id):
# prj_list = Project.objects.all() # 按照user_id查询项目
# page = request.GET.get('page')
# contacts = paginator(prj_list, page)
# return render(request, "base/project/index.html", {"prj_list": prj_list, 'contacts': contacts})
# else:
# request.session['login_from'] = '/base/project/'
return render(request, 'web_base/add.html')
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly
deactivate () {
unset -f pydoc >/dev/null 2>&1
# reset old environment variables
# ! [ -z ${VAR+_} ] returns true if VAR is declared at all
if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then
PATH="$_OLD_VIRTUAL_PATH"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then
PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
export PYTHONHOME
unset _OLD_VIRTUAL_PYTHONHOME
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
hash -r 2>/dev/null
fi
if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then
PS1="$_OLD_VIRTUAL_PS1"
export PS1
unset _OLD_VIRTUAL_PS1
fi
unset VIRTUAL_ENV
if [ ! "${1-}" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}
# unset irrelevant variables
deactivate nondestructive
VIRTUAL_ENV="/Users/apple/Documents/002project/EasyTest"
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
# unset PYTHONHOME if set
if ! [ -z "${PYTHONHOME+_}" ] ; then
_OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
unset PYTHONHOME
fi
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
_OLD_VIRTUAL_PS1="$PS1"
if [ "x" != x ] ; then
PS1="$PS1"
else
PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
fi
export PS1
fi
# Make sure to unalias pydoc if it's already there
alias pydoc 2>/dev/null >/dev/null && unalias pydoc
pydoc () {
python -m pydoc "$@"
}
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
hash -r 2>/dev/null
fi
# This file must be used with "source bin/activate.csh" *from csh*.
# You cannot run it directly.
# Created by Davide Di Blasi <davidedb@gmail.com>.
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc'
# Unset irrelevant variables.
deactivate nondestructive
setenv VIRTUAL_ENV "/Users/apple/Documents/002project/EasyTest_master"
set _OLD_VIRTUAL_PATH="$PATH"
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
if ("" != "") then
set env_name = ""
else
set env_name = `basename "$VIRTUAL_ENV"`
endif
# Could be in a non-interactive environment,
# in which case, $prompt is undefined and we wouldn't
# care about the prompt anyway.
if ( $?prompt ) then
set _OLD_VIRTUAL_PROMPT="$prompt"
set prompt = "[$env_name] $prompt"
endif
unset env_name
alias pydoc python -m pydoc
rehash
# This file must be used using `. bin/activate.fish` *within a running fish ( http://fishshell.com ) session*.
# Do not run it directly.
function deactivate -d 'Exit virtualenv mode and return to the normal environment.'
# reset old environment variables
if test -n "$_OLD_VIRTUAL_PATH"
set -gx PATH $_OLD_VIRTUAL_PATH
set -e _OLD_VIRTUAL_PATH
end
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
set -e _OLD_VIRTUAL_PYTHONHOME
end
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
# Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`.
set -l fish_function_path
# Erase virtualenv's `fish_prompt` and restore the original.
functions -e fish_prompt
functions -c _old_fish_prompt fish_prompt
functions -e _old_fish_prompt
set -e _OLD_FISH_PROMPT_OVERRIDE
end
set -e VIRTUAL_ENV
if test "$argv[1]" != 'nondestructive'
# Self-destruct!
functions -e pydoc
functions -e deactivate
end
end
# Unset irrelevant variables.
deactivate nondestructive
set -gx VIRTUAL_ENV "/Users/apple/Documents/002project/EasyTest_master"
set -gx _OLD_VIRTUAL_PATH $PATH
set -gx PATH "$VIRTUAL_ENV/bin" $PATH
# Unset `$PYTHONHOME` if set.
if set -q PYTHONHOME
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
set -e PYTHONHOME
end
function pydoc
python -m pydoc $argv
end
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
# Copy the current `fish_prompt` function as `_old_fish_prompt`.
functions -c fish_prompt _old_fish_prompt
function fish_prompt
# Save the current $status, for fish_prompts that display it.
set -l old_status $status
# Prompt override provided?
# If not, just prepend the environment name.
if test -n ""
printf '%s%s' "" (set_color normal)
else
printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV")
end
# Restore the original $status
echo "exit $old_status" | source
_old_fish_prompt
end
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
end
# This file must be dot sourced from PoSh; you cannot run it directly. Do this: . ./activate.ps1
$script:THIS_PATH = $myinvocation.mycommand.path
$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent
function global:deactivate([switch] $NonDestructive)
{
if (test-path variable:_OLD_VIRTUAL_PATH)
{
$env:PATH = $variable:_OLD_VIRTUAL_PATH
remove-variable "_OLD_VIRTUAL_PATH" -scope global
}
if (test-path function:_old_virtual_prompt)
{
$function:prompt = $function:_old_virtual_prompt
remove-item function:\_old_virtual_prompt
}
if ($env:VIRTUAL_ENV)
{
$old_env = split-path $env:VIRTUAL_ENV -leaf
remove-item env:VIRTUAL_ENV -erroraction silentlycontinue
}
if (!$NonDestructive)
{
# Self destruct!
remove-item function:deactivate
remove-item function:pydoc
}
}
function global:pydoc
{
python -m pydoc $args
}
# unset irrelevant variables
deactivate -nondestructive
$VIRTUAL_ENV = $BASE_DIR
$env:VIRTUAL_ENV = $VIRTUAL_ENV
$global:_OLD_VIRTUAL_PATH = $env:PATH
$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH
if (!$env:VIRTUAL_ENV_DISABLE_PROMPT)
{
function global:_old_virtual_prompt
{
""
}
$function:_old_virtual_prompt = $function:prompt
if ("" -ne "")
{
function global:prompt
{
# Add the custom prefix to the existing prompt
write-host "" -nonewline
& $function:_old_virtual_prompt
}
}
else
{
function global:prompt
{
# Add a prefix to the current prompt, but don't discard it.
write-host "($( split-path $env:VIRTUAL_ENV -leaf )) " -nonewline
& $function:_old_virtual_prompt
}
}
}
"""Xonsh activate script for virtualenv"""
from xonsh.tools import get_sep as _get_sep
def _deactivate(args):
if "pydoc" in aliases:
del aliases["pydoc"]
if ${...}.get("_OLD_VIRTUAL_PATH", ""):
$PATH = $_OLD_VIRTUAL_PATH
del $_OLD_VIRTUAL_PATH
if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""):
$PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME
del $_OLD_VIRTUAL_PYTHONHOME
if "VIRTUAL_ENV" in ${...}:
del $VIRTUAL_ENV
if "VIRTUAL_ENV_PROMPT" in ${...}:
del $VIRTUAL_ENV_PROMPT
if "nondestructive" not in args:
# Self destruct!
del aliases["deactivate"]
# unset irrelevant variables
_deactivate(["nondestructive"])
aliases["deactivate"] = _deactivate
$VIRTUAL_ENV = r"/Users/edz/AutoTestProm/AutoTestProm/EasyTest_master"
$_OLD_VIRTUAL_PATH = $PATH
$PATH = $PATH[:]
$PATH.add($VIRTUAL_ENV + _get_sep() + "bin", front=True, replace=True)
if ${...}.get("PYTHONHOME", ""):
# unset PYTHONHOME if set
$_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME
del $PYTHONHOME
$VIRTUAL_ENV_PROMPT = ""
if not $VIRTUAL_ENV_PROMPT:
del $VIRTUAL_ENV_PROMPT
aliases["pydoc"] = ["python", "-m", "pydoc"]
"""By using execfile(this_file, dict(__file__=this_file)) you will
activate this virtualenv environment.
This can be used when you must use an existing Python interpreter, not
the virtualenv bin/python
"""
try:
__file__
except NameError:
raise AssertionError(
"You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))")
import sys
import os
old_os_path = os.environ.get('PATH', '')
os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path
base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if sys.platform == 'win32':
site_packages = os.path.join(base, 'Lib', 'site-packages')
else:
site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base
# Move the added items to the front of the path:
new_sys_path = []
for item in list(sys.path):
if item not in prev_sys_path:
new_sys_path.append(item)
sys.path.remove(item)
sys.path[:0] = new_sys_path
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from celery.__main__ import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from celery.__main__ import _compat_beat
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(_compat_beat())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from celery.__main__ import _compat_worker
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(_compat_worker())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from celery.__main__ import _compat_multi
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(_compat_multi())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from chardet.cli.chardetect import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from django.core.management import execute_from_command_line
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(execute_from_command_line())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
from django.core import management
if __name__ == "__main__":
management.execute_from_command_line()
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/edz/AutoTestProm/AutoTestProm/EasyTest_master/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from numpy.f2py.f2py2e import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from numpy.f2py.f2py2e import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from numpy.f2py.f2py2e import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/edz/AutoTestProm/AutoTestProm/EasyTest_master/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from numpy.f2py.f2py2e import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from faker.cli import execute_from_command_line
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(execute_from_command_line())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from markdown.__main__ import run
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(run())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from Naked.app import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/edz/AutoTestProm/AutoTestProm/EasyTest_master/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
python3
\ No newline at end of file
#!/Users/apple/Documents/002project/EasyTest_master/bin/python
import sys
import getopt
import sysconfig
valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
'ldflags', 'help']
if sys.version_info >= (3, 2):
valid_opts.insert(-1, 'extension-suffix')
valid_opts.append('abiflags')
if sys.version_info >= (3, 3):
valid_opts.append('configdir')
def exit_with_usage(code=1):
sys.stderr.write("Usage: {0} [{1}]\n".format(
sys.argv[0], '|'.join('--'+opt for opt in valid_opts)))
sys.exit(code)
try:
opts, args = getopt.getopt(sys.argv[1:], '', valid_opts)
except getopt.error:
exit_with_usage()
if not opts:
exit_with_usage()
pyver = sysconfig.get_config_var('VERSION')
getvar = sysconfig.get_config_var
opt_flags = [flag for (flag, val) in opts]
if '--help' in opt_flags:
exit_with_usage(code=0)
for opt in opt_flags:
if opt == '--prefix':
print(sysconfig.get_config_var('prefix'))
elif opt == '--exec-prefix':
print(sysconfig.get_config_var('exec_prefix'))
elif opt in ('--includes', '--cflags'):
flags = ['-I' + sysconfig.get_path('include'),
'-I' + sysconfig.get_path('platinclude')]
if opt == '--cflags':
flags.extend(getvar('CFLAGS').split())
print(' '.join(flags))
elif opt in ('--libs', '--ldflags'):
abiflags = getattr(sys, 'abiflags', '')
libs = ['-lpython' + pyver + abiflags]
libs += getvar('LIBS').split()
libs += getvar('SYSLIBS').split()
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
# shared library in prefix/lib/.
if opt == '--ldflags':
if not getvar('Py_ENABLE_SHARED'):
libs.insert(0, '-L' + getvar('LIBPL'))
if not getvar('PYTHONFRAMEWORK'):
libs.extend(getvar('LINKFORSHARED').split())
print(' '.join(libs))
elif opt == '--extension-suffix':
ext_suffix = sysconfig.get_config_var('EXT_SUFFIX')
if ext_suffix is None:
ext_suffix = sysconfig.get_config_var('SO')
print(ext_suffix)
elif opt == '--abiflags':
if not getattr(sys, 'abiflags', None):
exit_with_usage()
print(sys.abiflags)
elif opt == '--configdir':
print(sysconfig.get_config_var('LIBPL'))
python3.7
\ No newline at end of file
python3
\ No newline at end of file
File added
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from qrcode.console_scripts import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from sqlparse.__main__ import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/Users/apple/Documents/002project/EasyTest_master/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from wheel.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
# coding:utf-8
import os
res_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/common' + '/config' + '/res.json'
res_global_path = os.path.abspath(
os.path.dirname(os.path.dirname(__file__))) + '/common' + '/config' + '/res_global.json'
res_alias_json = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/common' + '/config' + '/res_alias.json'
import json
import copy
import time
from common.processingJson import write_data, get_json
from common.logger import Log
from common.config import testDate
from lib.public import get_extract, get_param, replace_var, extract_variables, \
get_param_reponse, call_interface, format_url
import urllib3
from base.models import Case
from lib.public import format_request
urllib3.disable_warnings()
log = Log() # 初始化log
# res_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\common' + '\\config' + '\\res.json'
# extract_dict = {}
def send_requests(s, data_dict_D):
"""封装requests请求"""
data_dict = copy.deepcopy(data_dict_D)
if not isinstance(data_dict, dict): # 判断传入参数类型
raise TypeError('{} 参数不是字典类型'.format(send_requests.__name__))
else:
# 其实要取库里面的值
case_from_sql = Case.objects.get(case_name=data_dict['case_name'])
new_dict = [item for item in json.loads(case_from_sql.content) if str(item['if_id']) == str(data_dict['if_id'])][0]
# 主要是获取
method = data_dict["method"] # 获取请求方式
url = format_request(data_dict["url"]) # 获取请求地址
data_type = data_dict["data_type"] # 请求参数类型
test_name = data_dict['if_name'] # 测试用例中文名称
headers = format_request(new_dict['header'])
params = format_request(new_dict['params'])
body = format_request(new_dict['body'])
if json.dumps(body).startswith('['): # body参数是list的情况
for k, v in body.items():
body[k] = eval(v)
url, body = format_url(url, body)
print('<div style="color:green"><strong>url</strong>' + '</div>')
print('<div>' + url + '</div>')
print('<div style="color:green"><strong>Method</strong></div>')
print('<div>' + method.upper() + '</div>')
if body:
print('<div style="color:green">' + '<strong>Body</strong>' + '</div>')
try:
print(
'<div style="max-height:350px;overflow:scroll"><pre style="white-space: pre-wrap;word-wrap: break-word;">' + json.dumps(
body, indent=2,
ensure_ascii=False) + '</pre></div>')
except:
print(str(body))
# end
extract = new_dict['extract']
# checkpoint = data_dict["checkpoint"] modify --liangfenglong 换成下一行
if_id = data_dict['if_id']
checkpoint = new_dict['validators']
res = {} # 接受返回数据
try:
# 构造请求
r = call_interface(s, method, url, headers, params, body, data_type)
print('<div style="color:green">' + '<strong>Response</strong>' + '</div>')
try:
print(
'<div style="max-height:350px;overflow:scroll"><pre style="white-space: pre-wrap;word-wrap: break-word;">' + json.dumps(
r.json(), indent=2,
ensure_ascii=False) + '</pre></div>')
except:
print(str(r))
# end
log.info("页面返回信息:%s" % r.content.decode("utf-8"))
# 信息存储到res字典中
res['if_id'] = if_id
res['test_name'] = test_name
res["status_code"] = str(r.status_code) # 状态码转成str
res["text"] = r.content.decode("utf-8")
if extract:
extract_dict = {}
for item in extract:
extract_dict[item] = get_param_reponse(extract[item], r.json())
write_data(extract_dict, res_path)
for item in checkpoint:
item['check'] = get_param_reponse(item['check'], r.json())
res['checkpoint'] = checkpoint
return res
except Exception as msg:
log.error('请求出现异常! {}'.format(msg))
res["msg"] = str(msg) # 出现异常,保存错误信息
res["result"] = "error" # 结果保存错误
print("这里是msg%s" % res)
return res
def replace_params(params, data_dict, params_type=0):
"""
上下文依赖
:param params:
:param data_dict:
:param params_type:
:return:
"""
var_list = extract_variables(params)
if var_list:
for var_name in var_list:
'''modify by -liangfenglong'''
# 查找顺序res_global_path,res_path,res_alias_json,然后在上一次返回值取值
# 2019-07-24 没必要看res_alias_json,在get_extract中用即可
var_value, alias_flag = get_json((res_global_path, res_path), var_name)
data_dict = json.loads(replace_var(data_dict, var_name, var_value))
log.info(data_dict)
if params_type == 0:
log.info('headers 替换依赖参数: {}'.format(data_dict['header']))
return data_dict['header']
elif params_type == 1:
body = {}
if data_dict:
body = data_dict.get('body', {})
log.info('body 替换上下文依赖参数: {}'.format(body))
return body
else:
log.info('{} 替换依赖参数: {}'.format(params_type, data_dict[params_type]))
return data_dict[params_type]
else:
return params
if __name__ == "__main__":
pass
[email]
title = 接口测试报告
;smtp服务
smtp_service = smtp.qq.com
smtp_server = smtp.163.com
port = 465
;发送邮件账号,授权码
sender_qq = 88428977@qq.com
pwd = qq88428977
sender_163 = 18633605169@163.com
pwd_163 = qq88428977
email_text = 接口测试执行成功!详情见附件。.
email_task = 定时任务执行接口出现错误,详情查看celery_worker.log.
# #邮箱配置
;收件人 收件人多个时,中间用逗号隔开,如'a@xx.com,b@xx.com'
;receiver = lixingyu@igengmei.com,liubingyin@igengmei.com,liufenglong@igengmei.com
receiver = lixingyu@igengmei.com
[MySQL]
MySQL_host = localhost
MySQL_user = root
MySQL_pwd = gengmei123
MySQL_database = easytest
MySQL_port = 3306
;MySQL_host = localhost
;MySQL_user = root
;MySQL_pwd = qwe123
;MySQL_database = uitest
;MySQL_port = 3306
{"diary_id": 16473343, "level": "7", "project_tag_ids": "[[845, 498, 497, 494], [285], [494, 376, 370], [1293, 1050], [880, 484, 3254], [254, 251], [276], [1070, 373, 372, 350], [3232, 1075, 889, 886, 250, 247, 242], [494, 315], [3203, 1298, 865, 194, 193, 192, 190], [539, 434], [1376, 1365, 1088, 892, 395, 385], [853, 849, 295, 272], [3239, 3228, 1368, 1088, 839, 836, 187, 186, 184, 182, 181, 180]]", "face_id": null, "reply_id": 994524, "user_name": "\u8517\u5e90\u5bfb\u68a6", "tractate_id": 415679, "id": "bal"}
\ No newline at end of file
{"version": "7.36.1", "tractate_id": "415679", "current_city_id": "beijing", "question_id": "234654", "answer_id": "1027947"}
\ No newline at end of file
test_data = []
case = None
env_id = None
\ No newline at end of file
import pymysql
from decimal import Decimal
from common import readConfig
import logging
log = logging.getLogger('log')
class SqL:
"""
连接数据库封装
"""
def __init__(self, job=False):
# self.log = Log()
"""判断是否连接成功"""
if job:
try:
self.conn = pymysql.connect(host=readConfig.MySQL_host_job, database=readConfig.MySQL_database_job,
user=readConfig.MySQL_user_job,
password=readConfig.MySQL_pwd_job, port=int(readConfig.MySQL_port_job),
use_unicode=True, charset='utf8')
# log.info('job 数据库连接成功')
except Exception as e:
log.error('job 数据库链接异常! {}'.format(e))
else:
try:
self.conn = pymysql.connect(host=readConfig.MySQL_host, database=readConfig.MySQL_database,
user=readConfig.MySQL_user,
password=readConfig.MySQL_pwd, port=int(readConfig.MySQL_port),
use_unicode=True, charset='utf8')
# log.info('本地 数据库连接成功')
except Exception as e:
log.error('本地 数据库链接异常! {}'.format(e))
def execute_sql(self, sql, dict_type=False, num=1):
"""返回查询结果集
sql: 执行的sql语句;
dict_type: 是否返回的数据是字典类型;
num: 返回的数据是一个还是多个
"""
if dict_type: # 返回数据字典类型
cur = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
else:
cur = self.conn.cursor()
try:
with cur as cur:
cur.execute(sql) # 执行sql
if 'delete' in sql or 'insert' in sql or 'update' in sql:
self.conn.commit() # 提交
else:
if num == 1: # 返回一条数据
data = cur.fetchone()
if dict_type:
return data
else:
return data[0]
else: # 返回多条数据
data_str = ''
data = cur.fetchall()
if dict_type:
return data
else:
for i in data:
for j in i:
data_str += str(j) + ',' # 拼接返回数据
return data_str
except Exception as e:
self.conn.rollback()
log.error('执行SQL语句出现异常:{}'.format(e))
return None
def __del__(self):
self.conn.close()
def decimal_format(self, money):
"""改变数据库数据编码格式"""
pay_money = Decimal(money).quantize(Decimal('0.00'))
return pay_money
if __name__ == '__main__':
r = SqL()
data = r.execute_sql("select plan_id from base_plan;", num=2)
print(data)
# coding:utf-8
import logging
from logging.handlers import RotatingFileHandler
import colorlog # 控制台日志输入颜色
import time
import datetime
import os
cur_path = os.path.dirname(os.path.realpath(__file__)) # log_path是存放日志的路径
log_path = os.path.join(os.path.dirname(cur_path), 'logs')
if not os.path.exists(log_path): os.mkdir(log_path) # 创建logs目录
# report_path = os.path.join(os.path.dirname(cur_path), 'report') # report excel file path
# if not os.path.exists(report_path): os.mkdir(report_path) # 创建report目录
logName = os.path.join(log_path, '%s.log' % time.strftime('%Y-%m-%d')) # 文件的命名
log_colors_config = {
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red',
}
class Log:
def __init__(self, logName=logName):
self.logName = logName
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
self.formatter = colorlog.ColoredFormatter(
'%(log_color)s[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s',
log_colors=log_colors_config) # 日志输出格式
self.handle_logs()
def handle_logs(self):
"""处理日志过期天数和日志size备份"""
dir_list = ['logs'] # 要删除文件的目录名
for dir in dir_list:
# dirPath = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\' + dir # 拼接删除目录完整路径
dirPath = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/' + dir # 拼接删除目录完整路径
file_list = get_file_sorted(dirPath) # 返回按修改时间排序的文件list
if file_list: # 目录下没有日志文件
for i in file_list:
file_path = os.path.join(dirPath, i) # 拼接文件的完整路径
t_list = TimeStampToTime(os.path.getctime(file_path)).split('-')
now_list = TimeStampToTime(time.time()).split('-')
t = datetime.datetime(int(t_list[0]), int(t_list[1]),
int(t_list[2])) # 将时间转换成datetime.datetime 类型
now = datetime.datetime(int(now_list[0]), int(now_list[1]), int(now_list[2]))
if (now - t).days > 6: # 创建时间大于6天的文件删除
self.delete_logs(file_path)
# if len(file_list) > 10: # 限制目录下记录文件数量
# file_list = file_list[0:-10]
# for i in file_list:
# file_path = os.path.join(dirPath, i)
# self.delete_logs(file_path)
def delete_logs(self, file_path):
try:
os.remove(file_path)
except PermissionError as e:
Log().warning('删除日志文件失败:{}'.format(e))
def __console(self, level, message):
# 创建一个FileHandler,用于写到本地
fh = RotatingFileHandler(filename=self.logName, mode='a', maxBytes=1024 * 1024 * 5, backupCount=10,
encoding='utf-8') # 使用RotatingFileHandler类,滚动备份日志
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)
# # 创建一个StreamHandler,用于输出到控制台
# ch = colorlog.StreamHandler()
# ch.setLevel(logging.DEBUG)
# ch.setFormatter(self.formatter)
# self.logger.addHandler(ch)
if level == 'info':
self.logger.info(message)
elif level == 'debug':
self.logger.debug(message)
elif level == 'warning':
self.logger.warning(message)
elif level == 'error':
self.logger.error(message)
# 这两行代码是为了避免日志输出重复问题
# self.logger.removeHandler(ch)
self.logger.removeHandler(fh)
fh.close() # 关闭打开的文件
def debug(self, message):
self.__console('debug', message)
def info(self, message):
self.__console('info', message)
def warning(self, message):
self.__console('warning', message)
def error(self, message):
self.__console('error', message)
def TimeStampToTime(timestamp):
"""格式化时间"""
timeStruct = time.localtime(timestamp)
return str(time.strftime('%Y-%m-%d', timeStruct))
def get_file_sorted(path):
"""最后修改时间顺序升序排列 os.path.getmtime()->获取文件最后修改时间"""
dir_list = os.listdir(path)
dir_list.sort()
return dir_list
def print_file(data):
# print(data)
file_list = get_file_sorted(log_path)
if file_list:
file_time = file_list[-1].split('.')[0]
if file_time != TimeStampToTime(time.time()):
file_name = logName
else:
file_path = os.path.join(log_path, file_list[-1])
file_size = os.path.getsize(file_path)
if file_size > 1024 * 1024 * 5:
num = file_path[-1]
if num == 'g':
num = 0
file_name = logName + '.' + str(int(num) + 1)
else:
file_name = file_path
else:
file_name = logName
with open(file_name, 'a', encoding='utf-8') as f:
print('[{}] {}'.format(str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))), data),
file=f)
if __name__ == "__main__":
log = Log()
log.debug("---测试开始----")
log.info("操作步骤")
log.warning("""测试警告""")
log.error("----测试错误----")
print_file("""1111111111111111""")
import json
# from common.connectDB import SqL
# import logging
from common.logger import Log
# sql = SqL()
# log = logging.getLogger('log') # 初始化log
log = Log() # 初始化log
def get_json(path_list, field=''):
"""获取json文件中的值,data.json和res.json可共用"""
# data = {} #我注释了``
flag = False
for path in path_list:
with open(path, 'r', encoding='utf-8') as f:
data = f.read() or '{}'
json_data = json.loads(data)
if field in json_data:
if path_list[-1] == path:
flag = True
return json_data.get(field), flag
else:
return False,False
# 下面几行是liangfenglong注释的
# return data
# else:
# data.update(json_data)
# return data
def write_data(res, json_path):
"""把处理后的参数写入json文件"""
if isinstance(res, dict):
with open(json_path, 'r', encoding='utf-8') as f:
d = json.loads(f.read())
d.update(res)
# json.dump(res, f, indent=4)
log.info('Interface Params Total:{} ,write to json file successfully!\n'.format(len(res)))
with open(json_path, 'w', encoding='utf-8') as f:
f.write(json.dumps(d))
if res:
print('<div style="color:green"><strong>开始提取参数</strong>' + '</div>')
for k,v in res.items():
print(f'提取 {k}={v} 成功!~')
else:
log.info('{} Params is not dict.\n'.format(write_data.__name__))
# from common.base_api import res_alias_json
# with open(res_alias_json, 'x') as f:
# f.write(json.dumps(res))
if __name__ == '__main__':
pass
# coding:utf-8 import os import configparser # 配置文件路径 # configPath = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\common' + '\\config' + '\\cfg.ini' configPath = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '/common' + '/config' + '/cfg.ini' conf = configparser.ConfigParser() conf.read(configPath, encoding='utf-8') title = conf.get("email", "title") port = conf.get("email", "port") smtp_service = conf.get("email", "smtp_service") smtp_server = conf.get("email", "smtp_server") user = conf.get("email", "sender_qq") pwd = conf.get("email", "pwd") sender_163 = conf.get("email", "sender_163") pwd_163 = conf.get("email", "pwd_163") to = conf.get("email", "receiver") email_text = conf.get("email", "email_text") email_task = conf.get("email", "email_task") MySQL_host = conf.get('MySQL', 'MySQL_host') MySQL_user = conf.get('MySQL', 'MySQL_user') MySQL_pwd = conf.get('MySQL', 'MySQL_pwd') MySQL_database = conf.get('MySQL', 'MySQL_database') MySQL_port = conf.get('MySQL', 'MySQL_port')
\ No newline at end of file
...@@ -340,3 +340,16 @@ EOFError: EOF when reading a line, websocket has been closed ...@@ -340,3 +340,16 @@ EOFError: EOF when reading a line, websocket has been closed
[2021-04-09 17:42:04,210] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface/ HTTP/1.1" 200 14737 [2021-04-09 17:42:04,210] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface/ HTTP/1.1" 200 14737
[2021-04-09 17:42:04,447] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface/?search=&order=asc&offset=0&limit=10&_=1617961324040 HTTP/1.1" 200 2953 [2021-04-09 17:42:04,447] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface/?search=&order=asc&offset=0&limit=10&_=1617961324040 HTTP/1.1" 200 2953
[2021-04-09 17:42:11,787] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface_update/?if_id=1 HTTP/1.1" 200 21904 [2021-04-09 17:42:11,787] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface_update/?if_id=1 HTTP/1.1" 200 21904
[2021-04-09 18:20:01,793] [autoreload.py:586] [autoreload:run_with_reloader] [INFO]- Watching for file changes with StatReloader
[2021-04-09 18:20:46,972] [autoreload.py:586] [autoreload:run_with_reloader] [INFO]- Watching for file changes with StatReloader
[2021-04-09 18:20:52,287] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface_update/?if_id=1 HTTP/1.1" 200 21904
[2021-04-09 18:20:52,525] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /static/img/favicon.png HTTP/1.1" 200 3658
[2021-04-09 18:20:55,365] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/project/ HTTP/1.1" 200 12680
[2021-04-09 18:20:56,066] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/env/ HTTP/1.1" 200 11895
[2021-04-09 18:20:58,389] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/plan/ HTTP/1.1" 200 14230
[2021-04-09 18:20:58,877] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/case/ HTTP/1.1" 200 18657
[2021-04-09 18:20:59,091] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/case/?search=&order=asc&offset=0&limit=10&_=1617963658754 HTTP/1.1" 200 2468
[2021-04-09 18:21:31,649] [autoreload.py:586] [autoreload:run_with_reloader] [INFO]- Watching for file changes with StatReloader
[2021-04-09 18:21:40,577] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/plan/ HTTP/1.1" 200 14230
[2021-04-09 18:21:41,512] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/case/ HTTP/1.1" 200 18657
[2021-04-09 18:21:41,740] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/case/?search=&order=asc&offset=0&limit=10&_=1617963701384 HTTP/1.1" 200 2468
...@@ -11830,3 +11830,9 @@ EOFError: EOF when reading a line, websocket has been closed ...@@ -11830,3 +11830,9 @@ EOFError: EOF when reading a line, websocket has been closed
[2021-04-09 17:42:04,210] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface/ HTTP/1.1" 200 14737 [2021-04-09 17:42:04,210] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface/ HTTP/1.1" 200 14737
[2021-04-09 17:42:04,447] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface/?search=&order=asc&offset=0&limit=10&_=1617961324040 HTTP/1.1" 200 2953 [2021-04-09 17:42:04,447] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface/?search=&order=asc&offset=0&limit=10&_=1617961324040 HTTP/1.1" 200 2953
[2021-04-09 17:42:11,787] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface_update/?if_id=1 HTTP/1.1" 200 21904 [2021-04-09 17:42:11,787] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/interface_update/?if_id=1 HTTP/1.1" 200 21904
[2021-04-09 18:21:31,649] [autoreload.py:586] [autoreload:run_with_reloader] [INFO]- Watching for file changes with StatReloader
/home/test-user/EasyTestNew/EasyTest/lib/public.py:22: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'base.models.Plan'> QuerySet.
paginator = Paginator(data, 10)
[2021-04-09 18:21:40,577] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/plan/ HTTP/1.1" 200 14230
[2021-04-09 18:21:41,512] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/case/ HTTP/1.1" 200 18657
[2021-04-09 18:21:41,740] [basehttp.py:154] [basehttp:log_message] [INFO]- "GET /base/case/?search=&order=asc&offset=0&limit=10&_=1617963701384 HTTP/1.1" 200 2468
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment