Django实现接口自动化平台(十四)测试用例模块Testcases序列化器及视图【持续更新中】

news2024/10/4 10:20:02

相关文章:

Django实现接口自动化平台(十三)接口模块Interfaces序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客

本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看:

python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测试的喵酱的博客-CSDN博客

一、Testcases应用及相关接口

请求方式URI对应action实现功能
GET/testcases/.list()查询testcase列表
POST/testcases/.create()创建一条数据
GET/testcases/{id}/.retrieve()检索一条testcase的详细数据
PUT/testcases/{id}/update()更新一条数据中的全部字段
PATCH/testcases/{id}/.partial_update()更新一条数据中的部分字段
DELETE/testcases/{id}/.destroy()删除一条数据
POST/testcases/{id}/run/运行某个接口下的所有case

 1.1 用例列表

GET/testcases/.list()查询testcase列表

1.2 创建用例 

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导入了Django的models模块和自定义的BaseModel模块。

然后,定义了Testcases模型类,它包含了以下字段:

  • id:主键字段,使用AutoField类型生成自增的id。
  • name:用例名称字段,使用CharField类型,最大长度为50,设置为唯一值。
  • interface:外键字段,关联到interfaces.Interfaces模型,表示该用例所属的接口。
  • include:前置字段,使用TextField类型,允许为空,保存用例执行前需要执行的顺序信息。
  • author:编写人员字段,使用CharField类型,最大长度为50,保存编写该用例的人员信息。
  • request:请求信息字段,使用TextField类型,保存请求的详细信息。

接下来,定义了该模型类的Meta类,包含了一些元数据:

  • db_table:数据库表的名称,设置为tb_testcases。
  • verbose_name:该模型的可读名称,设置为'用例信息'。
  • verbose_name_plural:该模型的复数形式名称,与verbose_name相同。
  • ordering:查询结果的默认排序规则,按照id字段进行升序排序。

最后,定义了__str__方法,返回用例的名称,用于在后台管理界面和其他地方显示该模型对象的可读信息。

通过以上定义,您可以使用Django框架创建一个名为Testcases的数据表,其中包含了上述定义的字段,并且可以进行数据操作和查询。

注意:

所有请求相关的信息,如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 做的接口自动化驱动,case的形式,就是json格式的。

相关资料:

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="所属环境id", help_text="所属环境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参数
        json_data = testcase_request_data.get('json')
        json_data_str = json.dumps(json_data, ensure_ascii=False)

        # 获取extract参数
        extract_data = testcase_request.get('test').get('extract')
        extract_data = handle_datas.handle_data3(extract_data)

        # 获取validate参数
        validate_data = testcase_request.get('test').get('validate')
        validate_data = handle_datas.handle_data1(validate_data)

        # 获取variables参数
        variables_data = testcase_request.get('test').get('variables')
        variables_data = handle_datas.handle_data2(variables_data)

        # 获取parameters参数
        parameters_data = testcase_request.get('test').get('parameters')
        parameters_data = handle_datas.handle_data3(parameters_data)

        # 获取setup_hooks参数
        setup_hooks_data = testcase_request.get('test').get('setup_hooks')
        setup_hooks_data = handle_datas.handle_data5(setup_hooks_data)

        # 获取teardown_hooks参数
        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,
            # 用例的当前配置(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、创建以时间戳命名的目录
    #     # 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、创建以项目名命名的目录
    #     # 4、生成debugtalks.py、yaml用例文件
    #     # common.generate_testcase_file(instance, env, testcase_dir_path)
    #
    #     # 5、运行用例并生成测试报告
    #     # 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视图集来简化代码。

该视图集定义了以下几个方法:

  1. destroy: 重写了父类的destroy方法,删除指定的测试用例,并返回一个删除成功的响应。
  2. retrieve: 重写了父类的retrieve方法,获取单个测试用例的详情,并将相关数据进行处理后返回。
  3. get_serializer_class: 根据请求的动作不同,选择不同的序列化器进行序列化。
  4. get_testcase_qs: 获取测试用例的查询集。

除此之外,还有一段被注释掉的代码,它包含了运行测试用例的逻辑,根据时间戳创建目录、生成测试用例文件,并运行测试用例生成测试报告。

需要注意的是,这段代码中使用了一些自定义的工具类和函数,如handle_datas、common等,未提供相关代码,可能需要根据实际情况自行补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/769567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1000+设计施工模型免费下载,助力设计方案制作和汇报场景搭建!

作为一名工程设计、施工人员,设计方案制作、工程汇报场景搭建的情景再常见不过。日常需要的模型是必不可少的,但最令人头大的问题是如何寻找方案素材。想要表达的信息越多,素材获取就越是苦恼! 有没有一款软件能够集方案三维汇报…

边缘计算:连接物理与数字世界的智能桥梁

引言: 边缘计算(Edge Computing)作为一种分布式计算模型,旨在将数据处理和分析推向网络边缘设备。随着物联网和大数据的快速发展,边缘计算成为了解决数据处理延迟、网络带宽压力和隐私安全等问题的重要技术。本文将深入…

OLED拼接屏采购指南:如何选择最佳方案?

OLED拼接屏作为一种创新的大屏幕显示设备,正在成为各行各业信息展示和传播的重要工具。 然而,面对市场上众多的品牌和型号,如何选择最佳的OLED拼接屏方案成为一项关键任务。 本文将为您提供一份全面且实用的OLED拼接屏采购指南,…

pdf怎么转换为word格式?这5个实用的方法分享!

在现代数字化时代,PDF(Portable Document Format)文件已经成为广泛使用的文件格式之一。由于其固定的格式和可移植性,PDF文件在共享和传输文档时非常方便。然而,当我们需要编辑或修改PDF文件时,PDF的固定格…

菜品管理模块开发 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(五)

文章目录 前言一、文件上传下载1. 文件上传介绍2. 文件下载介绍3. 实现文件上传功能4. 实现文件下载功能5. 上传下载图片效果预览 二、新增菜品1. 需求分析2. 数据模型3. 代码开发4. 功能测试 三、菜品信息分页查询1. 需求分析2. 代码开发3. 功能测试 四、修改菜品1. 需求分析2…

3.JAVA BIO深入剖析

highlight: arduino-light 1.JAVA BIO深入剖析 1.1 Java BIO 基本介绍 Java BIO 就是传统的 java io 编程,其相关的类和接口在 java.ioBIO(blocking I/O) : 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器…

东莞-戴尔R540服务器故障告警处理方法

DELL PowerEdge R540服务器故障维修案例:(看到文章就是缘分) 客户名称:东莞市某街道管理中心 故障机型:DELL R540服务器 故障问题:DELL R540服务器无法开机,前面板亮黄灯,工程师通过…

PatchMatchNet运行dtu数据集、

文章目录 1 准备工作2 dtu数据集重建演示2.1 bash文件超参数解释2.2 lists/dtu解释1 准备工作 MVSNet、PatchMatchNet环境配置 数据集下载,准备好数据集,我的dtu数据集放在/PatchmatchNet-main/Data/testData/dtu/下,如图所示 进入mvs 环境:source activate mvs 2 dtu数据…

Appium 安卓环境的配置

目录 前言: 环境准备 写个脚本玩玩 前言: 在使用Appium进行安卓自动化测试之前,需要配置相应的安卓环境。 环境准备 为了避免走弯路,我们先要确保三点: Android SDK API > 17 (Additional features require …

14matlab数理统计 多项式的求根和根据根求多项式(matlab程序)

1.简述 分享一下通过多种不同的方法计算多项式的根。 数值根 使用代换法求根 特定区间内的根 符号根 数值根 roots 函数用于计算系数向量表示的单变量多项式的根。 例如,创建一个向量以表示多项式 x2−x−6,然后计算多项式的根。 p [1 -1 -6]; r …

利用Python和Selenium编程,实现定时自动检索特定网页,发现特定网页内容发生变化后,向管理员发送提醒邮件(一)

一、项目需求 要求爬取某单位网站,登录后台查看是否有新增“网友提问”,如果有新的提问,向特定邮箱发出提醒邮件。 二、项目分析 (一)判断是否可用爬虫爬取相关内容 首先查看该网站的robots.txt文件,发现…

SpringCloud(四)Hystrix服务降级、熔断、监控页面

一、服务熔断 官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.5.RELEASE/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients 我们知道,微服务之间是可以进行相互调用的,那么如果出现了…

YUM报错:Could not retrieve mirrorlist

​​​​​​背景说明 ESXI新安装CentOS7,无法执行yum命令 报错内容解决方案 1.报错说明:问题在于yum无法获取CentOS的软件仓库地址,导致无法找到合法的baseurl2.检查网络连接:确保服务器可以访问互联网,以及能够解析D…

C++ CEF库 源码编译及使用(VS2019)

源码编译 官网下载源码 CEF Automated Builds

linux下mmdetection安装

linux下mmdetection安装 使用 MIM 安装 MMEngine 和 MMCV。安装 MMDetection 前提条件是配置了pytorch18的linux环境 参考流程:配置pycharm环境 拷贝pycharm环境为mmdet conda create -n mmdet --clone torch18进入 conda activate mmdet使用 MIM 安装 MMEngine …

量化基础 PTQ QAT

简介 固定bit下的量化始终无法在Accuracy和 (FLOPs & Parameters)之间达到一个非常细粒度的trade-off,所以就需要混合精度量化(Mixed-Precision Quantization, MPQ)来对模型实现进一步的高效压缩 混合精度量化区别于混合精度训练这个概念,后者指的是…

c基本数据类型

关键字 charshort intintlong intfloatdouble 常量和变量 常量:在程序运行过程中,其值不可改变的量变量:其值可以改变的量称为变量 字符数据 字符常量 直接常量:用单引号括起来,如:‘a’,‘b’.转义字…

7.4Java EE——Bean的作用域

一、singleton作用域 Spring支持的5种作用域 作用域名城 描述 singleton 单例模式。在单例模式下,Spring 容器中只会存在一个共享的Bean实例, 所有对Bean的请求,只要请求的id(或name)与Bean的定义相匹配&#xff0…

msvc2017x64编译器编译项目报错”编译器的堆空间不足“错误 的解决方法

开发日常软件的时候,因为项目较大,模块较多,编译时,报错”编译器编译空间不足“,且常规方法无法消除的问题。有 opengl模块 占用内存大 尝试 尝试1   按照常规的,在pro里面加大资源配置: CONF…

记录一下uniapp开发中遇到的一些问题

概述 最近码代码的时候遇到一些问题,这里自己记录总结一下,供大家参考,说得不对的地方希望大家指出 大概介绍一下我用到的内容 用HbuilderX新建一个uni-app项目 ,vue版本选的2,爬坑轻松一点移动端ui框架选了uView&…