Acabado de hematemesis, prueba automatizada de la interfaz de Python: procesamiento de dependencia de la asociación de la interfaz (detalles)


prefacio

descripción de la escena

Al entrevistar la automatización de la interfaz, a menudo se pregunta que el requisito previo para otras llamadas de interfaz es que el usuario actual debe iniciar sesión. ¿Cómo lidiar con las dependencias de la interfaz?

Anteriormente presentamos el administrador de sesiones para guardar el estado de la sesión. Si la solicitud de interfaz necesita llevar un token, ¿cómo manejarlo?

Escenario anormal de solicitar directamente la interfaz de recarga sin iniciar sesión:

import unittest
import requests
class TestRecharge(unittest.TestCase):
    def setUp(self):
        pass
    def tearDown(self):
        pass
    def test_recharge(self):
        url = 'http://127.0.0.1:8888/recharge'
        payload = {
    
    
            "member_id": 100004312,
            "amount": 80
        }
        res = requests.post(url,json=payload)
        print(res.json())
if __name__ == '__main__':
    unittest.main()

El resultado de la operación es el siguiente:

{
    
    'code': 1003, 'msg': '未授权或token已过期'}

ideas de procesamiento de fichas

Antes de procesar, el alma simbólica preguntó tres veces:

¿Cómo obtener token?
¿Cómo gestionar el token obtenido?
¿Cómo llevan tokens otras interfaces?

La idea es la siguiente:
extraiga el token en el valor de retorno de la interfaz de inicio de sesión;
use variables globales para almacenar el token. El token se puede almacenar en el archivo de configuración yaml, json o ini. A continuación, se presenta el token como un atributo de clase; otras
interfaces colocan el valor del token en el encabezado de la solicitud y envían la solicitud;

Uso básico de JsonPath

Necesitamos extraer el token de la interfaz de inicio de sesión, aquí está el uso básico de JsonPath.

Introducción a JsonPath:
JsonPath proporciona capacidades de análisis para documentos Json. Al usar JsonPath, puede encontrar nodos fácilmente y obtener los datos deseados. JsonPath es la versión Json de XPath.

Sintaxis de JsonPath:

JsonPath ilustrar
ps elemento raíz del documento
@ elemento actual
.o[] unir elementos secundarios
hacer coincidir recursivamente todos los elementos secundarios
* Comodines, elementos de nivel inferior coincidentes
[] Operador de subíndice, obtiene elementos según el índice, el índice JsonPath comienza desde 0
[,] Operador de conexión, concatene múltiples resultados en una matriz y regrese, puede usar índice o alias
[start:end:step] Operaciones de corte de datos
?() expresión de filtro

Con tantas especificaciones gramaticales, todos se sentirán confundidos. Los amigos cuidadosos encontrarán que en la gramática... significa hacer coincidir recursivamente todos los subelementos, lo cual es simple y grosero. Use... para obtener todos los subelementos coincidentes, y obtenga el valor deseado a través del índice.

Código fuente de JsonPath

def jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True):
    """traverse JSON object using jsonpath expr, returning values or paths"""

obj: el objeto que debe analizarse, como el valor de retorno de la interfaz. expr: La expresión para hacer coincidir.

Combate real de JsonPath
El siguiente código está escrito para demostración.

from jsonpath import jsonpath
# json格式结果
res = {
    
    
    "code": 0,
    "msg": "OK",
    "data": {
    
    
        "token_info": {
    
    
            "token_type": "Bearer",
            "expires_in": "2020-05-28 13:07:29",
            "token": "eyJhbGciOiJIUzUxAiJ9.eyJtZW1iZZJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNjQyNDQ5fQ.s6A7pzLILf9tqpEDAU9wIPGGLGkgKEQ6EBHq26l-eUM5seCb48DWalkE7u16iRZv3uzD5hIDFbw41Jmi9V0T_Q"
        }
    }
}
# 获取res中的token
token = jsonpath(res,'$..token')[0]
print(token)

El resultado de la respuesta es:

eyJhbGciOiJIUzUxBiJ9.eyJtZW1iZZJfaWQiOpEwMDA1MTMxNSwiZXhwIjoxNTkwNjQyNDQ5fQ.s6A7pzLILf9tqpEDAU9wIPGGLGkgKEQ6EBHq26l-eUM5seCb48SW

instancia de dependencia de token

①En el archivo de configuración config/setting.py, configure el nombre de dominio global o IP.

class DevConfig():
    # 项目的域名或IP
    host='http://127.0.0.1:8888'
config = DevConfig()

②En el archivo config/config.yaml, guarde la cuenta de inicio de sesión.
config.yaml

user:
  mobile_phone: '155********'
  pwd: '12345678'

③En el directorio raíz del proyecto, cree una nueva carpeta middleware y cree un nuevo archivo helper.py debajo de la carpeta, que se usa para procesar tokens.

D1

④ Primero escriba la interfaz de inicio de sesión y devuelva los datos de la interfaz.
ayudante.py

from common.requests_handler import RequestsHandler
from config.setting import config
from common.yaml_handler import yaml_data


def login():
    """登录,接口返回token"""
    req = RequestsHandler()
    res = req.visit('post', config.host+'/login', json=yaml_data['user'])
    return res
print(login())

El resultado de la operación es el siguiente:

{
    
    
    'code': 0,
    'msg': 'OK',
    'data': {
    
    
        'token_info': {
    
    
            'token_type': 'Bearer',
            'expires_in': '2020-05-26 13:31:41',
            'token': 'eyJhbGciOiJIUpUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNDcxMTAxfQ.4QDNdQ-Wyecvpv7yRnMlCx1ZXpAlb8vpohxHht5OfNcjGn_yTaISyhmn7OMzjMGlz68sJ_uFbCh2NhIaO2p_Lg'
        }
    }
}

⑤ A continuación, escriba una función para obtener el valor de retorno de la interfaz de inicio de sesión y extraiga token y token_type para empalmar. Aquí necesitamos usar el módulo jsonpath para extraer el token devuelto y token_type.

ayudante.py

def save_token():
    """保存token信息"""
    res = login()
    token = jsonpath(res,'$..token')[0]
    token_type = jsonpath(res,'$..token_type')[0]
    token = " ".join([token_type, token])
    return token
print(save_token())

El resultado de la operación es el siguiente:

Bearer eyJhbGciOJIPzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwN

⑥Finalmente, defina la clase y use el token como un atributo de clase. El código general es el siguiente: helper.py

from common.requests_handler import RequestsHandler
from config.setting import config
from common.yaml_handler import yaml_data
from jsonpath import jsonpath


def login():
    """登录,返回token信息"""
    req = RequestsHandler()
    res = req.visit('post', config.host+'/login', json=yaml_data['user'])
    return res
def save_token():
    """保存token信息"""
    res = login()
    token = jsonpath(res,'$..token')[0]
    token_type = jsonpath(res,'$..token_type')[0]
    token = " ".join([token_type, token])
    Context.token = token
    return token
class Context:
    """将token作为类属性"""
    token = ''


if __name__ == '__main__':
    print(save_token())

El resultado de la operación es el siguiente:

Bearer eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNDcz

⑦La interfaz de recarga transmite la solicitud del token.

import unittest
import requests


from middleware.helper import Context, save_token
class TestRecharge(unittest.TestCase):
    def setUp(self):
        pass
    def tearDown(self):
        pass
    def test_recharge(self):
        save_token()
        token = Context.token
        url = 'http://127.0.0.1:88888/recharge'
        payload = {
    
    
            "member_id": 100051315,
            "amount": 80
        }
        res = requests.post(url,json=payload)
        print(res.json())


if __name__ == '__main__':
    unittest.main()

El resultado de la operación es:

{
    
    
    'code': 0,
    'msg': 'OK',
    'data': {
    
    
        'leave_amount': 240.0,
        'mobile_phone': '155********',
    }
}
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)

Sin miedo al viento y la lluvia, sigue adelante y la lucha es la forma de realizar tus sueños. Persevera, persigue la distancia y crea una vida brillante con perseverancia. Cree en tu propia fuerza, enciende tu entusiasmo y cada esfuerzo es un trampolín hacia el éxito. Mientras tengas coraje, seguramente florecerás tu propio capítulo magnífico.

Acepte los desafíos, brille intensamente y luche es el viaje para lograr la brillantez. Siga adelante, mantenga los pies en el suelo y construya una piedra angular sólida para el éxito con sudor. Cree en tu propia capacidad, persevera, y cada esfuerzo es un paso valiente hacia la meta.

Con un sueño en mente, avanza con valentía, y la lucha es un viaje para seguir adelante. Persiguiendo la gloria, superando espinas y espinas, regando las flores del logro con sudor. Creer en la autoestima, no temer a las dificultades, cada esfuerzo es un paso sólido hacia el éxito.

Supongo que te gusta

Origin blog.csdn.net/csdnchengxi/article/details/132189438
Recomendado
Clasificación