Lo mejor de toda la red, prueba de automatización de interfaz python - firma de firma de interfaz (código de combate)


prefacio

En general, las interfaces externas de la empresa utilizarán firmas de firmas para proporcionar diferentes apikeys para diferentes clientes, lo que puede mejorar la seguridad de las solicitudes de interfaz y evitar solicitudes aleatorias al modificar los parámetros de solicitud después de ser capturados.

Firma de señal de interfaz

Tome una solicitud de interfaz de inicio de sesión como ejemplo, la siguiente interfaz captura la información del paquete y las reglas de firma de firma son las siguientes

El primer paso es concatenar la cadena, primero eliminar el parámetro de signo y luego eliminar el parámetro p3 cuyo valor está vacío, dejando p2=v2&p1=v1&method=cancel&pn=vn, y luego ordenar en orden ascendente los caracteres del nombre del parámetro, method=cancel&p1=v1&p2=v2&
pn =vn.
El segundo paso es concatenar el nombre y el valor del parámetro, y finalmente obtener methodcancelp1v1p2v2pnvn. El
tercer paso es agregar la clave de verificación apikey después de la cadena concatenada anterior. Asumimos que es abc y obtenga el nuevo método de cadenacancelp1v1p2v2pnvnabc.Cuarto
paso, y luego convierta la cadena a minúsculas para el cálculo md5, asumiendo que el resultado es abcdef, este valor es el valor de firma de sign.

Nota: Antes de calcular md5, asegúrese de que la codificación de cadena de la interfaz sea consistente con la de la parte que accede. Por ejemplo, la codificación utf-8 o la codificación GBK se usan de manera uniforme. Si los métodos de codificación son inconsistentes, la firma calculada fallará. para verificar.

POST http://127.0.0.1:8000/api/v3/login HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json
Host: 127.0.0.1:8000
Content-Length: 111

{
    
    
	"username": "test",
	"password": "123456",
    "sign": "1aca01806e93bb408041965a817666af"

}

HTTP/1.1 200 OK
Date: Sat, 26 Oct 2019 03:38:31 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Content-Type: application/json
Vary: Accept, Cookie
Allow: POST, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 109

{
    
    "code": 0, "msg": "login success!", "username": "test", "token": "a76ba3b8fcbdff82f6a94e5ad5bf8fb934192e5f"}

Implementar firmar firma

Escriba la función pre_sign en conftest.py para preprocesar la parte del cuerpo de la solicitud

import hashlib
from pytest_yaml_yoyo import my_builtins


def sign_body(body: dict) -> str:
    """对body 签名"""
    key = "12345678"      # 接口项目的开发提供
    # 去掉sign 和值为空的
    new_body = [''.join(item) for item in body.items() if item[0] != 'sign' and item[1] != '']
    # print(new_body)
    # 做排序
    new_body.sort()
    # 拼接
    # print(new_body)
    str_body = ''.join(new_body) + key
    # print(str_body)
    # md5加密

    def jiamimd5(src: str):
        """md5加密"""
        m = hashlib.md5()
        m.update(src.encode('UTF-8'))
        return m.hexdigest()

    sign = jiamimd5(str_body)
    return sign


def pre_sign(req: dict):
    print(f'请求预处理:{
      
      req}')
    sign = sign_body(req.get('json'))
    req['json']['sign'] = sign
    print(f'处理后的req数据:{
      
      req}')


my_builtins.pre_sign = pre_sign

El parámetro req en la función pre_sign corresponde al parámetro de solicitud en el caso de uso de yaml, que es un tipo de datos de diccionario.

test_sign_login.yml contenido del caso de uso

config:
  name: 登录
  hooks:
    request: ['pre_sign']

test_login:
  name: 登录
  request:
    method: POST
    url: /api/v3/login
    json:
      username: test8
      password: "123456"
  validate:
    - eq: [body.code, 0]

Ejecutar el caso de uso

pytest test_sign_login.yml

ejecutar registro

test_sign_login.yml::test_login
---------------------------------------------------- live log call -----------------------------------------------------
2023-06-08 09:45:11 [INFO]: 执行文件-> test_sign_login.yml
2023-06-08 09:45:11 [INFO]: base_url-> http://127.0.0.1:8200
2023-06-08 09:45:11 [INFO]: config variables-> {
    
    }
2023-06-08 09:45:11 [INFO]: 运行用例-> test_login
请求预处理:{
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'password': '123456'}}
处理后的req数据:{
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'password': '123456', 'sign': '
65faa7273d552aaedda3abdd1fe5c865'}}
2023-06-08 09:45:11 [INFO]: --------  request info ----------
2023-06-08 09:45:11 [INFO]: yml raw  -->: {
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'passw
ord': '123456', 'sign': '65faa7273d552aaedda3abdd1fe5c865'}}
2023-06-08 09:45:11 [INFO]: method   -->: POST
2023-06-08 09:45:11 [INFO]: url      -->: /api/v3/login
2023-06-08 09:45:11 [INFO]: headers  -->: {
    
    'User-Agent': 'python-requests/2.30.0', 'Accept-Encoding': 'gzip, deflate', 'A
ccept': '*/*', 'Connection': 'keep-alive'}
2023-06-08 09:45:11 [INFO]: json     -->: {
    
    "username": "test8", "password": "123456", "sign": "65faa7273d552aaedda3abdd1f
e5c865"}
2023-06-08 09:45:11 [INFO]: ------  response info  200 OK ------
2023-06-08 09:45:11 [INFO]: 耗时     <--: 0.207054s
2023-06-08 09:45:11 [INFO]: url      <--: http://127.0.0.1:8200/api/v3/login
2023-06-08 09:45:11 [INFO]: headers  <--: {
    
    'Date': 'Thu, 08 Jun 2023 01:45:11 GMT', 'Server': 'WSGIServer/0.2 CPython/3.6
.8', 'Content-Type': 'application/json', 'Allow': 'POST, OPTIONS', 'X-Frame-Options': 'SAMEORIGIN', 'Content-Length': '11
0', 'Vary': 'Cookie'}
2023-06-08 09:45:11 [INFO]: cookies  <--: {
    
    }
2023-06-08 09:45:11 [INFO]: raw text <--: {
    
    "code": 0, "msg": "login success!", "username": "test8", "token": "045acf05c42
2ad8a40e2309ecb8de830d664e50c"}
2023-06-08 09:45:11 [INFO]: validate 校验内容-> [{
    
    'eq': ['body.code', 0]}]
2023-06-08 09:45:11 [INFO]: validate 校验结果-> eq: [0, 0]
2023-06-08 09:45:11 [INFO]: export 导出全局变量:{
    
    }
PASSED            

Como se puede ver en los resultados de ejecución, aunque el caso de uso no pasa el parámetro de signo, el gancho de solicitud en los ganchos preprocesa los parámetros de solicitud para realizar la adición automática del parámetro de signo a la firma dinámica.

请求预处理:{
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'password': '123456'}}
处理后的req数据:{
    
    'method': 'POST', 'url': '/api/v3/login', 'json': {
    
    'username': 'test8', 'password': '123456', 'sign': '
65faa7273d552aaedda3abdd1fe5c865'}}

El uso de parámetros de ganchos en el caso de uso
El ejemplo anterior es poner el parámetro de ganchos en la configuración, y el alcance de la acción es llamar automáticamente a la función de preprocesamiento para cada solicitud en el archivo de caso de uso de yaml actual.

config:
  name: 登录
  hooks:
    request: ['pre_sign']

Si solo preprocesa una sola solicitud, puede colocar el parámetro de ganchos en el parámetro de solicitud de la interfaz

config:
  name: 登录

test_login:
  name: 登录
  request:
    method: POST
    url: /api/v3/login
    json:
      username: test8
      password: "123456"
    hooks:
      request: ['pre_sign']
  validate:
    - eq: [body.code, 0]

De esta manera, el alcance de los ganchos es solo para una solicitud de interfaz única.

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)

Solo dando lo mejor de nosotros podemos superarnos y dejar volar nuestros sueños. No importa cuán densas sean las espinas que tenemos por delante, debemos atravesar valientemente y perseguir las estrellas y los mares en nuestros corazones. Persistencia, el éxito pertenecerá a aquellos que se atreven a luchar.

Solo haciendo nuestro mejor esfuerzo podemos llegar al otro lado de la gloria, solo perseverando podemos crear nuestros propios milagros, siempre que tengamos sueños en mente, cada paso es un valiente punto de partida hacia el éxito. ¡Cree en ti mismo y sigue luchando!

Todo esfuerzo es una oportunidad, y toda persistencia una esperanza. No tengas miedo al fracaso, el éxito requiere coraje y determinación. Solo esforzándonos constantemente podemos dar la bienvenida a un futuro brillante. ¡Cree en ti mismo, puedes hacerlo!

Supongo que te gusta

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