Integración de capturas de pantalla en Allure Report con Pytest y Playwright
La interpretación de los resultados de las pruebas debe ser rápida y sencilla, permitiendo que la causa raíz de un fallo sea inmediatamente clara sin necesidad de inspeccionar el código, depurar o solicitar asistencia externa.
Para lograr esto, los informes de prueba deben presentar información detallada en un formato conciso y accesible. Incorporar capturas de pantalla es una forma efectiva de proporcionar contexto visual a los fallos de prueba. Esta guía explica cómo capturar capturas de pantalla en Pytest con Playwright e integrarlas en Allure Report para mejorar la legibilidad y el análisis.
1. Preparación
Requisitos previos
Asegúrate de cumplir con los siguientes requisitos previos:
Lista de dependencias
Esta guía utiliza los siguientes paquetes:
Código de ejemplo
El código completo utilizado en esta guía está disponible en https://github.com/allure-examples/guide-pytest-playwright-screenshots.
Configuración
Para ejecutar los ejemplos de esta guía:
- Instala Python
- Instala Allure Report
- Descarga un proyecto nuevo con Pytest desde Allure Start
- Agrega el plugin de Playwright para Pytest a tu proyecto. Por ejemplo, si usas
pip
:
pip install pytest-playwright
2. Capturas de pantalla con Playwright Pytest
Para tomar una captura de pantalla con Playwright Pytest en cualquier momento, usa el método screenshot
proporcionado por el objeto Page
. Para obtener el objeto Page
, puedes utilizar el fixture page
:
def test_example(page):
page.goto("https://playwright.dev/")
try:
assert "Playwright" in page.title()
except AssertionError:
page.screenshot(path="path/to/screenshot.png")
raise
Para tomar una captura de pantalla de un elemento en particular, usa el método screenshot
del objeto Locator
, por ejemplo:
element = page.get_by_role("search") # o como sea que encuentres el elemento
# tomar la captura de pantalla
element.screenshot(path="path/to/screenshot.png")
3. Capturas de pantalla automáticas en caso de fallo
Para tomar capturas de pantalla automáticamente en cada fallo de prueba, configura la opción --screenshot
en only-on-failure
en la configuración de Pytest de tu proyecto. Por ejemplo, si usas pyproject.toml
como archivo de configuración, agrega lo siguiente:
[tool.pytest.ini_options]
...
addopts = [
...
"--screenshot", "only-on-failure"
]
Ahora, cuando una prueba falle, un archivo de captura de pantalla se guardará automáticamente en el directorio de resultados de prueba de tu proyecto. Playwright Pytest elimina y recrea el directorio en cada ejecución de prueba.
4. Integración con Allure Report
Si bien capturar capturas de pantalla es útil para diagnosticar fallos en las pruebas, verlas por separado puede ser ineficiente. Cuando los datos de prueba están dispersos en múltiples ubicaciones, el proceso de identificación y resolución de fallos se vuelve más lento.
Para optimizar este flujo de trabajo, las capturas de pantalla deben adjuntarse directamente a los informes de Allure, asegurando que toda la información relevante de las pruebas esté consolidada en un solo lugar para un análisis y solución de problemas más eficientes.
Allure Report muestra las capturas de pantalla dentro de la prueba en la que fueron tomadas. Allí también se presentan los mensajes de error y otros adjuntos, para que tengas todo lo necesario para analizar los resultados de las pruebas en un solo lugar:
Para adjuntar capturas de pantalla a Allure, usa las funciones allure.attach()
o allure.attach.file()
.
Usa allure.attach.file()
para adjuntar un archivo existente:
import allure
from pathlib import Path
# Adjuntar una captura de una página or de un elemento
def attach_screenshot(pageOrElement, path):
name = Path(path).name
pageOrElement.screenshot(path=path)
allure.attach.file(
path,
name=name,
attachment_type=allure.attachment_type.PNG,
)
Usa allure.attach()
si no necesitas guardar la captura de pantalla en disco:
import allure
# Adjuntar una captura de una página or de un elemento
def attach_screenshot(pageOrElement, name):
allure.attach(
pageOrElement.screenshot(),
name=name,
attachment_type=allure.attachment_type.PNG,
)
TIP
Cuando necesites adjuntar una captura de pantalla recién tomada, es preferible usar la función allure.attach
si es posible. La razón es que cuando guardas una captura de pantalla en el disco, es posible que no esté disponible de inmediato para su lectura debido al almacenamiento en caché del sistema operativo. Si eso sucede, podrías terminar con un archivo vacío adjunto en Allure.
Si también configuras la opción --screenshot
como se describe en la sección Capturas de pantalla automáticas en caso de fallo, Playwright Pytest guardará las capturas de pantalla localmente.
Para adjuntar automáticamente capturas de pantalla a Allure en cada fallo de prueba, puedes agregar un hook en el archivo conftest.py
en el directorio raíz de pruebas de tu proyecto. El hook puede buscar las capturas de pantalla que Playwright Pytest guardó después de las pruebas fallidas y adjuntarlas al informe de Allure. Por ejemplo:
import re
import allure
import pytest
from pathlib import Path
# Una expresión regular para coincidir con los nombres de archivo de las capturas de pantalla tomadas en fallos de prueba
SCREENSHOT_NAME_PATTERN = re.compile(r"^test-failed-\d+\.png$")
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_teardown(item, nextitem):
yield
try:
artifacts_dir = item.funcargs.get("output_path")
if artifacts_dir:
artifacts_dir_path = Path(artifacts_dir)
if artifacts_dir_path.is_dir():
for file in artifacts_dir_path.iterdir():
if file.is_file() and SCREENSHOT_NAME_PATTERN.match(file.name):
allure.attach.file(
str(file),
name=file.name,
attachment_type=allure.attachment_type.PNG,
)
except Exception as e:
print(f"Error taking screenthot: {e}")
5. Otros tipos de adjuntos
Allure Report también puede manejar otros tipos de adjuntos, como texto, tablas, listas de URI o documentos (XML, JSON, YAML). Por ejemplo:
allure.attach(
response_content,
name="response content",
attachment_type=allure.attachment_type.XML
)
Allure Pytest adjunta algunos elementos automáticamente:
- Todo lo enviado a
sys.stdout
, por ejemplo,print(...)
- Todo lo enviado a
sys.stderr
, por ejemplo,print(..., file=sys.stderr)
- Registros de logging, por ejemplo,
logging.warning(...)
Estos resultados se adjuntan al informe como pseudoarchivos:
Si no deseas que todo esto aparezca en el informe, usa la opción --allure-no-capture
.
Allure también te permite adjuntar videos. Puedes consultar la documentación oficial para obtener más información sobre adjuntos con Pytest y tipos de adjuntos.
6. Conclusión
Con Pytest y Playwright, puedes capturar capturas de pantalla en cualquier momento durante tus pruebas o configurar Playwright para que las tome automáticamente en caso de fallos. Allure Report combina estas capturas de pantalla junto con otros adjuntos, como texto, documentos, tablas y videos, en una sola vista, proporcionando datos completos para diagnosticar fallos de prueba de manera eficiente.