Empezando con Allure Pytest
Genera hermosos informes HTML utilizando Allure Report y tus pruebas de pytest.
INFO
Consulta el proyecto de ejemplo en github.com/allure-examples/pytest-pip para ver Allure Pytest en acción.
Configuración
1. Prepara tu proyecto
Estas instrucciones dependen de si ya tienes algunas pruebas o estás empezando un proyecto.
Agregar Allure Pytest a un proyecto existente
Si tienes algunas pruebas de pytest y deseas poder usar Allure Report con ellas:
Instala la herramienta de línea de comandos Allure Report, si aún no está instalada en tu sistema operativo. Ten en cuenta que Allure Report requiere Java, consulta las instrucciones de instalación.
Abre una terminal y ve al directorio del proyecto. Por ejemplo:
bashcd /home/user/myproject
Si es necesario para la configuración de tu sistema, activa el entorno virtual de Python para tu proyecto. Por ejemplo, si el proyecto usa un entorno
venv
, el comando para activarlo podría verse así:bashsource .venv/bin/activate
Este paso no es necesario si estás usando el entorno Python del sistema.
Instala el adaptador Allure Pytest.
bashpip install allure-pytest
Empezando un nuevo proyecto con Allure Pytest
Si estás comenzando un nuevo proyecto que contendrá pruebas de pytest:
Instala la herramienta de línea de comandos Allure Report, si aún no está instalada en tu sistema operativo. Ten en cuenta que Allure Report requiere Java, consulta las instrucciones de instalación.
Crea un directorio para el proyecto.
Abre una terminal y ve al directorio del proyecto. Por ejemplo:
bashcd /home/user/myproject
Si es necesario, crea y activa un entorno virtual de Python para tu proyecto. Por ejemplo, los comandos para crear y activar un entorno
venv
pueden verse así:bashpython -m venv .venv source .venv/bin/activate
Este paso no es necesario si vas a utilizar el entorno Python del sistema en el proyecto.
Escribe tus pruebas, siguiendo la documentación oficial de pytest y, opcionalmente, usando algunas características extendidas proporcionadas por Allure Pytest, consulta Escribir pruebas.
2. Ejecuta las pruebas
Al ejecutar tus pruebas, especifica una ruta para el directorio de resultados de las pruebas en el argumento de línea de comandos --alluredir
. Por ejemplo:
python -m pytest --alluredir allure-results
Esto guardará los datos necesarios en el directorio de resultados de las pruebas. Si el directorio ya existe, los nuevos archivos se agregarán a los existentes, de modo que un futuro informe se basará en todos ellos.
3. Genera un informe
Finalmente, ejecuta Allure para convertir los resultados de las pruebas en un informe HTML. Esto abrirá automáticamente tu navegador para ver el informe.
allure serve allure-results
Reemplaza allure-results
con la ruta al directorio especificado en la configuración outputFolder
del reporter, consulta Configuración.
Hay algunas opciones que pueden afectar cómo se genera el informe. Ejecuta allure --help
para ver la lista completa de opciones.
Escribir pruebas
El adaptador Allure Pytest no solo recopila los datos proporcionados por las características estándar de pytest, sino que también ofrece características adicionales para escribir pruebas aún mejores. Esta sección enumera las formas más destacadas de mejorar tus pruebas, utilizando tanto las características de pytest como las de Allure Pytest.
Con Allure Pytest, puedes:
- proporcionar descripción, enlaces y otros metadatos,
- organizar pruebas en jerarquías,
- dividir la prueba en pasos más pequeños y fáciles de leer pasos de prueba,
- describir los parámetros utilizados al ejecutar pruebas parametrizadas,
- agregar títulos legibles a fixtures,
- hacer que la prueba guarde capturas de pantalla y otros archivos durante la ejecución,
- seleccionar qué pruebas ejecutar a través de un archivo de plan de pruebas.
Especificar descripción, enlaces y otros metadatos
Hay muchos metadatos que puedes agregar a cada prueba para que aparezca en el informe. Consulta la referencia para más detalles.
Para cada uno de los campos de metadatos, hay varias formas de asignarlos.
- Llamar a una función de Allure dentro del cuerpo de la función de prueba. Esta forma se llama “dinámica” porque te permite construir cadenas y otros valores en tiempo de ejecución antes de pasarlos a los métodos.
- Usar una función de Allure como un decorador en la función de prueba o en una clase de prueba.
- Agregar una función de Allure como una marca de pytest a un módulo o un paquete (consulta la sección Marcar clases o módulos completos en la documentación de pytest).
TIP
Si configuras los campos utilizando decoradores o marcas de pytest, luego puedes seleccionar y ejecutar pruebas según algunos campos de metadatos, consulta Opciones que afectan la selección de pruebas.
import allure
@allure.title("Test Authentication")
@allure.description("This test attempts to log into the website using a login and a password. Fails if any error happens.\n\nNote that this test does not test 2-Factor Authentication.")
@allure.tag("NewUI", "Essentials", "Authentication")
@allure.severity(allure.severity_level.CRITICAL)
@allure.label("owner", "John Doe")
@allure.link("https://dev.example.com/", name="Website")
@allure.issue("AUTH-123")
@allure.testcase("TMS-456")
def test_authentication():
...
import allure
def test_authentication():
allure.dynamic.title("Test Authentication")
allure.dynamic.description("This test attempts to log into the website using a login and a password. Fails if any error happens.\n\nNote that this test does not test 2-Factor Authentication.")
allure.dynamic.tag("NewUI", "Essentials", "Authentication")
allure.dynamic.severity(allure.severity_level.CRITICAL)
allure.dynamic.label("owner", "John Doe")
allure.dynamic.link("https://dev.example.com/", name="Website")
allure.dynamic.issue("AUTH-123")
allure.dynamic.testcase("TMS-456")
...
Organizar pruebas
Como se describe en Mejorando la navegación en tu informe de pruebas, Allure admite múltiples formas de organizar las pruebas en estructuras jerárquicas. Allure Pytest proporciona funciones para asignar los campos relevantes a las pruebas ya sea agregando decoradores o marcas o llamando a las funciones “dinámicas” (lo mismo que para los campos de metadatos).
Para especificar la ubicación de una prueba en la jerarquía basada en el comportamiento:
import allure
@allure.epic("Web interface")
@allure.feature("Essential features")
@allure.story("Authentication")
def test_authentication():
...
import allure
def test_authentication():
allure.dynamic.epic("Web interface")
allure.dynamic.feature("Essential features")
allure.dynamic.story("Authentication")
...
Para especificar la ubicación de una prueba en la jerarquía basada en la suite:
import allure
@allure.parent_suite("Tests for web interface")
@allure.suite("Tests for essential features")
@allure.sub_suite("Tests for authentication")
def test_authentication():
...
import allure
def test_authentication():
allure.dynamic.parent_suite("Tests for web interface")
allure.dynamic.suite("Tests for essential features")
allure.dynamic.sub_suite("Tests for authentication")
...
La ubicación de una prueba en la jerarquía basada en el paquete se define por el nombre completamente calificado de las clases y funciones en las que se declaran, con los prefijos comunes mostrados como paquetes principales.
Dividir una prueba en pasos
Allure Pytest proporciona dos formas de crear pasos y sub-pasos: “pasos decorados” y “pasos de contexto”, ambos implementados por allure.step()
.
import allure
def test_example():
steps = Steps()
steps.step1()
steps.step2()
class Steps:
@allure.step("Step 1")
def step1(self):
...
@allure.step("Step 2")
def step2(self):
...
import allure
def test_example():
with allure.step("Step 1"):
...
with allure.step("Step 2"):
...
Describir pruebas parametrizadas
Al utilizar el patrón de pruebas parametrizadas, Allure Pytest agrega automáticamente los valores de los parámetros al informe de la prueba. Allure admite todos los métodos de parametrización de pruebas que admite pytest, incluidas las declaraciones de parámetros para fixtures.
Adicionalmente, puedes:
- incorporar el valor de un parámetro en los títulos de las pruebas, consulta
title()
; - agregar manualmente un pseudo-parámetro, consulta
parameter()
; - sobrescribir el valor de un parámetro con una representación más legible, consulta
parameter()
;
from os.path import basename, expanduser
import allure
import pytest
@pytest.mark.parametrize("login", [
"johndoe",
"[email protected]",
])
def test_authentication(login):
...
def test_authentication_with_empty_login():
allure.dynamic.parameter("login", "(empty)")
...
@pytest.mark.parametrize("ssh_key", [
expanduser("~/.ssh/id_rsa1"),
expanduser("~/.ssh/id_rsa2"),
expanduser("~/.ssh/id_rsa3"),
])
def test_authentication_with_ssh_key(ssh_key):
allure.dynamic.parameter("ssh_key", basename(ssh_key))
...
Describir fixtures
El concepto de fixtures de pytest proporciona una manera para que cada prueba defina las características que requiere simplemente especificando los argumentos de la función con sus nombres. Algunas fixtures son proporcionadas por pytest mismo, otras pueden ser proporcionadas por bibliotecas adicionales o tu propio código. Consulta la documentación de pytest para más detalles.
Al mostrar una prueba en un informe de prueba, Allure muestra las operaciones relacionadas con las fixtures de manera similar a como muestra los pasos de prueba. Para facilitar la comprensión del propósito de una fixture, puedes especificar su título usando el decorador @allure.title()
.
import allure
import pytest
@pytest.fixture()
@allure.title("Prepare for the test")
def my_fixture():
... # set up
yield
... # tear down
def test_with_my_fixture(my_fixture):
...
Adjuntar capturas de pantalla y otros archivos
Puedes adjuntar cualquier tipo de archivo a tu informe de Allure. Por ejemplo, una forma popular de hacer que un informe sea más fácil de entender es adjuntar una captura de pantalla de la interfaz de usuario en un momento específico. Para hacerlo, usa allure.attach()
o allure.attach.file()
.
import allure
from pathlib import Path
def test_attach(page):
page.goto("https://example.com/")
png_bytes = page.screenshot()
allure.attach(
png_bytes,
name="full-page",
attachment_type=allure.attachment_type.PNG
)
def test_attach_file(page):
page.goto("https://example.com/")
png_bytes = page.screenshot()
Path("full-page.png").write_bytes(png_bytes)
allure.attach.file(
"full-page.png",
name="full-page",
attachment_type=allure.attachment_type.PNG
)
Por defecto, Allure Pytest agrega los siguientes datos como pseudo-archivos adjuntos:
Nombre del adjunto | Contenido |
---|---|
stdout | Todos los datos que se escribieron en sys.stdout , por ejemplo, a través de print(...) . |
stderr | Todos los datos que se escribieron en sys.stderr , por ejemplo, a través de print(..., file=sys.stderr) . |
log | Todos los datos que se registraron en el mecanismo de registro estándar, por ejemplo, a través de logging.debug(...) . |
Este comportamiento se puede desactivar mediante la opción --allure-no-capture
.
Seleccionar pruebas mediante un archivo de plan de pruebas
Si la variable de entorno ALLURE_TESTPLAN_PATH
está definida y apunta a un archivo existente, pytest solo ejecutará las pruebas listadas en este archivo.
Aquí tienes un ejemplo de cómo ejecutar pruebas según un archivo llamado testplan.json
:
export ALLURE_TESTPLAN_PATH=testplan.json
python -m pytest
$Env:ALLURE_TESTPLAN_PATH = "testplan.json"
python -m pytest
Información del entorno
Para la página principal del informe, puedes recopilar diversa información sobre el entorno en el que se ejecutaron las pruebas.
Por ejemplo, es una buena idea usar esto para recordar la versión del sistema operativo y la versión de Python. Esto puede ayudar al lector futuro a investigar errores que solo son reproducibles en algunos entornos.
Para proporcionar información del entorno, coloca un archivo llamado environment.properties
en el directorio allure-results
después de ejecutar las pruebas. Consulta el ejemplo en Archivo de entorno.
Ten en cuenta que esta función debe usarse para propiedades que no cambian para todas las pruebas en el informe. Si tienes propiedades que pueden ser diferentes para diferentes pruebas, considera usar Pruebas parametrizadas.