Comenzando con Allure JUnit 5
Genera hermosos informes HTML usando Allure Report y tus pruebas de JUnit 5.
INFO
Consulta los proyectos de ejemplo en github.com/allure-examples para ver Allure JUnit 5 (Jupiter) en acción.
Configuración
Para integrar Allure en un proyecto JUnit 5 (Jupiter) existente, necesitas:
- Agregar las dependencias de Allure a tu proyecto.
- Configurar AspectJ para el soporte de las anotaciones
@Step
y@Attachment
. - Designar una ubicación para el almacenamiento de los resultados de Allure.
Agregar dependencias de Allure
<!-- Define la versión de Allure que deseas utilizar mediante la propiedad allure.version -->
<properties>
<allure.version>2.25.0</allure.version>
</properties>
<!-- Añade allure-bom a la gestión de dependencias para garantizar que se utilizan las versiones correctas de todas las dependencias -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-bom</artifactId>
<version>${allure.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- Añade las dependencias necesarias de Allure a la sección de dependencias -->
<dependencies>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-junit5</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
// Define la versión de Allure que deseas utilizar mediante la propiedad allureVersion
val allureVersion = "2.25.0"
// ...
dependencies {
// Importa allure-bom para garantizar que se utilizan las versiones correctas de todas las dependencias
testImplementation(platform("io.qameta.allure:allure-bom:$allureVersion"))
// Añade las dependencias necesarias de Allure a la sección de dependencias
testImplementation("io.qameta.allure:allure-junit5")
}
// Define la versión de Allure que deseas utilizar mediante la propiedad allureVersion
def allureVersion = "2.25.0"
dependencies {
// Importa allure-bom para garantizar que se utilizan las versiones correctas de todas las dependencias
testImplementation platform("io.qameta.allure:allure-bom:$allureVersion")
// Añade las dependencias necesarias de Allure a la sección de dependencias
testImplementation "io.qameta.allure:allure-junit5"
}
Configurar AspectJ
Allure utiliza AspectJ para la funcionalidad de las anotaciones @Step
y @Attachment
. Además, algunas integraciones de frameworks (como allure-assertj) dependen de la integración de AspectJ para funcionar correctamente.
<!-- Define la versión de AspectJ -->
<properties>
<aspectj.version>1.9.21</aspectj.version>
</properties>
<!-- Añade las siguientes opciones a tu maven-surefire-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
</argLine>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
// Define la versión de AspectJ
val aspectJVersion = "1.9.21"
// Define la configuración del agente AspectJ
val agent: Configuration by configurations.creating {
isCanBeConsumed = true
isCanBeResolved = true
}
dependencies {
// Añade la dependencia de aspectjweaver
agent("org.aspectj:aspectjweaver:${aspectJVersion}")
}
// Configura javaagent para la ejecución de pruebas
tasks.test {
jvmArgs = listOf(
"-javaagent:${agent.singleFile}"
)
}
// Define la versión de AspectJ
def aspectJVersion = '1.9.21'
// Define la configuración del agente AspectJ
configurations {
agent {
canBeResolved = true
canBeConsumed = true
}
}
dependencies {
// Añade la dependencia de aspectjweaver
agent "org.aspectj:aspectjweaver:$aspectJVersion"
}
// Configura javaagent para la ejecución de pruebas
test {
jvmArgs = [ "-javaagent:${configurations.agent.singleFile}" ]
}
Especificar la ubicación de los resultados de Allure
Allure, por defecto, guarda los resultados de las pruebas en el directorio raíz del proyecto. Sin embargo, se recomienda almacenar los resultados de las pruebas en el directorio de salida de la compilación.
Para configurar esto, crea un archivo allure.properties
y colócalo en el directorio de recursos de pruebas de tu proyecto, que generalmente se encuentra en src/test/resources
:
allure.results.directory=target/allure-results
allure.results.directory=build/allure-results
allure.results.directory=build/allure-results
Ejecutar pruebas
Ejecuta tus pruebas de JUnit 5 de la misma manera que lo harías normalmente. Por ejemplo:
Para Gradle:
./gradlew test
gradlew test
Para Maven:
./mvnw verify
mvnw verify
Después de ejecutar las pruebas, Allure recogerá los datos de ejecución de las pruebas y los almacenará en el directorio allure-results
. Luego podrás generar un informe HTML a partir de estos resultados utilizando las herramientas de informes de Allure.
Generar un informe
Finalmente, convierte los resultados de las pruebas en un informe HTML. Esto se puede hacer con uno de los siguientes comandos:
allure generate
procesa los resultados de las pruebas y guarda un informe HTML en el directorioallure-report
. Para ver el informe, usa el comandoallure open
.Usa este comando si necesitas guardar el informe para futuras referencias o para compartirlo con tus compañeros.
allure serve
crea el mismo informe queallure generate
, pero lo pone en un directorio temporal y arranca un servidor web local configurado para mostrar el contenido de este directorio. El comando luego abre automáticamente la página principal del informe en un navegador web.Usa este comando si necesitas ver el informe para ti mismo y no necesitas guardarlo.
Escribir pruebas
El adaptador Allure JUnit 5 no solo recopila los datos proporcionados por las características estándar de JUnit 5, 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 JUnit 5 como las de Allure JUnit 5.
Con Allure JUnit 5, puedes:
- proporcionar descripción, enlaces y otros metadatos,
- organizar las 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,
- 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,
- proporcionar información arbitraria del entorno para todo el informe 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 dos formas de asignarlos: mediante una anotación antes del método de prueba o mediante una llamada a un método dentro del cuerpo del método de prueba. La segunda forma se llama "dinámica", porque permite construir cadenas y otros valores en tiempo de ejecución antes de pasarlos a los métodos. Sin embargo, ten en cuenta que se recomienda encarecidamente asignar todos los metadatos lo antes posible. De lo contrario, existe el riesgo de que la prueba falle antes de tener todos los metadatos establecidos, lo cual es malo para la legibilidad del informe de pruebas.
import io.qameta.allure.Description;
import io.qameta.allure.Issue;
import io.qameta.allure.Link;
import io.qameta.allure.Owner;
import io.qameta.allure.Severity;
import io.qameta.allure.TmsLink;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static io.qameta.allure.SeverityLevel.*;
class TestMyWebsite {
@Test
@DisplayName("Test Authentication")
@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.")
@Severity(CRITICAL)
@Owner("John Doe")
@Link(name = "Website", url = "https://dev.example.com/")
@Issue("AUTH-123")
@TmsLink("TMS-456")
void testAuthentication() {
// ...
}
}
import io.qameta.allure.Allure;
import org.junit.jupiter.api.Test;
class TestMyWebsite {
@Test
void testAuthentication() {
Allure.getLifecycle().updateTestCase(result -> result.setName("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.label("severity", "critical");
Allure.label("owner", "John Doe");
Allure.link("Website", "https://dev.example.com/");
Allure.issue("AUTH-123", "https://example.com/issues/AUTH-123");
Allure.tms("TMS-456", "https://example.com/tms/TMS-456");
// ...
}
}
Organizar pruebas
Como se describe en Mejorar la navegación en tu informe de pruebas, Allure admite múltiples formas de organizar las pruebas en estructuras jerárquicas. Allure JUnit 5 proporciona funciones para asignar los campos relevantes a las pruebas, ya sea mediante la adición de anotaciones o de forma "dinámica" (igual que para los campos de metadatos).
Para especificar la ubicación de una prueba en la jerarquía basada en el comportamiento:
import io.qameta.allure.Epic;
import io.qameta.allure.Feature;
import io.qameta.allure.Story;
import org.junit.jupiter.api.Test;
class TestMyWebsite {
@Test
@Epic("Web interface")
@Feature("Essential features")
@Story("Authentication")
void testAuthentication() {
// ...
}
}
import io.qameta.allure.Allure;
import org.junit.jupiter.api.Test;
class TestMyWebsite {
@Test
void testAuthentication() {
Allure.epic("Web interface");
Allure.feature("Essential features");
Allure.story("Authentication");
// ...
}
}
Para especificar la ubicación de una prueba en la jerarquía basada en suites:
import io.qameta.allure.Allure;
import org.junit.jupiter.api.Test;
class TestMyWebsite {
@Test
void testAuthentication() {
Allure.label("parentSuite" "Tests for web interface");
Allure.suite("Tests for essential features");
Allure.label("subSuite", "Tests for authentication");
// ...
}
}
La ubicación de una prueba en la jerarquía basada en paquetes está definida por los nombres completamente calificados de las clases en las que están declaradas, con los prefijos comunes mostrados como paquetes principales.
Dividir una prueba en pasos
Allure JUnit 5 proporciona tres formas de crear pasos y sub-pasos: "pasos anotados", "pasos lambda" y "pasos no-op", consulta la referencia.
import io.qameta.allure.Step;
import org.junit.jupiter.api.Test;
class TestMyWebsite {
@Test
void testAuthentication() {
step1();
step2();
}
@Step("Step 1")
void step1() {
subStep1();
subStep2();
}
@Step("Sub-step 1")
void subStep1() {
// ...
}
@Step("Sub-step 2")
void subStep2() {
// ...
}
@Step("Step 2")
void step2() {
// ...
}
}
import io.qameta.allure.Allure;
import org.junit.jupiter.api.Test;
class TestMyWebsite {
@Test
void testAuthentication() {
Allure.step("Step 1", step -> {
// ...
Allure.step("Sub-step 1");
// ...
Allure.step("Sub-step 2");
});
Allure.step("Step 2", step -> {
// ...
});
}
}
Describir pruebas parametrizadas
Al usar el patrón de pruebas parametrizadas, usa el @Param
o parameter()
de Allure JUnit 5 para agregar los parámetros al informe, consulta la referencia.
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
class TestMyWebsite {
@ParameterizedTest(name = "{displayName} ({argumentsWithNames})")
@ValueSource(strings = {"johndoe", "[email protected]"})
void testAuthentication(String login) {
// ...
}
}
import io.qameta.allure.Allure;
import org.junit.jupiter.api.Test;
class TestMyWebsite {
@Test
void testAuthenticationWithUsername() {
Allure.parameter("login", "johndoe");
// ...
}
@Test
void testAuthenticationWithEmail() {
Allure.parameter("login", "[email protected]");
// ...
}
}
Adjuntar capturas de pantalla y otros archivos
Puedes adjuntar todo tipo de archivos 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 determinado.
Allure JUnit 5 proporciona varias formas de crear un adjunto, tanto desde archivos existentes como generados dinámicamente, consulta la referencia.
import io.qameta.allure.Allure;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
class TestMyWebsite {
@Test
void testAuthentication() throws IOException {
// ...
Allure.attachment("data.txt", "This is the file content.");
try (InputStream is = Files.newInputStream(Paths.get("/path/img.png"))) {
Allure.attachment("image.png", is);
}
}
}
Seleccionar pruebas a través de un archivo de plan de pruebas
Si la variable de entorno ALLURE_TESTPLAN_PATH
está definida y apunta a un archivo existente, JUnit 5 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
./gradlew test
$Env:ALLURE_TESTPLAN_PATH = "testplan.json"
gradlew test
Información del entorno
Para la página principal del informe, puedes recopilar diversas informaciones sobre el entorno en el que se ejecutaron las pruebas.
Por ejemplo, es una buena idea usar esto para recordar las versiones del sistema operativo y de Java. Esto puede ayudar al lector futuro a investigar errores que solo se reproducen en ciertos 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.