Commit 40c7b899 authored by 王英豪's avatar 王英豪

项目

parent 8c125831
Pipeline #1787 canceled with stages
.idea/
.idea/*
.idea
*.pyc
log/*
*.log
*.pyc
__pycache__
__pycache__/
**/__pycache__/*
**/*.pyc
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
"""
ASGI config for AutomatedTestPlatform project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from AutomatedTestPlatform.urls import websocket_urlpatterns
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AutomatedTestPlatform.settings')
# application = get_asgi_application()
application = ProtocolTypeRouter({
# Explicitly set 'http' key using Django's ASGI application.
"http": get_asgi_application(),
'websocket': AuthMiddlewareStack(
URLRouter(
websocket_urlpatterns
)
),
})
This diff is collapsed.
"""AutomatedTestPlatform URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URConf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from django.conf.urls import url, include
from django.conf import settings
from django.views.static import serve
from automated_main.view.web_socket.socket import ChatConsumer
urlpatterns = [
# path('admin/', admin.site.urls),
# 用户接口
path('', include("automated_main.url.user_url.user_url")),
# 系统首页
path('', include("automated_main.url.system_home_page_url.system_home_page_url")),
# UI项目接口
path('', include("automated_main.url.ui_automation_url.ui_project_url")),
# UI页面接口
path('', include("automated_main.url.ui_automation_url.ui_page_url")),
# UI页面元素
path('', include("automated_main.url.ui_automation_url.ui_page_element_url")),
# UI定位操作
path('', include("automated_main.url.ui_automation_url.ui_positioning_url")),
# UI元素操作
path('', include("automated_main.url.ui_automation_url.ui_element_operation_url")),
# UI测试用例
path('', include("automated_main.url.ui_automation_url.ui_test_case_url")),
# UI任务管理
path('', include("automated_main.url.ui_automation_url.ui_test_task_url")),
# API项目
# path('', include("automated_main.url.api_automation_url.api_project_url")),
# API模块
# path('', include("automated_main.url.api_automation_url.api_module_url")),
# 获取api环境列表
path('', include("automated_main.url.api_automation_url.api_environment_url")),
# # API测试用例
# path('', include("automated_main.url.api_automation_url.api_test_case_url")),
# API业务测试
# path('', include("automated_main.url.api_automation_url.api_business_test_url")),
# API数据库
path('', include("automated_main.url.api_automation_url.api_database_url")),
# # API任务管理
# path('', include("automated_main.url.api_automation_url.api_test_task_url")),
# API接口管理
path('', include("automated_main.url.api_automation_url.api_management_url")),
# API场景用例
path('', include("automated_main.url.api_automation_url.api_scenarios_case_url")),
# API测试计划
path('', include("automated_main.url.api_automation_url.api_plan_url")),
# 性能测试-性能项目
path('', include("automated_main.url.performance_test_url.performance_project_url")),
# 性能测试-测试脚本
path('', include("automated_main.url.performance_test_url.performance_script_url")),
# 上传文件地址 media配置——配合settings中的MEDIA_ROOT的配置,就可以在浏览器的地址栏访问media文件夹及里面的文件了
url(r'api/jmeter_script/(?P<path>.*)', serve, {'document_root': settings.JMETER_ROOT}),
# 上传文件地址 media配置——配合settings中的MEDIA_ROOT的配置,就可以在浏览器的地址栏访问media文件夹及里面的文件了
url(r'api/jmeter_script_data_set/(?P<path>.*)', serve, {'document_root': settings.JMETER_DATA_SET_ROOT}),
# 性能测试报告地址
url(r'api/jmeter_report/Report/(?P<path>.*)', serve, {'document_root': settings.JMETER_REPORT}),
# API回放
path('', include("automated_main.url.api_querrydiff.api_querrydiff_url")),
]
websocket_urlpatterns = [
# 前端请求websocket连接
path('wx/', ChatConsumer.as_asgi()),
]
"""
WSGI config for AutomatedTestPlatform project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AutomatedTestPlatform.settings')
application = get_wsgi_application()
# TestPlatformDjango
先添加系统的环境变量 ENV=1 用来区别本地环境以及线上环境
测试环境:ENV=1
生产环境:ENV=SERVER
# 根据数据库迁移文件生成对应SQL语句并执行
python manage.py migrate
# 初次执行时为了先把默认Django需要的数据库创建出来,创建数据库迁移文件
python manage.py makemigrations
# 启动Django
python manage.py runserver 0.0.0.0:8081
#项目介绍
![img13.png](img/img13.png)
#首页
![img.png](img/img11.png)
#Web自动化
页面元素管理
![img_2.png](img/img_2.png)
测试报告
![img_1.png](img/img_1.png)
测试报告详情
![img_3.png](img/img_3.png)
UI定位
![img_4.png](img/img_4.png)
UI元素操作
![img_5.png](img/img_5.png)
#接口自动化
API测试用例
![img.png](img/img6.png)
API测试用例-发送请求
![img_6.png](img/img_6.png)
API业务测试用例
![img_7.png](img/img_7.png)
API测试报告
![img_8.png](img/img_8.png)
API测试报告详情
![img_9.png](img/img_9.png)
#性能测试
性能测试脚本页面
![img_10.png](img/img_10.png)
性能测试脚本
![img_11.png](img/img_11.png)
import os
ENV_PROFILE = os.getenv("ENV")
if ENV_PROFILE == "1":
pass
else:
# default_app_config = 'automated_main.apps.InterfaceMainConfig'
pass
# from django.contrib import admin
# Register your models here.
from django.apps import AppConfig
# from automated_main.utils.publish_consumer import MQListenerThread
"""
自定义配置类, 通过重写ready方法, 实现服务启动, 进行mq消息监听
"""
class InterfaceMainConfig(AppConfig):
name = 'automated_main'
def ready(self):
"""
Override this method in subclasses to run code when Django starts.
避免执行两次, 启动命令使用: python manage.py runserver --noreload
"""
# rocket_consumer = MQListenerThread(self.models)
# rocket_consumer.setDaemon(True)
# rocket_consumer.start()
pass
# -*- coding: utf-8 -*-
# @Time : 2020/11/10 22:15
# @Author : wangyinghao
# @FileName: __init__.py.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
# @Time : 2020/11/10 22:15
# @Author : wangyinghao
# @FileName: my_exception.py
# @Software: PyCharm
class ErrorCode:
SYSTEM = 10000
DB = 20000
COMMON = 30000
UNKNOWN = 40000
class MyException(Exception):
def __init__(self, code=ErrorCode.COMMON, message='参数错误'):
self.message = message
self.code = code
def __str__(self):
return self.message
# -*- coding: utf-8 -*-
# @Time : 2020/11/12 11:27
# @Author : wangyinghao
# @FileName: __init__.py.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
# @Time : 2021/4/15 18:14
# @Author : wangyinghao
# @FileName: api_business_test.py
# @Software: PyCharm
from django import forms
class ApiBusinessTestForm(forms.Form):
api_business_test_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "Api业务测试名称不能为空"})
api_project_id = forms.CharField(required=False)
api_business_test_describe = forms.CharField(max_length=2000,
min_length=0,
required=False,
error_messages={'required': "描述超过2000字符"})
# -*- coding: utf-8 -*-
# @Time : 2021/10/21 17:15
# @Author : wangyinghao
# @Site :
# @File : api_database.py
# @Software: PyCharm
from django import forms
class ApiDatabaseForm(forms.Form):
api_database_title = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "数据库名称不能为空"})
api_host = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "host超过2000字符"})
api_port = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "端口号超过2000字符"})
user = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "用户名称超过2000字符"})
password = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "密码超过2000字符"})
database = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "数据库表名超过2000字符"})
# -*- coding: utf-8 -*-
# @Time : 2021/3/25 16:57
# @Author : wangyinghao
# @FileName: api_environment.py
# @Software: PyCharm
from django import forms
class ApiEnvironmentForm(forms.Form):
api_environment_name = forms.CharField(max_length=200,
min_length=2,
required=True,
error_messages={'required': "API环境名称不能为空"})
api_title = forms.CharField(max_length=200,
min_length=2,
required=True,
error_messages={'required': "API环境标题不能为空"})
api_environment_describe = forms.CharField(max_length=200,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
# -*- coding: utf-8 -*-
# @Time : 2022/7/15 17:09
# @Author : wangyinghao
# @Site :
# @File : api_interfaces_case.py
# @Software: PyCharm
from django import forms
class ApiInterfacesCaseForm(forms.Form):
api_interfaces_case_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "API测试用例名称不能为空",
'max_length': "API测试用例名称不能超过50个字符",
'min_length': "API测试用例名称不能少于2个字符",
}
)
api_documentation = forms.CharField(required=False)
api_management_id = forms.CharField(required=False)
api_environment_id = forms.CharField(required=False)
api_method = forms.CharField(required=False)
api_url = forms.CharField(required=False)
api_parameter_types = forms.CharField(required=False)
api_headers = forms.CharField(required=False)
api_parameter_body = forms.CharField(required=False)
api_assert_type = forms.CharField(required=False)
api_assert_text = forms.CharField(required=False)
dataBase_id = forms.CharField(required=False)
database_sql = forms.CharField(required=False)
# -*- coding: utf-8 -*-
# @Time : 2022/5/24 21:23
# @Author : wangyinghao
# @Site :
# @File : api_management.py
# @Software: PyCharm
from django import forms
class ApiManagementForm(forms.Form):
name = forms.CharField(max_length=200, min_length=1, required=True)
description = forms.CharField(min_length=1, required=False)
parent = forms.IntegerField(required=True)
# -*- coding: utf-8 -*-
# @Time : 2021/3/3 11:03
# @Author : wangyinghao
# @FileName: api_module.py
# @Software: PyCharm
from django import forms
class ApiModuleForm(forms.Form):
api_module_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "API模块名称不能为空"})
api_module_describe = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
api_project_id = forms.CharField(required=False)
# -*- coding: utf-8 -*-
# @Time : 2021/3/2 18:46
# @Author : wangyinghao
# @FileName: api_project.py
# @Software: PyCharm
from django import forms
class ApiProjectForm(forms.Form):
api_project_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "API项目名称不能为空"})
describe = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
# -*- coding: utf-8 -*-
# @Time : 2022/7/20 10:34
# @Author : wangyinghao
# @File : api_scenarios_case.py
# @Software: PyCharm
from django import forms
class ApiScenariosCaseForm(forms.Form):
api_scenarios_case_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "Api场景测试名称不能为空"})
api_management_id = forms.CharField(required=False)
api_scenarios_case_describe = forms.CharField(max_length=2000,
min_length=0,
required=False,
error_messages={'required': "Api场景描述超过2000字符"})
# -*- coding: utf-8 -*-
# @Time : 2021/4/1 11:24
# @Author : wangyinghao
# @FileName: api_test_case.py
# @Software: PyCharm
from django import forms
class ApiTestCaseForm(forms.Form):
api_test_case_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "API测试用例名称不能为空",
'max_length': "API测试用例名称不能超过50个字符",
'min_length': "API测试用例名称不能少于2个字符",
}
)
api_documentation = forms.CharField(required=False)
api_module_id = forms.CharField(required=False)
api_environment_id = forms.CharField(required=False)
api_method = forms.CharField(required=False)
api_url = forms.CharField(required=False)
api_parameter_types = forms.CharField(required=False)
api_headers = forms.CharField(required=False)
api_parameter_body = forms.CharField(required=False)
api_assert_type = forms.CharField(required=False)
api_assert_text = forms.CharField(required=False)
dataBase_id = forms.CharField(required=False)
database_sql = forms.CharField(required=False)
# -*- coding: utf-8 -*-
# @Time : 2022/7/21 15:28
# @Author : wangyinghao
# @File : api_test_plan.py
# @Software: PyCharm
from django import forms
class ApiTestPlanForm(forms.Form):
api_test_plan_name = forms.CharField(max_length=100,
min_length=2,
required=True,
error_messages={'required': "API测试计划名称不能为空"})
api_test_plan_describe = forms.CharField(required=False)
cases = forms.CharField(required=False)
api_management_id = forms.CharField(required=False)
api_send_email = forms.CharField(required=False)
api_send_enterprise_wechat = forms.CharField(required=False)
api_environment_id = forms.CharField(required=False)
database_id = forms.CharField(required=False)
timing_task_status = forms.CharField(required=False)
end_time = forms.CharField(required=False)
starting_time = forms.CharField(required=False)
time_interval_day = forms.CharField(required=False)
time_interval_minutes = forms.CharField(required=False)
time_interval_hours = forms.CharField(required=False)
time_interval_seconds = forms.CharField(required=False)
# -*- coding: utf-8 -*-
# @Time : 2021/4/20 18:30
# @Author : wangyinghao
# @FileName: api_test_task.py
# @Software: PyCharm
from django import forms
class ApiTestTaskForm(forms.Form):
api_test_task_name = forms.CharField(max_length=100,
min_length=2,
required=True,
error_messages={'required': "API测试任务名称不能为空"})
describe = forms.CharField(required=False)
cases = forms.CharField(required=False)
api_project_id = forms.CharField(required=False)
api_send_email = forms.CharField(required=False)
api_send_enterprise_wechat = forms.CharField(required=False)
api_environment_id = forms.CharField(required=False)
database_id = forms.CharField(required=False)
timing_task_status = forms.CharField(required=False)
end_time = forms.CharField(required=False)
starting_time = forms.CharField(required=False)
time_interval_day = forms.CharField(required=False)
time_interval_minutes = forms.CharField(required=False)
time_interval_hours = forms.CharField(required=False)
time_interval_seconds = forms.CharField(required=False)
# -*- coding: utf-8 -*-
"""
@Time : 2021/5/27 14:49
@Auth : WangYingHao
@File :performance_project.py
@IDE :PyCharm
"""
from django import forms
class PerformanceProjectForm(forms.Form):
performance_project_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "性能测试项目名称不能为空"})
describe = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
# -*- coding: utf-8 -*-
"""
@Time : 2021/5/27 18:02
@Auth : WangYingHao
@File :performance_script.py
@IDE :PyCharm
"""
from django import forms
class PerformanceScriptForm(forms.Form):
performance_script_name = forms.CharField(max_length=50,
min_length=1,
required=True,
error_messages={'required': "性能脚本名称不能为空"})
performance_script = forms.CharField(max_length=5000,
min_length=1,
required=True,
error_messages={'required': "性能脚本不能为空"})
performance_project_id = forms.CharField(required=False)
performance_threads = forms.CharField(max_length=5000,
min_length=1,
required=True,
error_messages={'required': "线程数不能为空"})
performance_ramp_up_time_seconds = forms.CharField(required=True,
error_messages={'required': "Ramp-Up时间(秒)不能为空"})
performance_loop_count = forms.CharField(max_length=5000,
min_length=1,
required=False,
error_messages={'required': "循环次数不能为空"})
performance_scheduler = forms.CharField(max_length=5000,
min_length=1,
required=True,
error_messages={'required': "调度器不能为空"})
performance_duration = forms.CharField(max_length=5000,
min_length=1,
required=False,
error_messages={'required': "持续时间不能为空"})
loop_count_forever = forms.CharField(max_length=5000,
min_length=1,
required=False,
error_messages={'required': "超过5000字符"})
data_set = forms.CharField(max_length=5000,
min_length=1,
required=False,
error_messages={'required': "超过5000字符"})
performance_data_script = forms.CharField(max_length=5000,
min_length=1,
required=False,
error_messages={'required': "超过5000字符"})
# -*- coding: utf-8 -*-
# @Time : 2020/12/19 11:33
# @Author : wangyinghao
# @FileName: ui_element_operation.py
# @Software: PyCharm
from django import forms
class UIElementsOperationForm(forms.Form):
elements_operation_name = forms.CharField(max_length=500,
min_length=2,
required=True,
error_messages={'required': "元素操作名称不能为空"})
elements_operation_title = forms.CharField(max_length=500,
min_length=2,
required=False,
error_messages={'required': "元素操作标题不能为空"})
elements_operation_describe = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
elements_operation_associated_interface = forms.CharField(max_length=200,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
elements_operation_api_url = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
# -*- coding: utf-8 -*-
# @Time : 2020/12/18 18:33
# @Author : wangyinghao
# @FileName: ui_positioning.py
# @Software: PyCharm
from django import forms
class UiPositioningForm(forms.Form):
positioning_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "定位名称不能为空"})
locating_method = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "定位方法不能为空"})
describe = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
# -*- coding: utf-8 -*-
# @Time : 2020/12/15 18:39
# @Author : wangyinghao
# @FileName: ui_page.py
# @Software: PyCharm
from django import forms
class UiPageForm(forms.Form):
ui_page_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "UI页面名称不能为空"})
ui_page_describe = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
ui_project_id = forms.CharField(required=False)
# -*- coding: utf-8 -*-
# @Time : 2020/12/19 16:10
# @Author : wangyinghao
# @FileName: ui_page_element.py
# @Software: PyCharm
from django import forms
class UiPageElementForm(forms.Form):
# ui_page_element_name = forms.CharField(max_length=50,
# min_length=2,
# required=True,
# error_messages={'required': "UI页面元素名称不能为空"})
ui_page_element = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "页面元素超过2000字符"})
ui_project_id = forms.CharField(required=False)
# ui_page_id = forms.CharField(required=False)
ui_element_positioning_id = forms.CharField(required=False)
# -*- coding: utf-8 -*-
# @Time : 2020/12/9 14:42
# @Author : wangyinghao
# @FileName: ui_project.py
# @Software: PyCharm
from django import forms
class UiProjectForm(forms.Form):
ui_project_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "项目名称不能为空"})
describe = forms.CharField(max_length=2000,
min_length=2,
required=False,
error_messages={'required': "描述超过2000字符"})
# -*- coding: utf-8 -*-
# @Time : 2020/12/24 19:04
# @Author : wangyinghao
# @FileName: ui_test_case.py
# @Software: PyCharm
from django import forms
class UiTestCaseForm(forms.Form):
ui_test_case_name = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "测试用例名称不能为空"})
ui_project_id = forms.CharField(required=False)
# -*- coding: utf-8 -*-
# @Time : 2021/1/7 10:31
# @Author : wangyinghao
# @FileName: ui_test_task.py
# @Software: PyCharm
from django import forms
class UiTestTaskForm(forms.Form):
ui_test_task_name = forms.CharField(max_length=100,
min_length=2,
required=True,
error_messages={'required': "UI测试任务名称不能为空"})
describe = forms.CharField(required=False)
cases = forms.CharField(required=False)
ui_project_id = forms.CharField(required=False)
# -*- coding: utf-8 -*-
# @Time : 2020/11/12 11:27
# @Author : wangyinghao
# @FileName: user.py
# @Software: PyCharm
from django import forms
class UserForm(forms.Form):
username = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "用户名不能为空"})
password = forms.CharField(max_length=50,
min_length=2,
required=True,
error_messages={'required': "密码不能为空"})
# creater for yanfuchang
\ No newline at end of file
# creater for yanfuchang
\ No newline at end of file
import time, json
from django.core.management import BaseCommand
from rocketmq.client import PushConsumer, ConsumeStatus
from concurrent.futures import ThreadPoolExecutor
from automated_main.models.api_automation.api_test_task import APITestTask
from automated_main.view.api_automation.api_test_task.extend.new_task_thread import TaskThread
pool = ThreadPoolExecutor(5, 'publish')
"""
以扩展命令的方式执行方法, 进行监听消息
python manage.py init_data
"""
class Command(BaseCommand):
"""
The actual logic of the command. Subclasses must implement
this method.
"""
def handle(self, *args, **options):
print(" ---- 启动发布消息监听 ---- ")
consumer = PushConsumer(group_id='GID_test_automated_group', message_model=1)
consumer.set_name_server_address('rocketmq-dev.rd.com:9876')
consumer.subscribe('test_publish_topic', callback)
consumer.start()
while True:
time.sleep(60 * 60 * 24) # 一睡就是一天
"""
监听到消息之后, 执行的回调方法
"""
def callback(msg):
try:
msg_body_str = str(msg.body, "utf-8")
body = json.loads(msg_body_str)
if not isinstance(body, dict):
print(" 非发布消息格式, 暂不处理! ")
else:
# 将消息丢到异步线程处理
task = pool.submit(do_consumer, body)
# 如果需要拿到消息结果, 则使用task.result()拿结果
# all_task.append(task)
except Exception:
return ConsumeStatus.CONSUME_SUCCESS
return ConsumeStatus.CONSUME_SUCCESS
def do_consumer(param):
# 消息内容{"projectName":"sms-base-service","moduleName":"sms-base-starter","env":"prod","branch":"master-27839-1654070365-tag","channel":"QIKE","mode":2,"defaultBranch":"prod","emailToUserList":"yanfuchang@qike366.com,chentaolian@qike366.com","publishId":4812,"publishUserName":"liubo"}
# 提取消息中的项目名称
project_name = param.get('projectName', None)
if project_name is None or project_name == '':
print(" --- 消息内容不完整, 不处理 --- ")
return
print(project_name)
task = APITestTask.objects.filter(api_test_task_name=project_name).first()
print("查询到的任务: ", json.dumps(task))
if task.status == 1:
print("当前该任务正在执行!")
return
else:
task.status = 1
task.save()
# 通过多线程运行测试任务
TaskThread(task.id).run()
print("任务开始执行!")
return
# -*- coding: utf-8 -*-
# @Time : 2020/11/10 18:30
# @Author : wangyinghao
# @FileName: __init__.py.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
# @Time : 2020/11/10 18:30
# @Author : wangyinghao
# @FileName: my_middle_ware.py
# @Software: PyCharm
import traceback
from django.db import DatabaseError
from django.utils.deprecation import MiddlewareMixin
from automated_main.utils.http_format import response_failed
from automated_main.exception.my_exception import MyException, ErrorCode
# ALLOW_PATHS = ["/api/backend/users/info/", "/api/backend/users/", "/api/backend/ui_project/list/",
# "/api/backend/ui_project/", "api/backend/ui_project/<int:ui_project_id>/"]
ALLOW_PATHS = []
class MyMiddleWare(MiddlewareMixin):
def process_request(self, request): # 会捕捉所有得请求
# print('请求进来了')
current_path = request.path
if current_path not in ALLOW_PATHS:
pass
else:
user = request.user
if user.is_authenticated:
pass
else:
raise response_failed(ErrorCode.UNKNOWN, '未知错误')
pass
def process_response(self, request, response): # 会捕捉所有得响应
response["Access-Control-Allow-Origin"] = "*"
if request.method == "OPTIONS":
response["Access-Control-Allow-Headers"] = "Content-Type"
response["Access-Control-Allow-Methods"] = "DELETE, PUT, POST"
return response
def process_exception(self, request, exception): # 会捕捉到所有异常
print('捕捉异常')
print(traceback.print_exc())
if isinstance(exception, MyException):
print("这是我的错误")
code = exception.code
message = exception.message
return response_failed(code, message)
elif isinstance(exception, DatabaseError):
print('数据库错误')
return response_failed(ErrorCode.DB, '数据库错误')
else:
print('未知错误')
return response_failed(ErrorCode.UNKNOWN, '未知错误')
This diff is collapsed.
# Generated by Django 3.1.3 on 2022-08-22 10:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('automated_main', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='apitestplanresultassociated',
name='abnormal',
field=models.TextField(blank=True, max_length=50000, null=True, verbose_name='异常'),
),
migrations.AlterField(
model_name='apitestplanresultassociated',
name='api_body',
field=models.TextField(blank=True, max_length=500000, null=True, verbose_name='body'),
),
migrations.AlterField(
model_name='apitestplanresultassociated',
name='api_business_test_name',
field=models.TextField(blank=True, max_length=50000, null=True, verbose_name='API业务测试名称'),
),
migrations.AlterField(
model_name='apitestplanresultassociated',
name='api_header',
field=models.TextField(blank=True, max_length=50000, null=True, verbose_name='header'),
),
migrations.AlterField(
model_name='apitestplanresultassociated',
name='api_test_case_name',
field=models.CharField(default='', max_length=1000, verbose_name='api测试用例名称'),
),
migrations.AlterField(
model_name='apitestplanresultassociated',
name='api_url',
field=models.TextField(blank=True, max_length=50000, null=True, verbose_name='请求地址'),
),
migrations.AlterField(
model_name='apitestplanresultassociated',
name='api_variable_results',
field=models.TextField(blank=True, max_length=50000, null=True, verbose_name='参数提取'),
),
]
# Generated by Django 3.1.3 on 2022-08-23 19:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('automated_main', '0002_auto_20220822_1047'),
]
operations = [
migrations.AddField(
model_name='apimanagement',
name='yapi_id',
field=models.CharField(blank=True, max_length=2000, null=True, verbose_name='YAPIID'),
),
]
# -*- coding: utf-8 -*-
# @Time : 2020/12/9 14:05
# @Author : wangyinghao
# @FileName: __init__.py.py
# @Software: PyCharm
from automated_main.models.ui_automation.ui_project import UIProject
from automated_main.models.ui_automation.ui_page import UIPage
from automated_main.models.ui_automation.ui_element_positioning import UIPositioning
from automated_main.models.ui_automation.ui_element_operation import UIElementsOperation
from automated_main.models.ui_automation.ui_page_element import UIPageElement
from automated_main.models.ui_automation.ui_test_case import UITestCase, UITestCaseAssociated
from automated_main.models.ui_automation.ui_test_task import UITestTask, UITestResult
"""
8.19 弃用
"""
# from automated_main.models.api_automation.api_project import APIProject
# from automated_main.models.api_automation.api_module import APIModule
from automated_main.models.api_automation.api_environment import APIEnvironment
"""
8.19 弃用
"""
# from automated_main.models.api_automation.api_test_case import ApiTestCase
# from automated_main.models.api_automation.api_business_test import ApiBusinessTest, ApiBusinessTestAssociated
# from automated_main.models.api_automation.api_test_task import APITestTask, APITestResultAssociated, APITestResult
from automated_main.models.performance_test.performance_project import PerformanceProject
from automated_main.models.performance_test.performance_script import PerformanceScript
from automated_main.models.performance_test.performance_report import PerformanceReport
from automated_main.models.api_automation.api_database import APIDatabase
from automated_main.models.api_automation.api_management import ApiManagement
from automated_main.models.api_automation.api_interfaces_case import ApiInterfacesCase
from automated_main.models.api_automation.api_scenarios_case import ApiScenariosCaseAssociated, ApiScenariosCaseAssociated
from automated_main.models.api_automation.api_test_plan import ApiTestPlan
# -*- coding: utf-8 -*-
# @Time : 2021/3/2 18:44
# @Author : wangyinghao
# @FileName: __init__.py.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
# @Time : 2021/4/14 17:20
# @Author : wangyinghao
# @FileName: api_business_test.py
# @Software: PyCharm
"""
8.19 弃用
"""
# from django.db import models
# from automated_main.models.api_automation.api_project import APIProject
# from automated_main.models.api_automation.api_module import APIModule
# from automated_main.models.api_automation.api_test_case import ApiTestCase
#
#
# class ApiBusinessTest(models.Model):
# """
# api业务测试表
# """
#
# api_business_test_name = models.CharField("API业务测试名称", max_length=100, null=False)
# api_business_test_describe = models.TextField("API业务测试描述", max_length=5000, null=True)
# api_project = models.ForeignKey(APIProject, on_delete=models.CASCADE)
# updata_time = models.DateTimeField(auto_now_add=True)
# create_time = models.DateTimeField("创建时间", auto_now_add=True)
#
# def __str__(self):
# return self.api_business_test_name
#
#
# class ApiBusinessTestAssociated(models.Model):
# """
# API业务测试关联表
# """
# bid = models.ForeignKey(ApiBusinessTest, on_delete=models.CASCADE)
# api_module = models.ForeignKey(APIModule, on_delete=models.CASCADE)
# api_test_case = models.ForeignKey(ApiTestCase, on_delete=models.CASCADE)
# case_steps = models.CharField("操作步骤", max_length=100, null=False)
# updata_time = models.DateTimeField(auto_now_add=True)
# create_time = models.DateTimeField("创建时间", auto_now_add=True)
#
# def __str__(self):
# return str(self.bid)
from django.db import models
class APIDatabase(models.Model):
"""
API数据库
"""
api_database_title = models.CharField("API数据库名称", max_length=200, null=False)
api_host = models.CharField("API_Host", max_length=200, null=False)
api_port = models.CharField("端口号", max_length=200, null=False)
user = models.CharField("用户名", max_length=200, null=False)
password = models.CharField("密码", max_length=200, null=False)
database = models.CharField("数据库表名", max_length=200, null=False)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
updata_time = models.DateTimeField("更新时间", auto_now_add=True)
def __str__(self):
return self.api_database_title
# -*- coding: utf-8 -*-
# @Time : 2021/3/25 15:00
# @Author : wangyinghao
# @FileName: api_environment.py
# @Software: PyCharm
from django.db import models
class APIEnvironment(models.Model):
"""
API环境设置
"""
api_environment_name = models.CharField("API环境名称", max_length=200, null=False)
api_title = models.CharField("API环境标题名称", max_length=200, null=False)
api_environment_describe = models.TextField("API环境描述", default="", null=True)
status = models.BooleanField("状态", default=1)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
update_time = models.DateTimeField("更新时间", auto_now_add=True)
def __str__(self):
return self.api_environment_name
class APIGlobalVariable(models.Model):
"""
Api环境全局变量
"""
api_environment = models.ForeignKey(APIEnvironment, on_delete=models.CASCADE)
api_global_variable_name = models.TextField("全局变量名称", max_length=5000, null=True)
api_global_variable_value = models.TextField("全局变量值", max_length=5000, null=True)
api_global_variable_describe = models.TextField("全局变量描述", max_length=5000, null=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
update_time = models.DateTimeField("更新时间", auto_now_add=True)
def __str__(self):
return self.api_global_variable_name
# -*- coding: utf-8 -*-
# @Time : 2022/7/5 11:22
# @Author : wangyinghao
# @Site :
# @File : api_interfaces_case.py
# @Software: PyCharm
from django.db import models
from automated_main.models.api_automation.api_environment import APIEnvironment
from automated_main.models.api_automation.api_database import APIDatabase
from automated_main.models.api_automation.api_management import ApiManagement
class ApiInterfacesCase(models.Model):
"""
接口测试用例
"""
api_interfaces_case_name = models.CharField("接口测试用例名称", max_length=200, null=False)
api_documentation = models.TextField("API接口文档地址", max_length=5000, null=True)
api_management = models.ForeignKey(ApiManagement, on_delete=models.CASCADE)
api_environment = models.ForeignKey(APIEnvironment, on_delete=models.CASCADE)
api_method = models.IntegerField("请求方法", null=False) # 1:get 2.post 3:put 4:delete
api_url = models.TextField("API请求地址", null=False)
# 1:form-data 2: json 3:x-www-form-urlencoded
api_parameter_types = models.IntegerField("参数类型", null=False)
api_headers = models.TextField("请求头", null=False)
api_parameter_body = models.TextField("参数内容", null=False)
api_assert_type = models.IntegerField("断言类型", null=False) # 1:包含contains 2: 匹配mathches 3:数据库校验 4:code状态码
dataBase = models.ForeignKey(APIDatabase, on_delete=models.CASCADE, blank=True, null=True)
database_sql = models.TextField("数据库SQL", max_length=8000, null=True, blank=True)
api_assert_text = models.TextField("断言结果", null=False)
update_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.api_interfaces_case_name
class ApiInterfacesParameterExtraction(models.Model):
"""
Api提取变量表
"""
api_test_case = models.ForeignKey(ApiInterfacesCase, on_delete=models.CASCADE)
api_variable_results = models.TextField("变量提取结果", max_length=5000, null=True)
api_value_variable = models.TextField("提取变量", max_length=5000, null=True)
api_key_variable = models.TextField("关键字变量名称", max_length=5000, null=True)
def __str__(self):
return self.api_key_variable
class ApiInterfacesParameterData(models.Model):
"""
Parameter参数
"""
api_test_case = models.ForeignKey(ApiInterfacesCase, on_delete=models.CASCADE)
api_parameter_name = models.CharField("参数名称", max_length=500, null=True)
api_must_parameter = models.TextField("必填", max_length=50, null=True)
api_parameter_value = models.TextField("参数值", max_length=5000, null=True)
api_field_describe = models.TextField("字段描述", max_length=5000, null=True)
def __str__(self):
return self.api_parameter_name
# -*- coding: utf-8 -*-
# @Time : 2022/5/24 21:12
# @Author : wangyinghao
# @Site :
# @File : api_management.py
# @Software: PyCharm
from django.db import models
from django.utils import timezone
IS_ROOT = 0
class ApiManagement(models.Model):
name = models.CharField('name', blank=False, default="", max_length=200)
description = models.TextField('description', blank=True, default='')
parent = models.IntegerField('父节点', blank=False, default=IS_ROOT)
yapi_id = models.CharField("YAPIID", blank=True, max_length=2000, null=True)
create_time = models.DateTimeField(auto_now_add=True, blank=True, null=True)
update_time = models.DateTimeField(auto_now_add=True, blank=True, null=True)
def __str__(self):
return self.name
# -*- coding: utf-8 -*-
# @Time : 2021/3/3 10:57
# @Author : wangyinghao
# @FileName: api_module.py
# @Software: PyCharm
"""
8.19 弃用
"""
# from django.db import models
# from automated_main.models.api_automation.api_project import APIProject
#
#
# class APIModule(models.Model):
# """
# API模块表
# """
# api_project = models.ForeignKey(APIProject, on_delete=models.CASCADE, null=True)
# api_module_name = models.CharField("API模块名称", max_length=50, null=False)
# api_module_describe = models.TextField("API模块描述", default="", null=True)
# create_time = models.DateTimeField("创建时间", auto_now_add=True)
# updata_time = models.DateTimeField("更新时间", auto_now_add=True)
#
# def __str__(self):
# return self.api_module_name
# -*- coding: utf-8 -*-
# @Time : 2021/3/2 18:44
# @Author : wangyinghao
# @FileName: api_project.py
# @Software: PyCharm
# from django.db import models
#
#
"""
8.19 弃用
"""
# # Create your models here.
# class APIProject(models.Model):
# """
# API项目表
# """
# api_project_name = models.CharField("API项目名称", max_length=50, null=False)
# describe = models.TextField("描述", default="", max_length=2000, null=True)
# status = models.BooleanField("状态", default=1)
# updata_time = models.DateTimeField(auto_now_add=True)
# create_time = models.DateTimeField("创建时间", auto_now_add=True)
#
# def __str__(self):
# return self.api_project_name
# -*- coding: utf-8 -*-
# @Time : 2022/7/20 10:07
# @Author : wangyinghao
# @Site :
# @File : api_scenarios_case.py
# @Software: PyCharm
from django.db import models
from automated_main.models.api_automation.api_management import ApiManagement
from automated_main.models.api_automation.api_interfaces_case import ApiInterfacesCase
class ApiScenariosCase(models.Model):
"""
API场景测试表
"""
api_scenarios_case_name = models.CharField("API场景测试名称", max_length=200, null=False)
api_scenarios_case_describe = models.TextField("API业务测试描述", max_length=5000, null=True)
api_management = models.ForeignKey(ApiManagement, on_delete=models.CASCADE)
update_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.api_scenarios_case_name
class ApiScenariosCaseAssociated(models.Model):
"""
API场景测试关联表
"""
sid = models.ForeignKey(ApiScenariosCase, on_delete=models.CASCADE)
interfaces_case = models.ForeignKey(ApiInterfacesCase, on_delete=models.CASCADE)
case_steps = models.CharField("操作步骤", max_length=100, null=False)
update_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return str(self.sid)
# -*- coding: utf-8 -*-
# @Time : 2021/3/29 17:30
# @Author : wangyinghao
# @FileName: api_test_case.py
# @Software: PyCharm
"""
8.19 弃用
"""
# from django.db import models
# from automated_main.models.api_automation.api_module import APIModule
# from automated_main.models.api_automation.api_environment import APIEnvironment
# from automated_main.models.api_automation.api_database import APIDatabase
#
#
# class ApiTestCase(models.Model):
# """
# Api测试用例表
# """
# api_test_case_name = models.TextField("API测试用例名称", max_length=5000, null=False)
# api_documentation = models.TextField("API接口文档地址", max_length=5000, null=True)
# api_module = models.ForeignKey(APIModule, on_delete=models.CASCADE)
# api_environment = models.ForeignKey(APIEnvironment, on_delete=models.CASCADE)
# api_method = models.IntegerField("请求方法", null=False) # 1:get 2.post 3:put 4:delete
# api_url = models.TextField("API请求地址", null=False)
# # 1:form-data 2: json 3:x-www-form-urlencoded
# api_parameter_types = models.IntegerField("参数类型", null=False)
# api_headers = models.TextField("请求头", null=False)
# api_parameter_body = models.TextField("参数内容", null=False)
# api_assert_type = models.IntegerField("断言类型", null=False) # 1:包含contains 2: 匹配mathches 3:数据库校验 4:code状态码
# dataBase = models.ForeignKey(APIDatabase, on_delete=models.CASCADE, blank=True, null=True)
# database_sql = models.TextField("数据库SQL", max_length=8000, null=True, blank=True)
# api_assert_text = models.TextField("断言结果", null=False)
# update_time = models.DateTimeField(auto_now_add=True)
# create_time = models.DateTimeField("创建时间", auto_now_add=True)
#
# def __str__(self):
# return self.api_test_case_name
#
#
# class ApiParameterExtraction(models.Model):
# """
# Api提取变量表
# """
# api_test_case = models.ForeignKey(ApiTestCase, on_delete=models.CASCADE)
# api_variable_results = models.TextField("变量提取结果", max_length=5000, null=True)
# api_value_variable = models.TextField("提取变量", max_length=5000, null=True)
# api_key_variable = models.TextField("关键字变量名称", max_length=5000, null=True)
#
# def __str__(self):
# return self.api_key_variable
#
#
# class ApiParameterData(models.Model):
# """
# Parameter参数
# """
# api_test_case = models.ForeignKey(ApiTestCase, on_delete=models.CASCADE)
# api_parameter_name = models.CharField("参数名称", max_length=500, null=True)
# api_must_parameter = models.TextField("必填", max_length=50, null=True)
# api_parameter_value = models.TextField("参数值", max_length=5000, null=True)
# api_field_describe = models.TextField("字段描述", max_length=5000, null=True)
#
# def __str__(self):
# return self.api_parameter_name
# -*- coding: utf-8 -*-
# @Time : 2022/7/21 14:36
# @Author : wangyinghao
# @Site :
# @File : api_test_plan.py
# @Software: PyCharm
from django.db import models
from automated_main.models.api_automation.api_management import ApiManagement
from automated_main.models.api_automation.api_environment import APIEnvironment
from automated_main.models.api_automation.api_database import APIDatabase
class ApiTestPlan(models.Model):
"""
API计划表
"""
api_test_plan_name = models.CharField("API测试计划名称", max_length=100, blank=False, default="")
api_test_plan_describe = models.TextField("描述", default="", null=True)
status = models.IntegerField("状态:", default=0) # 未执行、执行中、执行完成、排队中
cases = models.TextField("关联API用例", default="")
api_send_email = models.CharField("API邮件发送", max_length=9999, blank=True, default="", null=True)
api_send_enterprise_wechat = models.IntegerField("API企业微信发送消息", blank=True, default="0")
api_environment = models.ForeignKey(APIEnvironment, on_delete=models.CASCADE)
timing_task_status = models.CharField("定时任务是否开启", max_length=50, blank=True, default="", null=True)
starting_time = models.CharField("起始时间", max_length=50, blank=True, default="", null=True)
end_time = models.CharField("截至时间", max_length=50, blank=True, default="", null=True)
time_interval_day = models.IntegerField("间隔时间-天", blank=True, default=0, null=True)
time_interval_minutes = models.IntegerField("间隔时间-分钟", blank=True, default=0, null=True)
time_interval_hours = models.IntegerField("间隔时间-小时", blank=True, default=0, null=True)
time_interval_seconds = models.IntegerField("间隔时间-秒", blank=True, default=0, null=True)
database = models.ForeignKey(APIDatabase, on_delete=models.CASCADE)
api_management = models.ForeignKey(ApiManagement, on_delete=models.CASCADE)
update_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.api_test_plan_name
class APITestPlanResult(models.Model):
"""
API测试计划结果表
"""
api_test_result_name = models.CharField("api测试报告名称", max_length=200, blank=False, default="")
api_test_plan = models.ForeignKey(ApiTestPlan, on_delete=models.CASCADE)
api_error_total_number = models.CharField("失败总数", max_length=100, null=True, blank=True)
api_successful_total_number = models.CharField("成功总数", max_length=100, null=True, blank=True)
api_total_number = models.CharField("API总数", max_length=100, null=True, blank=True)
api_environment_id = models.CharField("API环境", max_length=100, null=True, blank=True)
update_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.api_test_result_name
class APITestPlanResultAssociated(models.Model):
"""
API测试结果关联表
"""
api_test_case_name = models.CharField("api测试用例名称", max_length=1000, blank=False, default="")
api_test_plan = models.ForeignKey(ApiTestPlan, on_delete=models.CASCADE)
api_result = models.ForeignKey(APITestPlanResult, on_delete=models.CASCADE)
api_error = models.CharField("失败", max_length=100, null=True, blank=True)
api_successful = models.CharField("成功", max_length=100, null=True, blank=True)
abnormal = models.TextField("异常", max_length=50000, null=True, blank=True)
json_extract_variable_conversion = models.TextField("json提取变量转换",
max_length=5000, null=True, blank=True)
api_assertion_results = models.TextField("断言结果", max_length=50000, null=True, blank=True)
api_variable_results = models.TextField("参数提取", max_length=50000, null=True, blank=True)
api_request_results = models.TextField("API请求结果", max_length=500000, null=True, default=None)
api_business_test_name = models.TextField("API业务测试名称", max_length=50000, null=True, blank=True)
api_header = models.TextField("header", max_length=50000, null=True, blank=True)
api_url = models.TextField("请求地址", max_length=50000, null=True, blank=True)
api_body = models.TextField("body", max_length=500000, null=True, blank=True)
update_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.api_test_case_name
# -*- coding: utf-8 -*-
# @Time : 2021/4/20 14:37
# @Author : wangyinghao
# @FileName: api_test_task.py
# @Software: PyCharm
# from django.db import models
# from automated_main.models.api_automation.api_project import APIProject
# from automated_main.models.api_automation.api_environment import APIEnvironment
# from automated_main.models.api_automation.api_database import APIDatabase
"""
8.19 弃用
"""
# class APITestTask(models.Model):
# """
# API任务表
# """
# api_test_task_name = models.CharField("API测试任务名称", max_length=100, blank=False, default="")
# describe = models.TextField("描述", default="", null=True)
# status = models.IntegerField("状态:", default=0) # 未执行、执行中、执行完成、排队中
# cases = models.TextField("关联API用例", default="")
# api_send_email = models.CharField("API邮件发送", max_length=9999, blank=True, default="", null=True)
# api_send_enterprise_wechat = models.IntegerField("API企业微信发送消息", blank=True, default="0")
# api_environment = models.ForeignKey(APIEnvironment, on_delete=models.CASCADE)
# timing_task_status = models.CharField("定时任务是否开启", max_length=50, blank=True, default="", null=True)
# starting_time = models.CharField("起始时间", max_length=50, blank=True, default="", null=True)
# end_time = models.CharField("截至时间", max_length=50, blank=True, default="", null=True)
# time_interval_day = models.IntegerField("间隔时间-天", blank=True, default=0, null=True)
# time_interval_minutes = models.IntegerField("间隔时间-分钟", blank=True, default=0, null=True)
# time_interval_hours = models.IntegerField("间隔时间-小时", blank=True, default=0, null=True)
# time_interval_seconds = models.IntegerField("间隔时间-秒", blank=True, default=0, null=True)
# database = models.ForeignKey(APIDatabase, on_delete=models.CASCADE)
# api_project = models.ForeignKey(APIProject, on_delete=models.CASCADE)
# update_time = models.DateTimeField(auto_now_add=True)
# create_time = models.DateTimeField("创建时间", auto_now_add=True)
#
# def __str__(self):
# return self.api_test_task_name
#
#
# class APITestResult(models.Model):
# """
# API测试结果表
# """
# api_test_result_name = models.CharField("api测试报告名称", max_length=200, blank=False, default="")
# api_task = models.ForeignKey(APITestTask, on_delete=models.CASCADE)
# api_error_total_number = models.CharField("失败总数", max_length=100, null=True, blank=True)
# api_successful_total_number = models.CharField("成功总数", max_length=100, null=True, blank=True)
# api_total_number = models.CharField("API总数", max_length=100, null=True, blank=True)
# api_environment_id = models.CharField("API环境", max_length=100, null=True, blank=True)
# update_time = models.DateTimeField(auto_now_add=True)
# create_time = models.DateTimeField("创建时间", auto_now_add=True)
#
# def __str__(self):
# return self.api_test_result_name
#
#
# class APITestResultAssociated(models.Model):
# """
# API测试结果关联表
# """
# api_test_case_name = models.CharField("api测试用例名称", max_length=100, blank=False, default="")
# api_task = models.ForeignKey(APITestTask, on_delete=models.CASCADE)
# api_result = models.ForeignKey(APITestResult, on_delete=models.CASCADE)
# api_error = models.CharField("失败", max_length=100, null=True, blank=True)
# api_successful = models.CharField("成功", max_length=100, null=True, blank=True)
# abnormal = models.TextField("异常", max_length=5000, null=True, blank=True)
# json_extract_variable_conversion = models.TextField("json提取变量转换",
# max_length=5000, null=True, blank=True)
# api_assertion_results = models.TextField("断言结果", max_length=5000, null=True, blank=True)
# api_variable_results = models.TextField("参数提取", max_length=5000, null=True, blank=True)
# api_request_results = models.JSONField("API请求结果", null=True, default=None)
# api_business_test_name = models.TextField("API业务测试名称", max_length=5000, null=True, blank=True)
# api_header = models.TextField("header", max_length=5000, null=True, blank=True)
# api_url = models.TextField("请求地址", max_length=5000, null=True, blank=True)
# api_body = models.TextField("body", max_length=5000, null=True, blank=True)
# update_time = models.DateTimeField(auto_now_add=True)
# create_time = models.DateTimeField("创建时间", auto_now_add=True)
#
# def __str__(self):
# return self.api_test_case_name
# -*- coding: utf-8 -*-
from django.db import models
class QuerryDiffTask(models.Model):
"""
回放任务
"""
task_name = models.CharField("回放任务名称", max_length=100, blank=False, default="")
source_env_id = models.IntegerField("基准环境id", blank=False)
target_env_id = models.IntegerField("测试环境id", blank=False)
log_time = models.TextField("关联API用例", default="")
project_id = models.IntegerField("无效字段去除", blank=False, null=True)
simple_num = models.IntegerField("单接口样本量", blank=False)
urls = models.JSONField("指定url", blank=True, null=True)
opt_num = models.IntegerField("运行次数", default=0, null=True)
status = models.IntegerField("状态", default=0, null=True)
created_name = models.CharField("创建人", max_length=255, blank=True, default="", null=True)
created_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.task_name
# -*- coding: utf-8 -*-
from django.db import models
from automated_main.models.api_querrydiff.api_querrydiff_task import QuerryDiffTask
class QuerryDiffTaskItems(models.Model):
"""
回放任务明细
"""
task_id = models.ForeignKey(QuerryDiffTask, on_delete=models.CASCADE)
api_url = models.CharField("请求地址", max_length=255, blank=False)
param = models.TextField("关联API用例", default=None)
result = models.CharField("运行结果", blank=True, null=True)
req_count = models.BigIntegerField("线上运行次数", default=0, null=True)
status = models.IntegerField("状态", default=0, null=True)
method = models.IntegerField("请求方式", blank=False)
created_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.task_id
# -*- coding: utf-8 -*-
import records
import traceback
class DbRecordOpt:
def __init__(self):
try:
self.con = records.Database('mysql+pymysql://root:admin666@172.30.100.253:3306/test_qa')
except:
print(traceback.print_exc())
raise
def querry_excute(self, order):
return self.con.query(order).as_dict()
def write_excute(self, order):
return self.con.query(order)
def batch(self, order, param):
return self.con.bulk_query(order, param)
def tranc_excute(self, order_list):
tr = self.con.transaction()
try:
for i in order_list:
self.con.query(i)
tr.commit()
return 0
except:
tr.rollback()
return 1
# -*- coding: utf-8 -*-
# @Time : 2021/3/2 18:44
# @Author : wangyinghao
# @FileName: performance_project.py
# @Software: PyCharm
from django.db import models
# Create your models here.
class PerformanceProject(models.Model):
"""
性能项目表
"""
performance_project_name = models.CharField("性能项目名称", max_length=50, null=False)
describe = models.TextField("描述", default="", max_length=2000, null=True)
status = models.BooleanField("状态", default=1)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.performance_project_name
# -*- coding: utf-8 -*-
# @Time : 2022/2/8 15:16
# @Author : wangyinghao
# @Site :
# @File : performance_report.py
# @Software: PyCharm
from django.db import models
from automated_main.models.performance_test.performance_script import PerformanceScript
class PerformanceReport(models.Model):
"""
性能测试报告
"""
performance_report_name = models.CharField("性能测试报告名称", max_length=5000, null=False)
pressure_test_content = models.TextField("压测内容", max_length=5000, null=True)
performance_script = models.ForeignKey(PerformanceScript, on_delete=models.CASCADE, null=True)
file = models.CharField("性能测试报告地址", max_length=5000, null=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.performance_report_name
class PerformanceReportError(models.Model):
"""
性能测试报告异常原因
"""
performance_report_error_name = models.CharField("性能测试报告名称", max_length=5000, null=False)
performance_report = models.ForeignKey(PerformanceReport, on_delete=models.CASCADE, null=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
update_time = models.DateTimeField("更新时间", auto_now_add=True)
def __str__(self):
return self.performance_report_error_name
# -*- coding: utf-8 -*-
"""
@Time : 2021/5/27 10:51
@Auth : WangYingHao
@File :performance_script.py
@IDE :PyCharm
"""
from django.db import models
from automated_main.models.performance_test.performance_project import PerformanceProject
import time
def upload_to(instance, fielname):
# 后缀
sub = fielname.split('.')[-1]
t = time.strftime('%Y%m%d%H%M%S', time.localtime())
return 'jmeter_script/namespace/%s.%s' % (t, sub,)
# Create your models here.
class PerformanceScript(models.Model):
"""
性能测试脚本
"""
performance_script_name = models.CharField("性能测试脚本名称", max_length=5000, null=False)
performance_project = models.ForeignKey(PerformanceProject, on_delete=models.CASCADE, null=True)
performance_threads = models.TextField("线程数", max_length=5000, null=False)
performance_ramp_up_time_seconds = models.TextField("Ramp-Up时间(秒)", max_length=5000, null=False)
performance_loop_count = models.TextField("循环次数", max_length=5000, null=True)
performance_duration = models.TextField("持续时间", max_length=5000, null=True)
performance_scheduler = models.TextField("调度器", max_length=500, null=False)
loop_count_forever = models.TextField("循环-永远", max_length=500, null=True)
performance_script = models.CharField("性能测试脚本", max_length=5000, null=False)
performance_status = models.IntegerField("性能脚本运行状态", default=0)
data_set = models.TextField("参数化设置", max_length=500, null=True)
performance_data_script = models.TextField("jmeter参数化文件", max_length=500, null=True)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.performance_script_name
# -*- coding: utf-8 -*-
# @Time : 2020/12/15 18:10
# @Author : wangyinghao
# @FileName: __init__.py.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
# @Time : 2020/12/19 11:30
# @Author : wangyinghao
# @FileName: ui_element_operation.py
# @Software: PyCharm
from django.db import models
# Create your models here.
class UIElementsOperation(models.Model):
"""
UI元素操作表
"""
elements_operation_name = models.CharField("元素操作名称", max_length=500, null=False)
elements_operation_title = models.CharField("元素操作标题", max_length=500, null=False)
elements_operation_associated_interface = models.CharField("是否关联接口", max_length=50, null=True)
elements_operation_api_url = models.CharField("接口地址", max_length=600, null=True)
elements_operation_describe = models.TextField("描述", default="", null=True)
status = models.BooleanField("状态", default=True)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.elements_operation_name
# -*- coding: utf-8 -*-
# @Time : 2020/12/18 17:59
# @Author : wangyinghao
# @FileName: ui_element_positioning.py
# @Software: PyCharm
from django.db import models
class UIPositioning(models.Model):
"""
UI定位管理表
"""
positioning_name = models.CharField("定位方法名称", max_length=50, null=False)
locating_method = models.CharField("定位方法", max_length=200, null=False)
describe = models.TextField("描述", default="", null=True)
status = models.BooleanField("状态", default=True)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.positioning_name
# -*- coding: utf-8 -*-
# @Time : 2020/12/15 18:15
# @Author : wangyinghao
# @FileName: ui_page.py
# @Software: PyCharm
from django.db import models
from automated_main.models.ui_automation.ui_project import UIProject
class UIPage(models.Model):
"""
UI页面表
"""
ui_project = models.ForeignKey(UIProject, on_delete=models.CASCADE, null=True)
ui_page_name = models.CharField("UI页面名称", max_length=50, null=False)
ui_page_describe = models.TextField("UI页面描述", default="", null=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
updata_time = models.DateTimeField("更新时间", auto_now_add=True)
def __str__(self):
return self.ui_page_name
# -*- coding: utf-8 -*-
# @Time : 2020/12/19 15:22
# @Author : wangyinghao
# @FileName: ui_page_element.py
# @Software: PyCharm
from django.db import models
from automated_main.models.ui_automation.ui_project import UIProject
from automated_main.models.ui_automation.ui_page import UIPage
from automated_main.models.ui_automation.ui_element_positioning import UIPositioning
class UIPageElement(models.Model):
"""
UI页面元素
"""
ui_project = models.ForeignKey(UIProject, on_delete=models.CASCADE)
ui_page = models.ForeignKey(UIPage, on_delete=models.CASCADE)
ui_page_element_name = models.CharField("UI页面元素名称", max_length=100, null=False)
ui_page_element = models.CharField("UI页面元素", max_length=600, null=False)
ui_page_element_more = models.CharField("UI页面元素-多个", max_length=600, null=True)
ui_element_positioning = models.ForeignKey(UIPositioning, on_delete=models.CASCADE)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
updata_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.ui_page_element_name
from django.db import models
# Create your models here.
class UIProject(models.Model):
"""
项目表
"""
ui_project_name = models.CharField("UI项目名称", max_length=50, null=False)
describe = models.TextField("描述", default="", max_length=2000, null=True)
status = models.BooleanField("状态", default=1)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.ui_project_name
# -*- coding: utf-8 -*-
# @Time : 2020/12/24 18:46
# @Author : wangyinghao
# @FileName: ui_test_case.py
# @Software: PyCharm
from django.db import models
from automated_main.models.ui_automation.ui_project import UIProject
# from ui_page_app.models import UIPage
from automated_main.models.ui_automation.ui_page_element import UIPageElement
# Create your models here.
class UITestCase(models.Model):
"""
UI测试用例表
"""
ui_test_case_name = models.CharField("UI测试用例名称", max_length=100, null=False)
ui_project = models.ForeignKey(UIProject, on_delete=models.CASCADE)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.ui_test_case_name
class UITestCaseAssociated(models.Model):
"""
UI测试用例关联表
"""
cid = models.ForeignKey(UITestCase, on_delete=models.CASCADE)
ui_page_elements = models.ForeignKey(UIPageElement, on_delete=models.CASCADE, null=True)
element_operation = models.CharField("元素操作", max_length=100, null=False)
element_input = models.CharField("元素输出", max_length=100, null=True, blank=True)
x_coordinates = models.CharField("X坐标", max_length=100, null=True, blank=True)
y_coordinates = models.CharField("Y坐标", max_length=100, null=True, blank=True)
waiting_time = models.CharField("等待时间", max_length=100, null=True)
case_steps = models.CharField("操作步骤", max_length=100, null=True)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return str(self.cid_id)
# -*- coding: utf-8 -*-
# @Time : 2021/1/7 10:09
# @Author : wangyinghao
# @FileName: ui_test_task.py
# @Software: PyCharm
from django.db import models
from automated_main.models.ui_automation.ui_project import UIProject
class UITestTask(models.Model):
"""
任务表
"""
ui_test_task_name = models.CharField("UI测试任务名称", max_length=100, blank=False, default="")
describe = models.TextField("描述", default="", null=True)
status = models.IntegerField("状态:", default=0) # 未执行、执行中、执行完成、排队中
cases = models.TextField("关联UI用例", default="")
ui_project = models.ForeignKey(UIProject, on_delete=models.CASCADE)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.ui_test_task_name
class UITestResult(models.Model):
"""
测试结果表
"""
ui_test_result_name = models.CharField("UI测试报告名称", max_length=100, blank=False, default="")
ui_task = models.ForeignKey(UITestTask, on_delete=models.CASCADE)
ui_error_total_number = models.CharField("失败总数", max_length=100, null=True, blank=True)
ui_total_number = models.CharField("UI测试用例总数", max_length=100, null=True, blank=True)
ui_successful_total_number = models.CharField("成功总数", max_length=100, null=True, blank=True)
ui_test_script = models.CharField("UI测试脚本", max_length=1000, blank=False, default="", null=True)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.ui_test_result_name
class UITestResultAssociated(models.Model):
"""
UI测试结果关联表
"""
ui_test_case_name = models.CharField("ui测试用例名称", max_length=100, blank=False, default="")
ui_task = models.ForeignKey(UITestTask, on_delete=models.CASCADE)
ui_result = models.ForeignKey(UITestResult, on_delete=models.CASCADE)
ui_error = models.CharField("失败", max_length=100, null=True, blank=True)
ui_successful = models.CharField("成功", max_length=100, null=True, blank=True)
abnormal = models.TextField("异常", max_length=5000, null=True, blank=True)
ui_assertion_results = models.TextField("断言结果", max_length=5000, null=True, blank=True)
updata_time = models.DateTimeField(auto_now_add=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
def __str__(self):
return self.ui_test_case_name
# Create your tests here.
import schedule
def run():
print("i am running")
#
#
# # schedule.every().days.at("2:00").do(run) # 每天凌晨两点运行程序
# schedule.every().minute.do(run) # 每分钟运行一次
# # schedule.every(10).minute.do(run) # 每10分钟运行一次
# # schedule.every().friday.do(run) # 每周五运行
# # schedule.every().saturday.at("12:00").do(run) # 每周六的12点运行程序
# while True:
# schedule.run_pending()
# time.sleep(1)
schedule.every(2).seconds.do(run) # 每10秒执行一次
# while True:
# schedule.run_pending() # 运行所有可运行的任务
# time.sleep(1)
class A(object):
def m1(self, n):
print("self:", self)
@classmethod
def m2(cls, n):
print("cls:", cls)
@staticmethod
def m3(n):
print(n)
a = A()
a.m1(1) # self: <__main__.A object at 0x000001E596E41A90>
A.m2(1) # cls: <class '__main__.A'>
A.m3(1)
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:03
@Auth : WangYingHao
@File :__init__.py.py
@IDE :PyCharm
"""
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 11:10
@Auth : WangYingHao
@File :__init__.py.py
@IDE :PyCharm
"""
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 11:10
@Auth : WangYingHao
@File :api_business_test_url.py
@IDE :PyCharm
"""
"""
8.19 弃用
"""
# from django.urls import path
# from automated_main.view.api_automation.api_business_test.api_business_test_list_view import \
# ApiBusinessTestListView
# from automated_main.view.api_automation.api_business_test.api_business_test_view import GetApiBusinessTestSelectData,\
# ApiBusinessTestView, ApiBusinessTestDebugView
# urlpatterns = [
# # API业务测试
# path("api/backend/api_business_test/list/<int:api_project_id>/",
# ApiBusinessTestListView.as_view()),
# path("api/backend/api_business_test/get_api_test_business_test_select_data/<int:api_project_id>/",
# GetApiBusinessTestSelectData.as_view()),
# path("api/backend/api_business_test/", ApiBusinessTestView.as_view()),
# path("api/backend/api_business_test/<int:api_business_test_id>/", ApiBusinessTestView.as_view()),
# path("api/backend/api_business_test/api_business_test_debug/", ApiBusinessTestDebugView.as_view()),
# ]
# -*- coding: utf-8 -*-
# @Time : 2021/10/22 9:53
# @Author : wangyinghao
# @File : api_database_url.py
# @Software: PyCharm
from django.urls import path
from automated_main.view.api_automation.api_database.api_database_list_view import ApiDatabaseListView
from automated_main.view.api_automation.api_database.api_database_view import ApiDatabaseView, DatabaseProcessingView
urlpatterns = [
# 获取api数据库列表
path("api/backend/api_database/list/", ApiDatabaseListView.as_view()),
path("api/backend/api_database/", ApiDatabaseView.as_view()),
path("api/backend/api_database/<int:api_database_id>/", ApiDatabaseView.as_view()),
path("api/backend/api_debug_database/", DatabaseProcessingView.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 11:10
@Auth : WangYingHao
@File :api_environment_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.api_automation.api_environment.api_environment_list_view import ApiEnvironmentListView
from automated_main.view.api_automation.api_environment.api_environment_view import ApiEnvironmentView
urlpatterns = [
# 获取api环境列表
path("api/backend/api_environment/list/", ApiEnvironmentListView.as_view()),
path("api/backend/api_environment/", ApiEnvironmentView.as_view()),
path("api/backend/api_environment/<int:api_environment_id>/", ApiEnvironmentView.as_view()),
]
# -*- coding: utf-8 -*-
# @Time : 2022/5/24 21:36
# @Author : wangyinghao
# @File : api_management_url.py
# @Software: PyCharm
from django.urls import path
from automated_main.view.api_automation.api_management.api_management_detail_view import ApiManagementView
from automated_main.view.api_automation.api_management.api_management_list_view import ApiManagementListView, ApiManagementSearchView,ApiManagementJudgeView, ApiManagementStructureDataEditView, ApiYaPiInterfaceView, YaPiInterfaceBasicInformationView
from automated_main.view.api_automation.api_management.api_interfaces_case_list_view import ApiInterfacesListView
from automated_main.view.api_automation.api_management.api_interfaces_case_view import ApiInterfacesCaseView, ApiInterfacesCaseDeBugView
urlpatterns = [
# 获取接口服务列表
path("api/backend/api_management/list/", ApiManagementListView.as_view()),
# 变更/获取 单个服务
path("api/backend/api_management/<int:api_management_id>/", ApiManagementView.as_view()),
# 获取接口测试用例列表
path("api/backend/apiInterfacesList/<int:api_server_id>/", ApiInterfacesListView.as_view()),
# 复制用例
path("api/backend/apiInterfacesCopyCase/", ApiInterfacesListView.as_view()),
# 创建接口测试用例
path("api/backend/apiInterfacesCase/", ApiInterfacesCaseView.as_view()),
# 获取接口测试用例
path("api/backend/apiInterfacesCase/<int:api_interfaces_case_id>/", ApiInterfacesCaseView.as_view()),
# 获取调试测试用例 debug
path("api/backend/apiInterfacesCase/debug/", ApiInterfacesCaseDeBugView.as_view()),
# 搜索-服务树行结构
path("api/backend/apiManagementSearch/", ApiManagementSearchView.as_view()),
# 判断 父节点 是否可创建用例(只有用例节点才可创建用例)
path("api/backend/apiManagement/JudgeAddCases/", ApiManagementJudgeView.as_view()),
# tree树结构变更
path("api/backend/apiManagement/ApiManagementStructureDataEdit/", ApiManagementStructureDataEditView.as_view()),
# 获取YAPI接口基础信息
path("api/backend/apiManagement/yaPiInterfaceBasicInformation/", YaPiInterfaceBasicInformationView.as_view()),
# YAPI接口-新增/修改 到tree树
path("api/backend/apiManagement/apiYaPiInterface/", ApiYaPiInterfaceView.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 11:10
@Auth : WangYingHao
@File :api_module_url.py
@IDE :PyCharm
"""
"""
8.19 弃用
"""
# from django.urls import path
# from automated_main.view.api_automation.api_module.api_module_list_view import ApiModuleListView
# from automated_main.view.api_automation.api_module.api_module_view import ApiModuleView
# from automated_main.view.api_automation.api_module.api_module_view import ApiProjectModuleView
# urlpatterns = [
#
# # API模块
# path("api/backend/api_module/list/", ApiModuleListView.as_view()),
# path("api/backend/api_module/", ApiModuleView.as_view()),
# path("api/backend/api_module/<int:api_module_id>/", ApiModuleView.as_view()),
#
# # 获取 单个api项目中包含得所有模块
# path("api/backend/api_project/api_module/<int:api_project_id>/<int:size_page>/<int:page>/", ApiProjectModuleView.as_view()),
# ]
# -*- coding: utf-8 -*-
# @Time : 2022/7/21 15:34
# @Author : wangyinghao
# @Site :
# @File : api_plan_url.py
# @Software: PyCharm
from django.urls import path
from automated_main.view.api_automation.api_test_plan.api_test_plan_view import APITestPlanSuspended, ApiTestPlanView, GetScenariosCaseTree, PerformApiPlan, CheckApiPlanResultList, CheckApiResult, CheckApiResultErrorList
from automated_main.view.api_automation.api_test_plan.api_test_plan_list_view import ApiTestPlanListView
urlpatterns = [
# 测试计划-删除/编辑/获取
path("api/backend/api_test_plan/<int:api_test_plan_id>/", ApiTestPlanView.as_view()),
# 新增测试计划
path("api/backend/api_test_plan/", ApiTestPlanView.as_view()),
# 暂停测试计划
path("api/backend/api_test_plan/suspended/", APITestPlanSuspended.as_view()),
# 获取项目下所有测试计划
path("api/backend/api_test_plan/list/<int:api_management_id>/", ApiTestPlanListView.as_view()),
# 场景用例树结构
path("api/backend/api_test_plan/get_scenarios_case_tree/<int:api_management_id>/", GetScenariosCaseTree.as_view()),
path("api/backend/api_test_plan/post_scenarios_case_tree/<int:api_test_plan_id>/", GetScenariosCaseTree.as_view()),
# API-执行测试计划
path("api/backend/api_test_plan/perform_api_test_plan/<int:api_test_plan_id>/", PerformApiPlan.as_view()),
# API-执行所有测试计划
path("api/backend/api_test_plan/perform_api_test_plan_all/", PerformApiPlan.as_view()),
# 测试计划报告列表
path("api/backend/api_test_plan/check_result_list/<int:api_test_plan_id>/<int:size_page>/<int:page>/",
CheckApiPlanResultList.as_view()),
# API测试计划-查看单独测试计划报告
path("api/backend/api_test_plan/check_result/<int:api_test_result_id>/<int:size_page>/<int:page>/",
CheckApiResult.as_view()),
path("api/backend/api_test_plan/single_check_result/<int:api_test_case_result_id>/", CheckApiResult.as_view()),
path("api/backend/api_test_plan/check_result/<int:api_test_result_id>/", CheckApiResult.as_view()),
# 查看失败报告
path("api/backend/api_test_plan/check_result/error/<int:api_test_result_id>/<int:size_page>/<int:page>/",
CheckApiResultErrorList.as_view()),
]
\ No newline at end of file
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 11:11
@Auth : WangYingHao
@File :api_project_url.py
@IDE :PyCharm
"""
"""
8.19 弃用
"""
# from django.urls import path
# from automated_main.view.api_automation.api_project.api_project_view import ApiProjectView
# from automated_main.view.api_automation.api_project.api_project_list_view import ApiProjectListView
# urlpatterns = [
#
# # API项目
# path("api/backend/api_project/", ApiProjectView.as_view()),
# path("api/backend/api_project/<int:api_project_id>/", ApiProjectView.as_view()),
# path("api/backend/api_project/list/", ApiProjectListView.as_view()),
# ]
# -*- coding: utf-8 -*-
# @Time : 2022/7/19 13:47
# @Author : wangyinghao
# @Site :
# @File : api_scenarios_case_url.py
# @Software: PyCharm
from django.urls import path
from automated_main.view.api_automation.api_scenario_use_case.api_scenarios_case_list_view import ApiScenariosCaseListView, InterfacesProjectListView, ServiceModuleInterfacesCaseRelationshipView, ApiScenariosCaseCopyView
from automated_main.view.api_automation.api_scenario_use_case.api_scenarios_case_view import ApiScenariosCaseView, ApiScenariosCaseGetView, ApiScenariosCaseDebugView
urlpatterns = [
# 获取接口测试用例列表 4级目录 tree树
path("api/backend/api_scenarios_case/list/", ApiScenariosCaseListView.as_view()),
# 获取接口项目列表
path("api/backend/InterfacesProjectList/list/", InterfacesProjectListView.as_view()),
# 创建场景用例
path("api/backend/api_scenarios_case/", ApiScenariosCaseView.as_view()),
# 删除/编辑 场景接口测试用例
path("api/backend/api_scenarios_case/<int:scenarios_case_id>/", ApiScenariosCaseView.as_view()),
# 获取单个场景接口测试用例-组装
path("api/backend/api_single_scenarios_case/<int:scenarios_case_id>/", ApiScenariosCaseGetView.as_view()),
# 获取场景接口测试用例列表
path("api/backend/interfaces_scenarios_case/list/<int:api_management_id>/", ApiScenariosCaseView.as_view()),
# 场景接口用例debug
path("api/backend/interfaces_scenarios_case/interfaces_scenarios_case_debug/", ApiScenariosCaseDebugView.as_view()),
# 场景接口-服务-模块-接口-用例 关系
path("api/backend/interfaces_scenarios_case/ServiceModuleInterfacesCaseRelationship/", ServiceModuleInterfacesCaseRelationshipView.as_view()),
# Copy-复制 场景用例
path("api/backend/copy_interfaces_scenarios_case/", ApiScenariosCaseCopyView.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 11:11
@Auth : WangYingHao
@File :api_test_case_url.py
@IDE :PyCharm
"""
"""
8.19 弃用
"""
# from django.urls import path
# from automated_main.view.api_automation.api_test_case.api_test_case_list_view import ApiTestCaseListView
# from automated_main.view.api_automation.api_test_case.api_test_case_view import ApiTestCaseView, ApiTestCaseDeBugView, UploadTestCases, DownloadApiCaseTemplate
# urlpatterns = [
# # API测试用例
# path("api/backend/api_test_case/list/<int:api_module_id>/", ApiTestCaseListView.as_view()),
# path("api/backend/api_test_case/<int:api_test_case_id>/", ApiTestCaseView.as_view()),
# path("api/backend/api_test_case/", ApiTestCaseView.as_view()),
# path("api/backend/api_test_case/debug/", ApiTestCaseDeBugView.as_view()),
# # 上传API测试用例
# path("api/backend/api_test_case/upload_test_cases/", UploadTestCases.as_view(), name="upload"),
#
# # 导入API测试用例
# path("api/backend/api_test_case/upload_api_case_import/", UploadTestCases.as_view()),
#
# # 下载web脚本模板
# path("api/backend/api_test_case/api_test_case_template/download_api_case_template/",
# DownloadApiCaseTemplate.as_view()),
# ]
# # -*- coding: utf-8 -*-
# """
# @Time : 2021/6/21 11:11
# @Auth : WangYingHao
# @File :api_test_task_url.py
# @IDE :PyCharm
#
# """
# from django.urls import path
# """
# 8.19 弃用
# """
# # from automated_main.view.api_automation.api_test_task.api_test_task_list_view import ApiTestTaskListView
# from automated_main.view.api_automation.api_test_task.api_test_task_view import ApiTestTaskView, APITestTaskSuspended, GetApiCaseTree, CheckApiResultList, CheckApiResult, PerformApiTask, CheckApiResultErrorList, ApiServiceChangesTask
# from automated_main.view.api_automation.api_data_synchronization.api_data_synchronization_view import ApiDataSynchronization, ApiScenarioSynchronization
#
#
# urlpatterns = [
# # API任务管理
#
# # path("api/backend/api_test_task/list/<int:api_project_id>/", ApiTestTaskListView.as_view()),
# path("api/backend/api_test_task/<int:api_test_task_id>/", ApiTestTaskView.as_view()),
# path("api/backend/api_test_task/", ApiTestTaskView.as_view()),
# path("api/backend/api_test_task/suspended/", APITestTaskSuspended.as_view()),
#
# path("api/backend/api_test_task/get_api_case_tree/<int:api_project_id>/", GetApiCaseTree.as_view()),
# path("api/backend/api_test_task/get_api_case_tree/<int:api_test_task_id>/", GetApiCaseTree.as_view()),
#
# # API任务管理-查看报告列表
# path("api/backend/api_test_task/check_result_list/<int:api_test_task_id>/<int:size_page>/<int:page>/", CheckApiResultList.as_view()),
#
# # API任务管理-查看单独测试报告
# path("api/backend/api_test_task/check_result/<int:api_test_result_id>/<int:size_page>/<int:page>/", CheckApiResult.as_view()),
# path("api/backend/api_test_task/check_result/<int:api_test_result_id>/", CheckApiResult.as_view()),
# path("api/backend/api_test_task/single_check_result/<int:api_test_case_result_id>/", CheckApiResult.as_view()),
# # 查看失败报告
# path("api/backend/api_test_task/check_result/error/<int:api_test_result_id>/<int:size_page>/<int:page>/", CheckApiResultErrorList.as_view()),
#
# # API任务管理-执行任务
# path("api/backend/api_test_task/perform_api_task/<int:api_test_task_id>/", PerformApiTask.as_view()),
#
# # API任务管理-执行所有任务
# path("api/backend/api_test_task/perform_all_api_task/", PerformApiTask.as_view()),
#
# # API任务管理-执行服务有更改的接口
# path("api/backend/api_test_task/api_service_changes_task/", ApiServiceChangesTask.as_view()),
#
# # API数据同步-8.4弃用
# path("api/backend/apiDataSynchronization/", ApiDataSynchronization.as_view()),
#
# # API场景数据同步-8.5弃用
# path("api/backend/apiScenarioDataSynchronization/", ApiScenarioSynchronization.as_view()),
#
# ]
# -*- coding: utf-8 -*-
from django.urls import path
from automated_main.view.api_querrydiff.api_querrydiff_task import ApiQuerydiffTaskView, ApiQuerydiffTaskListView, ApiQuerydiffTaskActionView
from automated_main.view.api_querrydiff.api_querrydiff_task_detail import ApiQuerydiffTaskDetailView
urlpatterns = [
# API测试用例
path("api/querydiff/task/list", ApiQuerydiffTaskListView.as_view()),
path("api/querydiff/task/info/<int:task_id>/", ApiQuerydiffTaskView.as_view()),
path("api/querydiff/task/delete/<int:task_id>/", ApiQuerydiffTaskView.as_view()),
path("api/querydiff/task/case/list", ApiQuerydiffTaskDetailView.as_view()),
path("api/querydiff/task/screen/", ApiQuerydiffTaskActionView.as_view()),
path("api/querydiff/task/run/<int:task_id>/", ApiQuerydiffTaskActionView.as_view()),
path("api/querydiff/task/create/", ApiQuerydiffTaskView.as_view()),
path("api/querydiff/task/edit/", ApiQuerydiffTaskView.as_view())
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 11:03
@Auth : WangYingHao
@File :__init__.py.py
@IDE :PyCharm
"""
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 11:04
@Auth : WangYingHao
@File :performance_project_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.performance_test.performance_project.performance_project_list_view import PerformanceProjectListView
from automated_main.view.performance_test.performance_project.performance_project_view import PerformanceProjectView
urlpatterns = [
# 性能测试-性能项目
path("api/backend/performance_test/performance_project_list/", PerformanceProjectListView.as_view()),
path("api/backend/performance_test/performance_project/", PerformanceProjectView.as_view()),
path("api/backend/performance_test/performance_project/<int:performance_project_id>/",
PerformanceProjectView.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 11:04
@Auth : WangYingHao
@File :performance_script_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.performance_test.performance_script.performance_script_list_view import \
PerformanceScriptListView
from automated_main.view.performance_test.performance_script.performance_script_view import PerformanceScriptView, \
PerformanceProjectScriptView, PerformanceScriptUpload, PerformPerformanceScript, PerformanceScriptReport, \
PerformanceProjectScriptSuspendedView, PerformanceScriptDataSetUpload, NewPerformPerformanceScript, PerformanceScriptReportPage
urlpatterns = [
path("api/backend/performance_test/performance_script_list/", PerformanceScriptListView.as_view()),
path("api/backend/performance_test/performance_script/", PerformanceScriptView.as_view()),
path("api/backend/performance_test/performance_script/<int:performance_script_id>/",
PerformanceScriptView.as_view()),
# 获取 单个性能测试项目中包含得所有性能脚本
path(
"api/backend/performance_test/performance_project_script/<int:performance_project_id>/<int:size_page>/<int:page>/",
PerformanceProjectScriptView.as_view()),
# 搜索-查看脚本名称
path("api/backend/performance_test/performance_project_script/<int:size_page>/<int:page>/",
PerformanceProjectScriptView.as_view()),
# 暂停执行jmeter
path("api/backend/performance_test/performance_project_script/script_suspended/<int:performance_script_id>/",
PerformanceProjectScriptSuspendedView.as_view()),
# 上传性能测试脚本
path("api/backend/performance_test/performance_script_upload/", PerformanceScriptUpload.as_view(), name="upload"),
# 上传性能测试脚本参数化
path("api/backend/performance_test/performance_script_data_set_upload/", PerformanceScriptDataSetUpload.as_view(), name="upload"),
# 执行性能脚本
path("api/backend/performance_test/perform_performance_script/<int:performance_script_id>/",
PerformPerformanceScript.as_view()),
# New执行性能脚本
path("api/backend/performance_test/new_perform_performance_script/<int:performance_script_id>/",
NewPerformPerformanceScript.as_view()),
# 性能测试报告
path("api/backend/performance_test/performance_script_report/<int:performance_script_id>/",
PerformanceScriptReport.as_view()),
# New性能测试报告
path("api/backend/performance_test/performance_script_report/",
PerformanceScriptReport.as_view()),
# 性能测试报告 -删除
path("api/backend/performance_test/performance_script_report/<str:report_name>/<int:report_id>/",
PerformanceScriptReport.as_view()),
# 性能测试报告页面获取数据-单独页面
path("api/backend/performance_test/performance_script_report_page/<int:performance_report_id>/",
PerformanceScriptReportPage.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:03
@Auth : WangYingHao
@File :__init__.py.py
@IDE :PyCharm
"""
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:04
@Auth : WangYingHao
@File :system_home_page_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.system_home_page.system_home_page_list_view import SystemHomePageListView, SystemHomePageAPIListView
urlpatterns = [
path("api/backend/system_home_page_list/", SystemHomePageListView.as_view()),
path("api/backend/system_home_page_list/api_statistics/", SystemHomePageAPIListView.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:16
@Auth : WangYingHao
@File :__init__.py.py
@IDE :PyCharm
"""
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:22
@Auth : WangYingHao
@File :ui_element_operation_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.ui_automation.ui_element_operation.ui_element_operation_list_view import UiElementOperationListView
from automated_main.view.ui_automation.ui_element_operation.ui_element_operation_view import UIElementOperationView
urlpatterns = [
path("api/backend/ui_element_operation/list/", UiElementOperationListView.as_view()),
path("api/backend/ui_element_operation/", UIElementOperationView.as_view()),
path("api/backend/ui_element_operation/<int:element_operation_id>/", UIElementOperationView.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:18
@Auth : WangYingHao
@File :ui_page_element_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.ui_automation.ui_page_element.ui_page_element_list_view import UIPageElementListView
from automated_main.view.ui_automation.ui_page_element.ui_page_element_view import UIPageElementView, GetUiPageSelectData
urlpatterns = [
path("api/backend/ui_page_element/list/", UIPageElementListView.as_view()),
path("api/backend/ui_page_element/", UIPageElementView.as_view()),
path("api/backend/ui_page_element/<int:ui_page_id>/", UIPageElementView.as_view()),
path("api/backend/ui_page_element/get_ui_page_select_data/", GetUiPageSelectData.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:18
@Auth : WangYingHao
@File :ui_page_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.ui_automation.ui_page.ui_page_list_view import UiPageListView
from automated_main.view.ui_automation.ui_page.ui_page_view import UiPageView, UiProjectPageView
urlpatterns = [
path("api/backend/ui_page/list/", UiPageListView.as_view()),
path("api/backend/ui_page/", UiPageView.as_view()),
path("api/backend/ui_page/<int:ui_page_id>/", UiPageView.as_view()),
# 获取 单个UI项目中包含得所有页面
path("api/backend/ui_page_element/ui_project_page/<int:ui_project_id>/", UiProjectPageView.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:21
@Auth : WangYingHao
@File :ui_positioning_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.ui_automation.ui_positioning.ui_positioning_list_view import UiElementPositioningListView
from automated_main.view.ui_automation.ui_positioning.ui_positioning_view import UIPositioningView
urlpatterns = [
path("api/backend/ui_positioning/list/", UiElementPositioningListView.as_view()),
path("api/backend/ui_positioning/", UIPositioningView.as_view()),
path("api/backend/ui_positioning/<int:element_positioning_id>/", UIPositioningView.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:17
@Auth : WangYingHao
@File :ui_project_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.ui_automation.ui_project.ui_project_view import UiProjectView
from automated_main.view.ui_automation.ui_project.ui_project_list_view import UiProjectListView
urlpatterns = [
path("api/backend/ui_project/", UiProjectView.as_view()),
path("api/backend/ui_project/<int:ui_project_id>/", UiProjectView.as_view()),
path("api/backend/ui_project/list/", UiProjectListView.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:20
@Auth : WangYingHao
@File :ui_test_case_url.py
@IDE :PyCharm
"""
from django.urls import path
from automated_main.view.ui_automation.ui_test_case.ui_test_case_list_view import UITestCaseListView
from automated_main.view.ui_automation.ui_test_case.ui_test_case_view import UITestCaseView, GetUiTestCaseSelectData, UiTestCaseDeBug
urlpatterns = [
path("api/backend/ui_test_case/list/<int:ui_project_id>/", UITestCaseListView.as_view()),
path("api/backend/ui_test_case/", UITestCaseView.as_view()),
path("api/backend/ui_test_case/<int:ui_test_case_id>/", UITestCaseView.as_view()),
path("api/backend/ui_test_case/get_ui_test_case_select_data/", GetUiTestCaseSelectData.as_view()),
path("api/backend/ui_test_case/debug_ui_test_case/", UiTestCaseDeBug.as_view()),
]
# -*- coding: utf-8 -*-
"""
@Time : 2021/6/21 10:21
@Auth : WangYingHao
@File :ui_test_task_url.py
@IDE :PyCharm
"""
from django.urls import path
from django.urls import re_path
from django.views.static import serve
# from AutomatedTestPlatform.settings import WEB_ROOT
from automated_main.view.ui_automation.ui_test_task.ui_test_task_list_view import UITestTaskListView
from automated_main.view.ui_automation.ui_test_task.ui_test_task_view import UITestTaskView, GetUiCaseTree, PerformUiTask, CheckResultList, CheckResult, DownloadWebScript, DownloadWebScriptTemplate
urlpatterns = [
# UI任务管理
path("api/backend/ui_test_task/list/<int:ui_project_id>/", UITestTaskListView.as_view()),
path("api/backend/ui_test_task/<int:ui_test_task_id>/", UITestTaskView.as_view()),
path("api/backend/ui_test_task/", UITestTaskView.as_view()),
path("api/backend/ui_test_task/get_ui_case_tree/<int:ui_project_id>/", GetUiCaseTree.as_view()),
path("api/backend/ui_test_task/get_ui_case_tree/<int:ui_test_task_id>/", GetUiCaseTree.as_view()),
# UI任务管理-执行任务
path("api/backend/ui_test_task/perform_ui_task/<int:ui_test_task_id>/", PerformUiTask.as_view()),
# UI任务管理-查看报告列表
path("api/backend/ui_test_task/check_result_list/<int:ui_test_task_id>/", CheckResultList.as_view()),
# UI任务管理-删除单独测试报告
path("api/backend/ui_test_task/check_result_list/<int:ui_test_task_id>/<int:ui_test_result_id>/", CheckResultList.as_view()),
# UI任务管理-查看单独测试报告
path("api/backend/ui_test_task/check_result/<int:ui_test_result_id>/", CheckResult.as_view()),
# UI任务管理-查看单独测试报告异常详情
path("api/backend/ui_test_task/check_result/ui_test_abnormal/<int:ui_test_abnormal_result_id>/", CheckResult.as_view()),
# 下载web自动化脚本
path("api/backend/ui_test_task/check_result/ui_test_web_script/<int:ui_test_result_id>/",
DownloadWebScript.as_view()),
# 下载web脚本模板
path("api/backend/ui_test_task/check_result/ui_test_web_script/download_web_script_template/", DownloadWebScriptTemplate.as_view()),
# re_path('^web_log/test_log/(?P<path>.*)$', serve, {'document_root': WEB_ROOT}),
]
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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