相關(guān)文章:
Django實現(xiàn)接口自動化平臺(十三)接口模塊Interfaces序列化器及視圖【持續(xù)更新中】_做測試的喵醬的博客-CSDN博客
本章是項目的一個分解,查看本章內(nèi)容時,要結(jié)合整體項目代碼來看:
python django vue httprunner 實現(xiàn)接口自動化平臺(最終版)_python+vue自動化測試平臺_做測試的喵醬的博客-CSDN博客
一、Testcases應(yīng)用及相關(guān)接口
請求方式 | URI | 對應(yīng)action | 實現(xiàn)功能 |
GET | /testcases/ | .list() | 查詢testcase列表 |
POST | /testcases/ | .create() | 創(chuàng)建一條數(shù)據(jù) |
GET | /testcases/{id}/ | .retrieve() | 檢索一條testcase的詳細(xì)數(shù)據(jù) |
PUT | /testcases/{id}/ | update() | 更新一條數(shù)據(jù)中的全部字段 |
PATCH | /testcases/{id}/ | .partial_update() | 更新一條數(shù)據(jù)中的部分字段 |
DELETE | /testcases/{id}/ | .destroy() | 刪除一條數(shù)據(jù) |
POST | /testcases/{id}/run/ | 運(yùn)行某個接口下的所有case |
?1.1 用例列表
GET | /testcases/ | .list() | 查詢testcase列表 |
1.2 創(chuàng)建用例?
1.2.1 基本信息
?1、拉取了項目列表
2、拉取了項目下的接口列表
3、前置用例列表
4、拉取了所有的配置列表
1.2.2?基本信息
?
?
二、模型類
from django.db import models
from utils.base_models import BaseModel
class Interfaces(BaseModel):
id = models.AutoField(verbose_name='id主鍵', primary_key=True, help_text='id主鍵')
name = models.CharField('接口名稱', max_length=200, unique=True, help_text='接口名稱')
project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
related_name='interfaces', help_text='所屬項目')
tester = models.CharField('測試人員', max_length=50, help_text='測試人員')
desc = models.CharField('簡要描述', max_length=200, null=True, blank=True, help_text='簡要描述')
class Meta:
db_table = 'tb_interfaces'
verbose_name = '接口信息'
verbose_name_plural = verbose_name
ordering = ('id',)
def __str__(self):
return self.name
這段代碼定義了一個名為Testcases的Django模型類,繼承了BaseModel。
首先,通過from django.db import models導(dǎo)入了Django的models模塊和自定義的BaseModel模塊。
然后,定義了Testcases模型類,它包含了以下字段:
- id:主鍵字段,使用AutoField類型生成自增的id。
- name:用例名稱字段,使用CharField類型,最大長度為50,設(shè)置為唯一值。
- interface:外鍵字段,關(guān)聯(lián)到interfaces.Interfaces模型,表示該用例所屬的接口。
- include:前置字段,使用TextField類型,允許為空,保存用例執(zhí)行前需要執(zhí)行的順序信息。
- author:編寫人員字段,使用CharField類型,最大長度為50,保存編寫該用例的人員信息。
- request:請求信息字段,使用TextField類型,保存請求的詳細(xì)信息。
接下來,定義了該模型類的Meta類,包含了一些元數(shù)據(jù):
- db_table:數(shù)據(jù)庫表的名稱,設(shè)置為tb_testcases。
- verbose_name:該模型的可讀名稱,設(shè)置為'用例信息'。
- verbose_name_plural:該模型的復(fù)數(shù)形式名稱,與verbose_name相同。
- ordering:查詢結(jié)果的默認(rèn)排序規(guī)則,按照id字段進(jìn)行升序排序。
最后,定義了__str__方法,返回用例的名稱,用于在后臺管理界面和其他地方顯示該模型對象的可讀信息。
通過以上定義,您可以使用Django框架創(chuàng)建一個名為Testcases的數(shù)據(jù)表,其中包含了上述定義的字段,并且可以進(jìn)行數(shù)據(jù)操作和查詢。
注意:
所有請求相關(guān)的信息,如header、URI、請求體、斷言等等,全部在模型類?request字段中。
request的值,是一個json字符串。如:
{
"test": {
"name": "1陳帥百度",
"request": {
"url": "/mcp/pc/pcsearch",
"method": "POST",
"json": {
"invoke_info": {
"pos_1": [{}],
"pos_2": [{}],
"pos_3": [{}]
}
}
},
"validate": [{
"check": "status_code",
"expected": 200,
"comparator": "equals"
}]
}
}
包含了請求與斷言的信息。
底層使用的httprunner 1.0 做的接口自動化驅(qū)動,case的形式,就是json格式的。
相關(guān)資料:
httprunner 2.x的基本使用(二)_做測試的喵醬的博客-CSDN博客
三、序列化器類
class TestcaseModelSerializer(serializers.ModelSerializer):
interface = InterfaceProjectModelSerializer(label='所屬項目和接口信息', help_text='所屬項目和接口信息')
class Meta:
model = Testcases
exclude = ('create_datetime', 'update_datetime')
extra_kwargs = {
'request': {
'write_only': True
},
'include': {
'write_only': True
},
}
# def validate_request(self, attr):
# # TODO
# return attr
#
# def validate(self, attrs):
# # TODO
# return attrs
def to_internal_value(self, data):
result = super().to_internal_value(data)
iid = data.get('interface').get('iid')
result['interface'] = Interfaces.objects.get(id=iid)
return result
# def create(self, validated_data):
# pass
# class TestcaseRunSerializer(serializers.ModelSerializer):
# env_id = serializers.IntegerField(label="所屬環(huán)境id", help_text="所屬環(huán)境id",
# validators=[ManualValidateIsExist('env')])
#
# class Meta:
# model = Testcases
# fields = ('id', 'env_id')
class TestcaseRunSerializer(RunSerializer):
class Meta(RunSerializer.Meta):
model = Testcases
四、視圖?
import json
import os
from datetime import datetime
from django.conf import settings
from django.http import JsonResponse
from rest_framework import viewsets
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.decorators import action
from .models import Testcases
from envs.models import Envs
from . import serializers
from utils import handle_datas, common
from utils.mixins import RunMixin
class TestcasesViewSet(RunMixin, viewsets.ModelViewSet):
queryset = Testcases.objects.all()
serializer_class = serializers.TestcaseModelSerializer
permission_classes = [permissions.IsAuthenticated]
# 刪除
def destroy(self, request, *args, **kwargs):
response = super().destroy(request, *args, **kwargs)
response.status_code = 200
response = {"code":2000,"msg":"刪除成功"}
response =JsonResponse(response)
return response
# 獲取單個詳情
def retrieve(self, request, *args, **kwargs):
instance = self.get_object() # type: Testcases
try:
testcase_include = json.loads(instance.include, encoding='utf-8')
except Exception:
testcase_include = dict()
try:
testcase_request = json.loads(instance.request, encoding='utf-8')
except Exception:
return Response({'msg': '用例格式有誤', 'status': 400}, status=400)
testcase_request_data = testcase_request.get('test').get('request')
# 獲取json參數(shù)
json_data = testcase_request_data.get('json')
json_data_str = json.dumps(json_data, ensure_ascii=False)
# 獲取extract參數(shù)
extract_data = testcase_request.get('test').get('extract')
extract_data = handle_datas.handle_data3(extract_data)
# 獲取validate參數(shù)
validate_data = testcase_request.get('test').get('validate')
validate_data = handle_datas.handle_data1(validate_data)
# 獲取variables參數(shù)
variables_data = testcase_request.get('test').get('variables')
variables_data = handle_datas.handle_data2(variables_data)
# 獲取parameters參數(shù)
parameters_data = testcase_request.get('test').get('parameters')
parameters_data = handle_datas.handle_data3(parameters_data)
# 獲取setup_hooks參數(shù)
setup_hooks_data = testcase_request.get('test').get('setup_hooks')
setup_hooks_data = handle_datas.handle_data5(setup_hooks_data)
# 獲取teardown_hooks參數(shù)
teardown_hooks_data = testcase_request.get('test').get('teardown_hooks')
teardown_hooks_data = handle_datas.handle_data5(teardown_hooks_data)
data = {
"author": instance.author,
"testcase_name": instance.name,
"selected_configure_id": testcase_include.get('config'),
"selected_interface_id": instance.interface_id,
"selected_project_id": instance.interface.project_id,
"selected_testcase_id": testcase_include.get('testcases', []),
"method": testcase_request_data.get('method'),
"url": testcase_request_data.get('url'),
"param": handle_datas.handle_data4(testcase_request_data.get('params')),
"header": handle_datas.handle_data4(testcase_request_data.get('headers')),
"variable": handle_datas.handle_data2(testcase_request_data.get('data')),
"jsonVariable": json_data_str,
"extract": extract_data,
"validate": validate_data,
# 用例的當(dāng)前配置(variables)
"globalVar": variables_data,
"parameterized": parameters_data,
"setupHooks": setup_hooks_data,
"teardownHooks":teardown_hooks_data
}
return Response(data, status=200)
# @action(methods=['post'], detail=True)
# def run(self, request, *args, **kwargs):
# # 1、取出用例模型對象并獲取env_id
# # instance = self.get_object() # type: Testcases
# # serializer = self.get_serializer(data=request.data)
# # serializer.is_valid(raise_exception=True)
# # env_id = serializer.validated_data.get('env_id')
# # env = Envs.objects.get(id=env_id)
#
# # 2、創(chuàng)建以時間戳命名的目錄
# # dirname = datetime.strftime(datetime.now(), "%Y%m%d%H%M%S")
# # testcase_dir_path = os.path.join(settings.PROJECT_DIR, datetime.strftime(datetime.now(), "%Y%m%d%H%M%S"))
# # os.makedirs(testcase_dir_path)
#
# # 3、創(chuàng)建以項目名命名的目錄
# # 4、生成debugtalks.py、yaml用例文件
# # common.generate_testcase_file(instance, env, testcase_dir_path)
#
# # 5、運(yùn)行用例并生成測試報告
# # return common.run_testcase(instance, testcase_dir_path)
# qs = [self.get_object()]
# return self.execute(qs)
def get_serializer_class(self):
if self.action == "run":
return serializers.TestcaseRunSerializer
else:
return super().get_serializer_class()
def get_testcase_qs(self):
return [self.get_object()]
# return self.queryset.filter(id=self.get_object().id)
?
這段代碼是一個Django視圖集,用于處理測試用例的增刪改查操作。它繼承了RunMixin類,并且使用了ModelViewSet視圖集來簡化代碼。
該視圖集定義了以下幾個方法:
- destroy: 重寫了父類的destroy方法,刪除指定的測試用例,并返回一個刪除成功的響應(yīng)。
- retrieve: 重寫了父類的retrieve方法,獲取單個測試用例的詳情,并將相關(guān)數(shù)據(jù)進(jìn)行處理后返回。
- get_serializer_class: 根據(jù)請求的動作不同,選擇不同的序列化器進(jìn)行序列化。
- get_testcase_qs: 獲取測試用例的查詢集。
除此之外,還有一段被注釋掉的代碼,它包含了運(yùn)行測試用例的邏輯,根據(jù)時間戳創(chuàng)建目錄、生成測試用例文件,并運(yùn)行測試用例生成測試報告。文章來源:http://www.zghlxwxcb.cn/news/detail-585051.html
需要注意的是,這段代碼中使用了一些自定義的工具類和函數(shù),如handle_datas、common等,未提供相關(guān)代碼,可能需要根據(jù)實際情況自行補(bǔ)充。文章來源地址http://www.zghlxwxcb.cn/news/detail-585051.html
到了這里,關(guān)于Django實現(xiàn)接口自動化平臺(十四)測試用例模塊Testcases序列化器及視圖【持續(xù)更新中】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!