報告模塊
報告下載-中文文件
下載時候如果報告名中有中文,則可能出現亂碼
from django.utils.encoding import escape_uri_path
report_path_final = escape_uri_path(report_filename) # 中文亂碼的解決辦法
使用 escape_uri_path
可以解決
報告展示
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
datas = serializer.data
try:
datas['summary'] = json.loads(datas['summary'], encoding='utf8')
except Exception as e:
pass
return Response(datas)
配置模塊
配置管理頁面展示需要展示
配置名稱
所屬項目
所屬接口
其中:配置信息
裏面的外鍵是 所屬接口
接口
裏面的外鍵是 所屬項目
所以要在序列化器中處理掉這裏面的關係
序列化器
InterfacesAnotherSerializer
拿到
項目名稱
項目ID
接口ID
ConfiguresSerializer
裏面用 InterfacesAnotherSerializer
拿到的東西進行展示
注意:create
中 validated_data
拿到的是一個對象,需要
interface_dict = validated_data.pop('interface')
validated_data['interface_id'] = interface_dict['iid']
將它變成對應的ID
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "登錄接口配置_自動化測試平臺項目",
"interface": {
"name": "登錄接口_自動化測試平臺項目",
"project": "自動化測試平臺項目"
},
"author": "檸檬小姐姐"
},
{
"id": 2,
"name": "查詢項目列表配置_前程貸項目",
"interface": {
"name": "查看項目列表接口_前程貸P2P金融項目",
"project": "前程貸P2P金融項目"
},
"author": "檸檬小姐姐"
}
],
"total_pages": 1,
"current_page_num": 1
}
from rest_framework import serializers
from interfaces.models import Interfaces
from utils.validates import whether_existed_project_id, whether_existed_interface_id
from .models import Configures
class InterfacesAnotherSerializer(serializers.ModelSerializer):
project = serializers.StringRelatedField(help_text='項目名稱')
# 項目ID
pid = serializers.IntegerField(write_only=True, validators=[whether_existed_project_id], help_text='項目ID')
# 接口ID
iid = serializers.IntegerField(write_only=True, validators=[whether_existed_interface_id], help_text='接口ID')
class Meta:
model = Interfaces
fields = ('iid', 'name', 'project', 'pid')
extra_kwargs = {
'name':
{
'read_only': True
}
}
def validate(self, attrs):
"""
校驗項目ID是否與接口ID一致
:param attrs:
:return:
"""
if not Interfaces.objects.filter(id=attrs['iid'], project_id=attrs['pid'], is_delete=False).exists():
raise serializers.ValidationError('項目和接口信息不對應!')
return attrs
class ConfiguresSerializer(serializers.ModelSerializer):
"""
配置序列化器
"""
interface = InterfacesAnotherSerializer(help_text='項目ID和接口ID')
class Meta:
model = Configures
fields = ('id', 'name', 'interface', 'author', 'request')
extra_kwargs = {
'request': {
'write_only': True
}
}
def create(self, validated_data):
interface_dict = validated_data.pop('interface')
validated_data['interface_id'] = interface_dict['iid']
return Configures.objects.create(**validated_data)
def update(self, instance, validated_data):
if 'interface' in validated_data:
interface_dict = validated_data.pop('interface')
validated_data['interface_id'] = interface_dict['iid']
return super().update(instance, validated_data)
在 utils.validates.whether_existed_project_id
中檢查項目id是否存在
def whether_existed_project_id(value):
"""
檢查項目id是否存在
:param value:
:return:
"""
if not isinstance(value, int):
raise serializers.ValidationError('所選項目有誤!')
elif not Projects.objects.filter(is_delete=False, id=value).exists():
raise serializers.ValidationError('所選項目不存在!')
視圖
查看 lemon-test/src/components/page/ConfigureAdd.vue
data: function () {
return {
editVisible: false, // 新增配置彈框是否顯示標識
apiMsgData: {
id: null,
name: "",
header: [{key: null, value: null}],
globalVar: [{key: null, value: null, param_type: 'string'}],
},
bodyShow: 'second',
otherShow: 'first',
paramTypes: ['string', 'int', 'float', 'boolean'],
cell: Object(),
project_names: [],
selected_project_id: null,
selected_interface_id: null,
selected_configure_id: null,
configure_name: null, // 配置名稱
author: '', // 用例編寫人員
interfaces: [],
configures: [],
}
}
需要後臺返回一個字典:
datas = {
"author": config_obj.author,
"configure_name": config_name,
"selected_interface_id": selected_interface_id,
"selected_project_id": selected_project_id,
"header": config_headers_list,
"globalVar": config_variables_list
}
import json
from rest_framework.viewsets import ModelViewSet
from rest_framework import permissions
from rest_framework.response import Response
from .models import Configures
from .serializers import ConfiguresSerializer
from interfaces.models import Interfaces
from utils import handle_datas
class ConfiguresViewSet(ModelViewSet):
"""
list:
返回配置信息(多個)列表數據
create:
創建配置信息
retrieve:
返回配置信息(單個)詳情數據
update:
更新(全)配置信息
partial_update:
更新(部分)配置信息
destroy:
刪除配置信息
retrieve:
獲取配置詳情
"""
queryset = Configures.objects.filter(is_delete=False)
serializer_class = ConfiguresSerializer
permission_classes = (permissions.IsAuthenticated,)
ordering_fields = ('id', 'name')
def perform_destroy(self, instance):
instance.is_delete = True
instance.save() # 邏輯刪除
def retrieve(self, request, *args, **kwargs):
config_obj = self.get_object()
# 不建議使用eval()
config_request = json.loads(config_obj.request, encoding='utf-8')
# 處理請求頭數據
config_headers = config_request['config']['request'].get('headers')
config_headers_list = handle_datas.handle_data4(config_headers)
# 處理全局變量數據
config_variables = config_request['config'].get('variables')
config_variables_list = handle_datas.handle_data2(config_variables)
config_name = config_request['config']['name']
selected_interface_id = config_obj.interface_id
# 接口所屬的項目ID
selected_project_id = Interfaces.objects.get(id=selected_interface_id).project_id
datas = {
"author": config_obj.author,
"configure_name": config_name,
"selected_interface_id": selected_interface_id,
"selected_project_id": selected_project_id,
"header": config_headers_list,
"globalVar": config_variables_list
}
return Response(datas)
用例模塊
序列化器
list接口對應的序列化器:TestcasesSerializer
from rest_framework import serializers
from interfaces.models import Interfaces
from utils import validates
from .models import Testcases
class TestcasesSerializer(serializers.ModelSerializer):
"""
用例序列化器
"""
interface = InterfacesAnotherSerializer(help_text="所屬接口和項目信息")
class Meta:
model = Testcases
fields = ('id', 'name', 'interface', 'include', 'author', 'request')
extra_kwargs = {
'include': {
'write_only': True
},
'request': {
'write_only': True
}
}
def create(self, validated_data):
interface_dict = validated_data.pop('interface')
validated_data['interface_id'] = interface_dict['iid']
return Testcases.objects.create(**validated_data)
def update(self, instance, validated_data):
if 'interface' in validated_data:
interface_dict = validated_data.pop('interface')
validated_data['interface_id'] = interface_dict['iid']
return super().update(instance, validated_data)
用例編輯
import json
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from rest_framework import permissions
from .models import Testcases
from interfaces.models import Interfaces
from .serializers import TestcasesSerializer, TestcasesRunSerializer
from utils import handle_datas
class TestcasesViewSet(ModelViewSet):
"""
list:
返回用例(多個)列表數據
create:
創建用例
retrieve:
返回用例(單個)詳情數據
update:
更新(全)用例
partial_update:
更新(部分)用例
destroy:
刪除用例
run:
運行用例
details:
獲取用例詳情
"""
queryset = Testcases.objects.filter(is_delete=False)
serializer_class = TestcasesSerializer
permission_classes = (permissions.IsAuthenticated,)
ordering_fields = ('id', 'name')
def perform_destroy(self, instance):
instance.is_delete = True
instance.save() # 邏輯刪除
def retrieve(self, request, *args, **kwargs):
"""獲取用例詳情信息"""
# Testcase對象
testcase_obj = self.get_object()
# 用例前置信息
testcase_include = json.loads(testcase_obj.include, encoding='utf-8')
# 用例請求信息
testcase_request = json.loads(testcase_obj.request, encoding='utf-8')
testcase_request_datas = testcase_request.get('test').get('request')
# 處理用例的validate列表
# 將[{'check': 'status_code', 'expected':200, 'comparator': 'equals'}]
# 轉化爲[{key: 'status_code', value: 200, comparator: 'equals', param_type: 'string'}]
testcase_validate = testcase_request.get('test').get('validate')
testcase_validate_list = handle_datas.handle_data1(testcase_validate)
# 處理用例的param數據
testcase_params = testcase_request_datas.get('params')
testcase_params_list = handle_datas.handle_data4(testcase_params)
# 處理用例的header列表
testcase_headers = testcase_request_datas.get('headers')
testcase_headers_list = handle_datas.handle_data4(testcase_headers)
# 處理用例variables變量列表
testcase_variables = testcase_request.get('test').get('variables')
testcase_variables_list = handle_datas.handle_data2(testcase_variables)
# 處理form表單數據
testcase_form_datas = testcase_request_datas.get('data')
testcase_form_datas_list = handle_datas.handle_data6(testcase_form_datas)
# 處理json數據
# testcase_json_datas = str(testcase_request_datas.get('json'))
testcase_json_datas = json.dumps(testcase_request_datas.get('json'), ensure_ascii=False)
# 處理extract數據
testcase_extract_datas = testcase_request.get('test').get('extract')
testcase_extract_datas_list = handle_datas.handle_data3(testcase_extract_datas)
# 處理parameters數據
testcase_parameters_datas = testcase_request.get('test').get('parameters')
testcase_parameters_datas_list = handle_datas.handle_data3(testcase_parameters_datas)
# 處理setupHooks數據
testcase_setup_hooks_datas = testcase_request.get('test').get('setup_hooks')
testcase_setup_hooks_datas_list = handle_datas.handle_data5(testcase_setup_hooks_datas)
# 處理teardownHooks數據
testcase_teardown_hooks_datas = testcase_request.get('test').get('teardown_hooks')
testcase_teardown_hooks_datas_list = handle_datas.handle_data5(testcase_teardown_hooks_datas)
selected_configure_id = testcase_include.get('config')
selected_interface_id = testcase_obj.interface_id
selected_project_id = Interfaces.objects.get(id=selected_interface_id).project_id
selected_testcase_id = testcase_include.get('testcases')
datas = {
"author": testcase_obj.author,
"testcase_name": testcase_obj.name,
"selected_configure_id": selected_configure_id,
"selected_interface_id": selected_interface_id,
"selected_project_id": selected_project_id,
"selected_testcase_id": selected_testcase_id,
"method": testcase_request_datas.get('method'),
"url": testcase_request_datas.get('url'),
"param": testcase_params_list,
"header": testcase_headers_list,
"variable": testcase_form_datas_list, # form表單請求數據
"jsonVariable": testcase_json_datas,
"extract": testcase_extract_datas_list,
"validate": testcase_validate_list,
"globalVar": testcase_variables_list, # 變量
"parameterized": testcase_parameters_datas_list,
"setupHooks": testcase_setup_hooks_datas_list,
"teardownHooks": testcase_teardown_hooks_datas_list,
}
return Response(datas)