Que Es Allure?

Allure es un framework de reportes de testing de codigo abierto que transforma resultados de tests en reportes HTML ricos e interactivos. Mientras la mayoria de frameworks de testing producen resumenes basicos de pass/fail, Allure crea reportes detallados con pasos de test, screenshots, logs de red, lineas de tiempo, tendencias historicas y fallas categorizadas.

Allure se integra con practicamente todos los frameworks de testing: JUnit, TestNG, Pytest, Jest, Mocha, Playwright, Cypress y mas. Funciona en dos pasos: primero, tus tests generan archivos de resultados Allure durante la ejecucion; segundo, el CLI de Allure genera un reporte HTML a partir de esos archivos.

Por Que Usar Allure?

Los reportes estandar responden una pregunta: cuantos tests pasaron? Allure responde muchas mas:

  • Que hizo exactamente cada test? Ejecucion paso a paso con screenshots
  • Por que fallo? Fallas categorizadas con stack traces y evidencia adjunta
  • Es una falla nueva o un issue conocido? Tendencias historicas y deteccion de tests inestables
  • Que funcionalidades estan afectadas? Tests organizados por feature, story y severidad

Configuracion de Allure

Instalacion

# macOS
brew install allure

# npm (multiplataforma)
npm install -g allure-commandline

Java (JUnit 5 + Maven)

<dependency>
    <groupId>io.qameta.allure</groupId>
    <artifactId>allure-junit5</artifactId>
    <version>2.25.0</version>
    <scope>test</scope>
</dependency>

Python (Pytest)

pip install allure-pytest
pytest --alluredir=allure-results

Anotaciones de Allure

Pasos

@Test
@Description("Verificar que el usuario puede loguearse con credenciales validas")
@Severity(SeverityLevel.CRITICAL)
@Feature("Autenticacion")
@Story("Login")
public void testSuccessfulLogin() {
    openLoginPage();
    enterCredentials("admin@example.com", "password123");
    clickLoginButton();
    verifyDashboardDisplayed();
}

@Step("Abrir la pagina de login")
public void openLoginPage() {
    driver.get(baseUrl + "/login");
}

@Step("Ingresar credenciales: {email}")
public void enterCredentials(String email, String password) {
    driver.findElement(By.id("email")).sendKeys(email);
    driver.findElement(By.id("password")).sendKeys(password);
}

Adjuntos

@Attachment(value = "Screenshot", type = "image/png")
public byte[] takeScreenshot() {
    return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
}

Severidad y Labels

@Severity(SeverityLevel.BLOCKER)
@Feature("Carrito de Compras")
@Story("Agregar al Carrito")
@Epic("E-Commerce")
@Owner("qa-team")
@Link(name = "JIRA-1234", url = "https://jira.example.com/JIRA-1234")

Generando Reportes

# Generar y abrir reporte
allure serve allure-results

# Generar reporte en un directorio
allure generate allure-results -o allure-report --clean

Secciones del Reporte

Dashboard Principal

  • Conteos de Pass/Fail/Broken/Skipped y porcentajes
  • Desglose de severidad de todos los tests
  • Cobertura de funcionalidades
  • Tendencia de duracion de ejecucion de tests
  • Categorias de razones de falla agrupadas

Vistas de Suites y Behaviors

  • Suites: Tests organizados por clase de test y paquete (vista tecnica)
  • Behaviors: Tests organizados por Epic > Feature > Story (vista de negocio)

Configuracion de Categorias

[
  {
    "name": "Defectos de Producto",
    "matchedStatuses": ["failed"],
    "messageRegex": ".*AssertionError.*"
  },
  {
    "name": "Problemas de Infraestructura de Test",
    "matchedStatuses": ["broken"],
    "messageRegex": ".*TimeoutException.*|.*ConnectionRefused.*"
  }
]

Allure en CI/CD

- name: Ejecutar tests
  run: mvn test
  continue-on-error: true

- name: Generar Reporte Allure
  uses: simple-elf/allure-report-action@master
  with:
    allure_results: target/allure-results

Ejemplo en Python (Pytest)

import allure

@allure.feature("Autenticacion")
@allure.story("Login")
@allure.severity(allure.severity_level.CRITICAL)
def test_successful_login(page):
    with allure.step("Abrir pagina de login"):
        page.goto("/login")

    with allure.step("Ingresar credenciales"):
        page.fill("#email", "admin@example.com")
        page.fill("#password", "password123")

    with allure.step("Enviar formulario"):
        page.click("#submit")

    with allure.step("Verificar dashboard"):
        assert page.text_content(".welcome") == "Welcome, Admin"
        allure.attach(page.screenshot(), name="Screenshot", attachment_type=allure.attachment_type.PNG)

Ejercicios

Ejercicio 1: Configuracion de Allure

Agrega dependencias de Allure a un proyecto existente, anota 5 tests con @Step, @Feature, @Story y @Severity, genera un reporte y explora cada seccion.

Ejercicio 2: Categorias e Historial

Crea un archivo categories.json, ejecuta tests dos veces con historial para ver graficos de tendencia, identifica el test mas lento desde la vista Timeline.

Ejercicio 3: Integracion CI/CD

Agrega generacion de reportes Allure a un pipeline CI, configura seguimiento de tendencias historicas, configura publicacion de reportes accesibles via URL.