Reproducción de tráfico de python3-API/pruebas de acuerdos/pruebas automatizadas

Probador de PPL

Introducción

El conjunto de herramientas http obtiene la información de solicitud y respuesta de la API a través del proxy y realiza pruebas de convención/reproducción de tráfico o generación rápida de casos de uso en esta información de solicitud. También puede modificar manualmente la extracción parametrizada, referencias variables, afirmaciones, etc. para realizar pruebas API automatizadas. ¡Casos de uso y más!
¿Pensaste que era solo reproducción de tráfico? Incorrecto ~ ¡Ve y echa un vistazo a la versión v2!

Mira, recuerda darme una estrella .
dirección del proyecto:

casa rural github


Características

Diagrama de flujo (inglés simple···)

Insertar descripción de la imagen aquí
PD:
1. El autor ejecuta Windows exe. Otros sistemas pueden empaquetarse ellos mismos o ejecutarse con Python ppl x.
2. El programa en ejecución debe ejecutarse en el directorio raíz del proyecto ...

Es necesario instalar el entorno Python3 y las bibliotecas dependientes:

pip install -r requirements.txt

1. proxy http

command: ppl.exe f   (python ppl.py f)
    2023-01-20 10:39:53.628 | INFO     | __main__:cmd:37 - run:http flows cat. exit:Ctrl+C
    2023-01-20 10:39:53.642 | INFO     | utils.flows:cat_mock_load:25 - loaded mock*.json match to will mock!
    2023-01-20 10:39:53.644 | INFO     | utils.flows:__init__:114 - Proxy server listening at http://0.0.0.0:8888

Insertar descripción de la imagen aquí
Para conocer el uso básico del proxy, consulte la publicación del blog: Haga clic para saltar

Documentación oficial: https://docs.mitmproxy.org/stable

Documentación china: https://ptorch.com/docs/10/mitmproxy_introduction


2. respuesta http simulada

¡Se puede burlar de la respuesta!

2.1 Configurar config.ini

mock = ON
    mock ON :开启mock
    mock OFF:关闭mock
mode = ON
    mode ON :向远程服务器发送任何数据,且根据mock数据交集返回数据从而响应
    mode OFF:不向远程服务器发送任何数据

2.2 Formato de archivo simulado: simulado*.json

2.3 Formato de referencia de parámetros aleatorios: ${faker}

结合 faker 的方法进行随机模式,文档请参考:https://faker.readthedocs.io/en/master/providers/faker.providers.python.html
mock demo:
{
  "api/user/info": {
    "bool": "${pybool}",
    "name": "${name}",
    "int": "${pyint}",
    "float": "${pyfloat(0,1)}",
    "data|1-3": [
      {
        "name": "${name}"
      }
    ]
  }
}

salida de demostración simulada
Insertar descripción de la imagen aquí


3. Reemplazar el flujo http

solicitar reemplazo regular admite el reemplazo (cookie del cuerpo de la URL de los encabezados)

replace = {"pattern":"value","pattern1":"value1"}
使用场景:
    1.鉴权:将 token 设置为空,如:
        replace = {"old token xxx":""}
    2.越权:将 token 设置为另用户token,越权又分为①水平越权(同角色)②垂直越权(向上级),如:
        replace = {"old token xxx":"new token xxx"}
    3.流量转发, 将test环境的前端去访问正式环境的数据(前端问题复现)
        {"old host":"new host"}
    PS:因前端本就发出 old host 请求,所以前端看到请求还是 old host 但真实是请求到 new host.

4. Detección de vencimiento del certificado https

config.ini -> hosts check_ssl

check_ssl = app.xxx.com,web.xxx.com
command:
    ppl.exe s

5. reproducción de API

5.1 Obtener la colección de casos de uso de la interfaz

Forma 1: violinista

1. desc/fiddler.txtCopie y pegue el texto debajo del proyecto, FiddlerScript.

2. Cámbielo para que coincida con la configuración de su propio campo comercial. Es el appdirectorio de ruta absoluta del proyecto. Preste atención al uso de dos identificadores.\\
Insertar descripción de la imagen aquí

Método 2 (recomendado): mitmproxy

1. Cambie config.iniel nombre de dominio de filtrado en el proyecto al nombre de dominio y campo comercial que necesita configurar. Si completa db_url, la información de tráfico se almacenará directamente en la base de datos. 2. Necesita configurar un certificado de proxy, etc. ., consulte la documentación de uso de mitmproxy
Insertar descripción de la imagen aquí
para obtener más detalles.

3. correr

command:
    ppl.exe f

Insertar descripción de la imagen aquí

Los métodos 1 y 2 anteriores obtendrán el archivo txt o lo almacenarán directamente en la base de datos.

Si se basa en el método 2 (mitmproxy), configure db_url para almacenar directamente el tráfico para las pruebas de reproducción.
Insertar descripción de la imagen aquí
1. Obtendrá: ./data/api-xxx.txt o fiddler-xxx.txt

2. Si necesita almacenar el caso de uso en la base de datos, ejecute la línea de comando:

ppl.exe --play=0

Además, es posible que necesite configurar la conexión a la base de datos ./config.ini.db_url. El valor predeterminado essqlite

MySQL:db_url = mysql+pymysql://root:[email protected]:3306/tester?charset=utf8

migración de datos:ppl.exe --move=new_db_url


5.2 Ejecución de pruebas

Las descripciones de los parámetros de la línea de comando (algunas se pueden configurar de forma predeterminada en pytest.ini) son consistentes con el marco de pytest y se agregan los siguientes parámetros:

  1. –env: Consulta los casos de uso de dominio empresarial=ppl y entorno=prueba

      如:--env=ppl,test   
    
  2. –param: Agregar reemplaza el parámetro de versión con 1 o agregar

      如(Windows):--param={\"version\":\"1\"}
    
  3. –file: lee todos los archivos txt en el directorio de la aplicación para la reproducción del tráfico. Consulta la reproducción del tráfico para conocer su uso detallado.

      如:--file=1
    
  4. –play: lee el archivo txt para almacenar el caso de uso.
    Por ejemplo: –play=0

      0:读取txt用例入库
      1:读取db用例进行回放测试
      2:读取txt文件流量回放
      3: 读取阿里云日志流量并入库
    
  5. –init: inicialización de la estructura de la tabla de base de datos, generalmente no es necesaria.
    Por ejemplo: –init=1

Método 1: reproducción del tráfico de archivos txt

ps:不支持下载/上传文件回放,不要将txt文件换行或格式变化哦(只回放API响应码为200)

  1)方式1:默认为app目录下全部txt文件(以下2-3不存在文件时亦是):pytest --file=1
  
  2)方式2:指定app目录下的文件:pytest --file=fiddler_2022-7-31.txt
  
  3)方式3:绝对路径指定文件(注意win下需要\\):pytest --file=E:\\fiddler_2022-7-31.txt
  
  4)方式4:相对路径指定文件:pytest --file=./fiddler_2022-7-31.txt

Método 2: después de almacenar el caso de uso en la base de datos, ejecute la prueba del caso de uso de la base de datos

Debe configurar pytest.ini (recomendado) o config db antes de ejecutar.

Consulte las instrucciones de configuración de 5.6 db o pytest para obtener más detalles.

Configure pytest.ini para asignar la función al caso de uso de la base de datos para ejecutar la prueba de entorno correspondiente.
Insertar descripción de la imagen aquí

ppl.exe --env=domain,env --param={
    
    \"version\":\"1\"}

ps:Windows可以生成allure报告:ppl.exe r (支持替换变量,存储变量,引用变量,响应断言)


5.3 Introducción al posprocesador: http_collect

Extractor de parámetros, el valor predeterminado es tomar el primer valor (admite la extracción de los parámetros de retorno de la respuesta y la interfaz de encabezados).
Consulte la sintaxis de Jsonpath: https://goessner.net/articles/JsonPath

1.Jsonpath distingue entre mayúsculas y minúsculas

1) Obtener el valor de la clave:['key'] ----> {'key':'value'}

2) Obtenga el valor de la clave y cámbiele el nombre:[{'key':'name'}] ----> {'name':'value'}

3) Obtenga el valor de la clave y especifique el enésimo:['key':n] ----> {'key':values[n]}

4) Obtenga el valor de la clave, cámbiele el nombre y especifique la enésima:['key':['name',n]] ----> {'name':values[n]}

5) Sintaxis nativa de Jsonpath:['$.data.key'] ----> {'key':'value'}

6) Sintaxis nativa de Jsonpath y cambio de nombre:[{'$.data.key':'name'}] ----> {'name':'value'}

7) Sintaxis nativa de Jsonpath y especifique la enésima:[{'$.data.key':n}] ----> {'key':values[n]}

8) Sintaxis nativa de Jsonpath y cambie el nombre y especifique el enésimo:[{'$.data.key':['name',n]}] ----> {'name':values[n]}

2. Expresiones regulares

1) Obtenga el valor de la expresión regular y asígnele el nombre env:[{'re':['env','http://(.+?)/']}] ----> {'env':'value'}

2) Obtenga el valor de la expresión regular y asígnele el nombre env y tome el enésimo valor:[{'re':['env','http://(.+?)/', -1]}] ----> {'name':'value'}


5.4 Introducción al uso de aserciones: http_assert

1.Aserción de Jsonpath

1. Caracteres dentro: ["msgId"]

  `实际为:assert "msgId" in response.text`

2. La variable está dentro: ["${msgId}"]

`实际为:assert "${msgId}" in response.text`

2. Igualdad de caracteres: [{"msgId":"123456"}]

`实际为:assert 123456 == json_path(result.json(), 'msgId')`

3. Caracteres dentro u otros: [{"msgId":["123456","in"]}]注:in 可以是== != not in

  `assert 123456 in response.get('msgId')`

4.长度:1 == len(response.get('msgId')):[{“msgId”:[1”,len”]}]

  `assert 1 == len(response.get('msgId'))`
2. Aserción de expresión regular

1. Simplemente escriba la expresión regular directamente, como por ejemplo:[{'re':'http://(.+?)/'}]


5.5 Referencia de variable (asociación parametrizada)

Utilice este sistema y siga la sintaxis de Faker para citar directamente: ${Sintaxis de Faker}

Comenzando con ppl_, es un método de datos generado personalizado.

Para obtener más información sobre Faker, consulte la documentación oficial: https://faker.readthedocs.io/en/stable/locales/zh_CN.html#faker-providers-address
Insertar descripción de la imagen aquí
estructura y explicación de datos del campo. También puede consultar el código. modelo:
Insertar descripción de la imagen aquí

1. Número relacionado:

1) Número de teléfono móvil: ${phone_number}
18520149907

2) Número de identificación: ${ssn}
410622198603154708

2. Relacionado con la fecha y la hora

1) Fecha y hora actuales: ${ppl_now_datetime}
2022-07-02 12:56:58

2) Marca de tiempo actual: ${ppl_time}
1656737818

3) Fecha actual: ${ppl_now_date}
2022-07-02

4) Hora actual: ${ppl_now_time}
12:56:58

5) Fecha y hora de los últimos 7 días: ${ppl_datetime(-7)}
2022-06-25 00:00:00

6) Fecha y hora de los próximos 7 días: ${ppl_datetime(7)}
2022-07-09 23:59:59

7) Año-mes-día aleatorio: ${date}
1996-03-20

8) Aleatorio (hora: minuto: segundo): ${time}
04:52:23

9) Fecha y hora futuras: ${future_datetime(end_date=+7d)}
2022-07-07 16:01:23

10) Fecha y hora pasadas: ${past_datetime(end_date=-7d)}
2022-06-29 13:29:20

3. Nombre relacionado:

1) Nombre: ${nombre}
王凯

2) Nombre (femenino): ${name_female}
戴丽丽

3) Nombre (masculino): ${name_male}
刘荣

4)姓:${apellido}

5) Nombre: ${first_name}

4. Relacionado con la dirección

1) Dirección: ${dirección}
香港特别行政区大冶县上街钟街k座 664713

2) Provincia: ${provincia}
河北省

3) Ciudad: ${ciudad}
长春县

4) Región: ${distrito}
白云

5) Dirección postal: ${street_address}
武汉街D座


5.6 instrucciones de configuración de db o pytest

Utilice la configuración de la tabla de configuración pytest.ini.config testero db, solo configure una.
Se recomienda utilizar pytest.ini

Configuración del entorno de la cuenta

1、pytest.ini 例子(需要压缩json,不可格式化)
    [test]
    tester = {"gray":"gray","Tester":[{"https://blog.csdn.net":{"url":"/qq_42675140","body":{},"method":"GET","collects":["ppl_cookie"]}},{"http://open-ppl-getaway.com":{"Authorization":"Bearer ","key":"nf9vMghQLyEZkeyxxxxx0ln9klsPz","secretx":"ylJhZzwvaa2NxxxsecretlDtNsJSyMh"}}],"filter_code":{},"filter_path":["/user/logout","/user/login"]}
      
  [test]:表示定义的环境 test,可以多个.
  tester:pytest 账号登录/过滤等配置
      1) gray:默认gray就好,一般用于AB测试模型则需要配置.
      2) Tester:登录获取token或cookie初始化,可配置多个登录信息
            collects:表示后置处理器 collect (使用详细查看第三点[后置处理器使用]),用例提取token或cookie作为登录态
      3) filter_code:过滤某些接口响应内容,可不写
      4) filter_path:过滤某些接口url,一般用于过滤登录及退出登录以免执行测试时影响登录态

2、db config如下例子, 直接复制粘贴保存即可(可格式化):
{
    "gray":"gray",
    "Tester":[
        {
            "https://app-xxx.com":{
                "url":"/api/user/login",
                "json":{
                    "mobile":18888888888,
                    "Password":"mVs6NwvIFRgN0aaUo4KZOiW9QZWbKZjqVX1eW9Gr2s4rgZ5atS3ppY39ZlyE37Tb2/zo6YWJV6VJV="
                },
                "method":"POST",
                "collects":[
                    "clienttoken"
                ]
            }
        },
        {
            "https://web-xxx.com":{
                "url":"/api/index.php?r=data/login",
                "data":"user=admin&password=4076f862096d1536b6cac6866e386655=",
                "method":"POST",
                "headers":{
                    "content-Type":"application/x-www-form-urlencoded"
                },
                "collects":[
                    "ppl_cookie"
                ]
            }
        }
    ],
    "filter_code":{
        "$response_key":[
            200,
            "200"
        ]
    },
    "filter_path":[
        "/api/user/logout",
        "/api/user/login"
    ]
}

5.7 mysql y otras afirmaciones

Para ser desarrollado

6. Casos de uso de gestión de páginas web, etc.

Para ser desarrollado

7. cliente de flujos, integrando las funciones anteriores...

Para ser desarrollado

Si tiene alguna sugerencia o pregunta, comuníquese conmigo: https://blog.csdn.net/qq_42675140

Supongo que te gusta

Origin blog.csdn.net/qq_42675140/article/details/128989322
Recomendado
Clasificación