Popular en toda la red, marco de automatización de interfaz-pytest+yaml combate real (acabado súper fino)


prefacio

Httprunner usa archivos yaml para implementar el marco de automatización de la interfaz. Es muy útil. Recientemente, estuve mirando el marco pytest, así que escribí un marco simple similar a la versión pytest al referirme al formato de caso de uso de httprunner.

diseño de la estructura del proyecto

La estructura del proyecto está completamente en línea con la estructura del proyecto de pytest. Pytest está buscando el archivo test_.py. Aquí estoy buscando el archivo test_.yml. La única diferencia es este lugar.

Referencia de la estructura del proyecto

C1

Solo se puede realizar en conftest.py, y la cantidad de código es muy pequeña.La
última versión de pytest 7.x

def pytest_collect_file(parent, file_path):
    # 获取文件.yml 文件,匹配规则
    if file_path.suffix == ".yml" and file_path.name.startswith("test"):
        return YamlFile.from_parent(parent, path=file_path)

pytest 5.x y superior

import pytest
import requests


def pytest_collect_file(parent, path):
    # 获取文件.yml 文件,匹配规则
    if path.ext == ".yml" and path.basename.startswith("test"):
        # print(path)
        # print(parent)
        # return YamlFile(path, parent)
        return YamlFile.from_parent(parent, fspath=path)


class YamlFile(pytest.File):
    # 读取文件内容
    def collect(self):
        import yaml
        raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))
        for yaml_case in raw:
            name = yaml_case["test"]["name"]
            values = yaml_case["test"]
            yield YamlTest.from_parent(self, name=name, values=values)

class YamlTest(pytest.Item):
    def __init__(self, name, parent, values):
        super(YamlTest, self).__init__(name, parent)
        self.name = name
        self.values = values
        self.request = self.values.get("request")
        self.validate = self.values.get("validate")
        self.s = requests.session()

    def runtest(self):
        # 运行用例
        request_data = self.values["request"]
        # print(request_data)
        response = self.s.request(**request_data)
        print("\n", response.text)
        # 断言
        self.assert_response(response, self.validate)

    def assert_response(self, response, validate):
        '''设置断言'''
        import jsonpath
        for i in validate:
            if "eq" in i.keys():
                yaml_result = i.get("eq")[0]
                actual_result = jsonpath.jsonpath(response.json(), yaml_result)
                expect_result = i.get("eq")[1]
                print("实际结果:%s" % actual_result)
                print("期望结果:%s" % expect_result)
                assert actual_result[0] == expect_result

versiones de pytest por debajo de 4.x

import pytest
import requests


def pytest_collect_file(parent, path):
    # 获取文件.yml 文件,匹配规则
    if path.ext == ".yml" and path.basename.startswith("test"):
        # print(path)
        # print(parent)
        return YamlFile(path, parent)



class YamlFile(pytest.File):
    # 读取文件内容
    def collect(self):
        import yaml
        raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))
        for yaml_case in raw:
            name = yaml_case["test"]["name"]
            values = yaml_case["test"]
            yield YamlTest(name, self, values)


class YamlTest(pytest.Item):
    def __init__(self, name, parent, values):
        super(YamlTest, self).__init__(name, parent)
        self.name = name
        self.values = values
        self.request = self.values.get("request")
        self.validate = self.values.get("validate")
        self.s = requests.session()

    def runtest(self):
        # 运行用例
        request_data = self.values["request"]
        # print(request_data)
        response = self.s.request(**request_data)
        print("\n", response.text)
        # 断言
        self.assert_response(response, self.validate)

    def assert_response(self, response, validate):
        '''设置断言'''
        import jsonpath
        for i in validate:
            if "eq" in i.keys():
                yaml_result = i.get("eq")[0]
                actual_result = jsonpath.jsonpath(response.json(), yaml_result)
                expect_result = i.get("eq")[1]
                print("实际结果:%s" % actual_result)
                print("期望结果:%s" % expect_result)
                assert actual_result[0] == expect_result

Afirme esta parte, actualmente solo escriba el juicio de igualdad, solo como referencia, admita jsonpath para extraer datos json

Casos de uso para el formato yaml

En cualquier directorio del proyecto, siempre que sea un archivo yml que comience con test_, lo consideramos un caso de prueba.El
contenido de test_login.yml es el siguiente

- test:
    name: login case1
    request:
        url: http://49.235.x.x:7000/api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: 123456
    validate:
        - eq: [$.msg, login success!]
        - eq: [$.code, 0]


- test:
    name: login case2
    request:
        url: 49.235.x.x:7000/api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: 123456
    validate:
        - eq: [$.msg, login success!]
        - eq: [$.code, 0]

Ejecutar el caso de uso

Ejecute el caso de uso, cumpla completamente con el estilo de caso de uso simple de pytest, admita el informe allure

pytest -v
D:\soft\api_pytest_1208>pytest -v
====================== test session starts ======================
platform win32 -- Python 3.6.6, pytest-4.5.0, py-1.9.0,
cachedir: .pytest_cache
rootdir: D:\soft\api_pytest_1208
plugins: allure-pytest-2.8.6
collected 4 items

data/test_login.yml::login case1 PASSED                    [ 25%]
data/test_login.yml::login case2 PASSED                    [ 50%]
data/test_login1.yml::login case1 PASSED                   [ 75%]
data/test_login1.yml::login case2 PASSED                   [100%]

=================== 4 passed in 1.34 seconds ====================

informe atractivo

pytest --alluredir ./report
El siguiente es el diagrama de sistema de arquitectura de conocimiento de aprendizaje de ingeniero de prueba de software más completo en 2023 que compilé

1. De la entrada al dominio de la programación en Python

Por favor agregue una descripción de la imagen

2. Proyecto de automatización de interfaz de combate real.

Por favor agregue una descripción de la imagen

3. Combate real del proyecto de automatización web

Por favor agregue una descripción de la imagen

4. Combate real del proyecto de automatización de aplicaciones

Por favor agregue una descripción de la imagen

5. Hoja de vida de los fabricantes de primer nivel

Por favor agregue una descripción de la imagen

6. Probar y desarrollar el sistema DevOps

Por favor agregue una descripción de la imagen

7. Herramientas de prueba automatizadas de uso común

Por favor agregue una descripción de la imagen

Ocho, prueba de rendimiento JMeter

Por favor agregue una descripción de la imagen

9. Resumen (pequeña sorpresa al final)

Con un sueño en mente, escala con valentía la cima, la lucha es el ritmo del logro. Sin miedo a las dificultades, adhiérase a la intención original y cree brillantez con persistencia. Cada esfuerzo es el poder para cambiar. Cree en tu propia energía, sigue adelante y deja que el trabajo duro y el sudor florezcan las brillantes flores de la vida.

Persevera en la búsqueda, avanza con valentía y la lucha es el ritmo de la danza de la vida. Sin miedo a las dificultades, sigue adelante y crea brillantez con sabiduría y sudor. Cree en tu propia fuerza, fortalece tus creencias y escribe tus propias obras maestras con diligencia.

Acepta el desafío, ve más allá del límite, la lucha es una oportunidad de transformación. Sigue trabajando duro, agudiza tu carácter y deja que tu pasión te impulse. Cree en tu propia fuerza, aventúrate valientemente en el futuro, riega las flores en crecimiento con sudor y crea tu propia vida brillante en la búsqueda.

Supongo que te gusta

Origin blog.csdn.net/x2waiwai/article/details/132188190
Recomendado
Clasificación