Django implementa plataforma de automatización de interfaz (14) módulo de casos de prueba Serializador y vista de casos de prueba [actualizado continuamente]

Artículos relacionados:

Django implementa la plataforma de automatización de interfaz (trece) Módulo de interfaz Serializador de interfaces y vista [actualizado continuamente]_Do test meow sauce blog-CSDN blog

Este capítulo es un desglose del proyecto. Al ver el contenido de este capítulo, debe verse junto con el código general del proyecto:

Python django vue httprunner implementa plataforma de automatización de interfaz (versión final)

1. Aplicación Testcases e interfaces relacionadas

método de solicitud URI acción correspondiente realizar la función
CONSEGUIR /Casos de prueba/ .lista() Lista de casos de prueba de consulta
CORREO /Casos de prueba/ .crear() Crear un dato
CONSEGUIR /casos de prueba/{id}/ .recuperar() Recuperar datos detallados de un caso de prueba
PONER /casos de prueba/{id}/ actualizar() Actualizar todos los campos en un dato
PARCHE /casos de prueba/{id}/ .parcial_actualización() Actualizar algunos campos en un dato
BORRAR /casos de prueba/{id}/ .destruir() eliminar un dato
CORREO /casos de prueba/{id}/ejecutar/ Ejecute todos los casos bajo una determinada interfaz

 1.1 Lista de casos de uso

CONSEGUIR /Casos de prueba/ .lista() Lista de casos de prueba de consulta

1.2 Crear casos de uso 

1.2.1 Información básica

 1. Sacó la lista de proyectos

2. Extrajo la lista de interfaces debajo del proyecto

3. Lista de casos previos al uso

4. Sacó todas las listas de configuración

1.2.2 Información básica

 

 

2. Clase modelo

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

Este código define una clase de modelo de Django llamada Testcases que amplía BaseModel.

En primer lugar, el módulo de modelos de Django y el módulo BaseModel personalizado se importan desde los modelos de importación de django.db.

Luego, se define la clase del modelo Testcases, que contiene los siguientes campos:

  • id: campo de clave principal, use el tipo AutoField para generar una identificación de incremento automático.
  • nombre: Use el campo de nombre del caso, usando el tipo CharField, la longitud máxima es 50, establecido como un valor único.
  • interfaz: campo de clave externa, asociado a las interfaces. Modelo de interfaces, que indica la interfaz a la que pertenece el caso de uso.
  • include: campo previo, usando el tipo TextField, que puede estar vacío, y guarda la información de la secuencia que debe ejecutarse antes de que se ejecute el caso de uso.
  • autor: campo de autor, use el tipo CharField, la longitud máxima es 50, guarde la información del autor de este caso de uso.
  • request: El campo de información de la solicitud, utilizando el tipo TextField, guarda la información detallada de la solicitud.

A continuación, se define la clase Meta de la clase modelo, que contiene algunos metadatos:

  • db_table: el nombre de la tabla de la base de datos, establecida en tb_testcases.
  • verbose_name: un nombre legible por humanos para el modelo, establecido en 'información de caso de uso'.
  • verbose_name_plural: el nombre en plural del modelo, igual que verbose_name.
  • ordering: las reglas de clasificación predeterminadas para los resultados de las consultas, ordenados en orden ascendente según el campo de identificación.

Finalmente, se define el método __str__, que devuelve el nombre del caso de uso, que se utiliza para mostrar la información legible del objeto modelo en la interfaz de administración en segundo plano y en otros lugares.

A través de las definiciones anteriores, puede usar el marco Django para crear una tabla de datos llamada Testcases, que contiene los campos definidos anteriormente y puede realizar operaciones y consultas de datos.

Aviso:

Toda la información relacionada con la solicitud, como el encabezado, el URI, el cuerpo de la solicitud, la aserción, etc., se encuentra en el  campo de solicitud de la clase del modelo .

El valor de la solicitud es una cadena json. como:

{
	"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"
		}]
	}
}

Contiene información sobre solicitudes y aserciones.

El controlador de automatización de la interfaz creado por httprunner 1.0 que se usa en la capa inferior está en formato json.

Informacion relevante:

Uso básico de httprunner 2.x (2)

3. Clase de serializador


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

4. Ver 

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)

 

Este código es un conjunto de vistas de Django, que se usa para manejar la adición, eliminación, modificación y consulta de casos de prueba. Extiende la clase RunMixin y usa el conjunto de vistas ModelViewSet para simplificar el código.

Este conjunto de vistas define los siguientes métodos:

  1. destroy: anula el método destroy de la clase principal, elimina el caso de prueba especificado y devuelve una respuesta de eliminación exitosa.
  2. recuperar: invalide el método de recuperación de la clase principal para obtener los detalles de un solo caso de prueba y devolver los datos relevantes después del procesamiento.
  3. get_serializer_class: seleccione diferentes serializadores para la serialización de acuerdo con las diferentes acciones solicitadas.
  4. get_testcase_qs: Obtiene el conjunto de consultas de los casos de prueba.

Además, hay un fragmento de código que está comentado, que contiene la lógica de ejecutar el caso de prueba, crear un directorio de acuerdo con la marca de tiempo, generar el archivo del caso de prueba y ejecutar el caso de prueba para generar un informe de prueba.

Cabe señalar que en este código se utilizan algunas clases y funciones de herramientas personalizadas, como handle_datas, common, etc. Los códigos relevantes no se proporcionan y es posible que deban complementarse según la situación real.

Supongo que te gusta

Origin blog.csdn.net/qq_39208536/article/details/131789464
Recomendado
Clasificación