En el artículo anterior sobre variables en HttpRunner 3.x, explicamos cómo las variables son útiles para relaciones "uno a uno" entre parámetros y valores.
Sin embargo, cuando necesitamos múltiples valores para una variable, como varias combinacinoes de nombre de usuario y contraseña para pruebas de inicio de sesión, no es práctico crear un caso de prueba para cada combinación. En estos escenarios, necesitamos utilizar la palabra clave parameters.
Parametrización: muchos a muchos (y muchos a uno)
Especificación directa de parámetros
Importación desde CSV (rutas relativas y absolutas)
En formato yml se pueden usar reltas relativas o absolutas
En pytest solo funcionan rutas absolutas (las reltas relativas causan errores, aún no se ha encontrado una solución)
Parametrización: uno a uno
【Parametrización: muchos a muchos (muchos a uno es equivalente)】
I. Especificación directa de lista de parámetros:
Este es el método más simple y fácil de usar, adecuado para listas de parámetros pequeñas.
【Casos de prueba en formato yml】
config:
name: "Pruebas de sistema"
parameters:
usuario_id: [1001, 2002]
sorteo_id: [55, 88]
nombre_usuario: ["admin", "test"]
base_url: "https://lottery.example.com"
verify: False
teststeps:
-
name: "Prueba de API /lotteryTest.php"
request:
method: GET
url: /lotteryTest.php
params:
usuario_id: $usuario_id
sorteo_id: $sorteo_id
nombre_usuario: $nombre_usuario
validate:
- eq : ["status_code", 200]
- eq : ["body.status", 1]
Donde los parámetros con asteriscos son valores correctos y el nombre de usuario puede ser cualquiera. La combinación anterior genera 8 escenarios de prueba:
[1001,55,admin] [1001,55,test] [1001,88,admin] [1001,88,test]
[2002,55,admin] [2002,55,test] [2002,88,admin] [2002,88,test]
El resultado de la ejecución es el siguienet:
【Casos de prueba en formato pytest】
# NOTA: Generado por HttpRunner v3.1.3
# DESDE: testcases/prueba_sistema.yml
import pytest
from httprunner import Parameters
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
class TestCasePruebaSistema(HttpRunner):
@pytest.mark.parametrize(
"parametro",
Parameters(
{"usuario_id": [1001, 2002], "sorteo_id": [55, 88], "nombre_usuario": ["admin", "test"]}
),
)
def test_inicio(self, parametro):
super().test_inicio(parametro)
config = (
Config("Pruebas de sistema").base_url("https://lottery.example.com").verify(False)
)
teststeps = [
Step(
RunRequest("Prueba de API /lotteryTest.php")
.get("/lotteryTest.php")
.with_params(
**{
"usuario_id": "$usuario_id",
"sorteo_id": "$sorteo_id",
"nombre_usuario": "$nombre_usuario",
}
)
.validate()
.assert_equal("status_code", 200)
.assert_equal("body.status", 1)
),
]
if __name__ == "__main__":
TestCasePruebaSistema().test_inicio()
Luego se ejecuta utilizando pytest
El resultado de la ejecución es el siguiente:
II. Importación desde CSV
1. Referenciar archivos CSV externos, ubicados en el mismo nivel que debugtalk.py, es decir, en el directorio raíz del proyecto (también se puede especificar una ruta relativa en este directorio, como data/*.csv)
2. Un CSV solo debe almacenar un campo<br></br><br></br>3. Los nombres de campo en el archivo CSV deben coincidir con los nombres reales
1) Archivo CSV ubicado en el mismo nivel que debugtalk.py
Al mismo tiempo, en PyCharm se debe poder ver este archivo CSV
En los archivos de casos de prueba en formato YAML/JSON, se puede hacer referencia al archivo CSV utilizando la función parameterize integrada (que se puede abreviar como P)
Sintaxis para referenciar archivo CSV: ${P(nombre_archivo.csv)}
【Formato yml】
config:
name: "Pruebas de sistema"
parameters:
usuario_id: ${parameterize(usuario_id.csv)}
sorteo_id: ${parameterize(sorteo_id.csv)}
nombre_usuario: ["admin", "test"]
base_url: "https://lottery.example.com"
verify: False
【Formato pytest】
Al usar archivos CSV en formato pytest, el CSV debe almacenarse en el mismo directorio que el caso de prueba; de lo contrario, se producirá un error (o se puede usar una ruta absoluta, como se explicará a continuación)
@pytest.mark.parametrize(
"parametro",
Parameters(
{
"usuario_id": "${parameterize(usuario_id.csv)}",
"sorteo_id": "${parameterize(sorteo_id.csv)}",
"nombre_usuario": ["admin", "test"],
}
),
)
2) Si el archivo CSV usa ruta relativa:
【Formato yml】
La referencia es la siguiente:
config:
name: "Pruebas de sistema"
parameters:
usuario_id: ${parameterize(datos/usuario_id.csv)}
sorteo_id: ${parameterize(datos/sorteo_id.csv)}
nombre_usuario: ["admin", "test"]
base_url: "https://lottery.example.com"
verify: False
El resultado de la ejecución también es normal!!!
【Formato pytest】
En formato pytest se debe usar ruta absoluta:
@pytest.mark.parametrize(
"parametro",
Parameters(
{
"usuario_id": "${parameterize(/Users/usuario/Documents/pruebas/httprunner/testHttprunner/miproyecto/datos/usuario_id.csv)}",
"sorteo_id": [55, 88],
"nombre_usuario": ["admin", "test"],
}
),
)
def test_inicio(self, parametro):
super().test_inicio(parametro)
Resultado de ejecución:
--------------------------------------------------------------------------
--------------------------------------------------------------------------
【Parametrización: uno a uno】
El archivo CSV es el siguiente
El objetivo es tener dos conjuntos de parámetros relacionados
[1001,55,admin] [2002,88,test]
Para relacionar los parámetros, se utiliza "-" como conecotr
usuario_id-sorteo_id-nombre_usuario: ${parameterize(datos/relacionado.csv)}<br></br><br></br><strong>【Formato yml】</strong>
config:
name: "Pruebas de sistema"
parameters:
usuario_id-sorteo_id-nombre_usuario: ${parameterize(datos/relacionado.csv)}
base_url: "https://lottery.example.com"
verify: False
teststeps:
-
name: "Prueba de API /lotteryTest.php"
request:
method: GET
url: /lotteryTest.php
params:
usuario_id: $usuario_id
sorteo_id: $sorteo_id
nombre_usuario: $nombre_usuario
validate:
- eq : ["status_code", 200]
- eq : ["body.status", 1]
Resultado de ejecución:
Dos conjuntos de parámetros equivalen a dos casos de prueba
**【Formato pytest】**siguiente (usando ruta absoluta):
# NOTA: Generado por HttpRunner v3.1.3
# DESDE: testcases/prueba_relacionada.yml
import pytest
from httprunner import Parameters
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
class TestCaseRelacionada(HttpRunner):
@pytest.mark.parametrize(
"parametro",
Parameters({"usuario_id-sorteo_id-nombre_usuario": <br></br><br></br> "${parameterize(/Users/usuario/Documents/pruebas/httprunner/testHttprunner/miproyecto/datos/relacionado.csv)}"}),<br></br> )
<em>def test_inicio(self, parametro): super().test_inicio(parametro) config = ( Config("Pruebas de sistema").base_url("https://lottery.example.com").verify(False) ) teststeps = [ Step( RunRequest("Prueba de API /lotteryTest.php") .get("/lotteryTest.php") .with_params( **{ "usuario_id": "$usuario_id", "sorteo_id": "$sorteo_id", "nombre_usuario": "$nombre_usuario", } ) .validate() .assert_equal("status_code", 200) .assert_equal("body.status", 1) ), ] if __name__ == "__main__": TestCaseRelacionada().test_inicio()</em>
Resultado de ejecución: