Primeros pasos con Rust Cargo Test
Genera hermosos reportes HTML usando Allure Report y tus pruebas en Rust.
INFO
El crate principal orientado al usuario es allure-cargotest. Si estás construyendo tu propio adaptador para un runner o framework personalizado, usa allure-rust-commons en su lugar. Ambos crates se encuentran en el repositorio oficial allure-rust.
Configuración
1. Prepara tu proyecto
Asegúrate de tener instalado un toolchain de Rust estable y reciente.
El workspace oficial de
allure-rustestá publicado para Rust 1.74 y versiones más recientes, y usa la edición Rust 2021.Abre una terminal y ve al directorio del proyecto. Por ejemplo:
bashcd /home/user/myprojectInstala Allure Report. El repositorio oficial de
allure-rustdocumenta el flujo de trabajo con la CLI de Allure 3.Agrega el adaptador
allure-cargotest:bashcargo add allure-cargotest --devAnota tus pruebas con
#[allure_test]. También puedes marcar funciones auxiliares con#[step]para que aparezcan como pasos separados en el reporte.rustuse allure_cargotest::{allure_test, step}; #[step] fn open_login_page() { // implementación de tu paso } #[allure_test] #[test] fn login_works() { allure.epic("Web interface"); allure.feature("Authentication"); allure.story("Login with username and password"); allure.parameter("browser", "firefox"); open_login_page(); allure.attachment("page.html", "text/html", "<html>...</html>"); }
2. Ejecutar pruebas
Ejecuta tus pruebas de la misma manera que de costumbre:
cargo testPor defecto, allure-cargotest escribe los resultados en target/allure-results.
Para usar un directorio diferente, establece ALLURE_RESULTS_DIR antes de la ejecución de prueba:
ALLURE_RESULTS_DIR=./allure-results cargo testSi el directorio de resultados ya existe, los nuevos archivos se agregan a los existentes, de modo que un futuro reporte se basará en todos ellos.
3. Generar un reporte
Después de la ejecución de prueba, genera y abre el reporte con la CLI de Allure:
allure generate ./target/allure-results --output ./target/allure-report --clean
allure open ./target/allure-reportSi cambiaste el directorio de resultados con ALLURE_RESULTS_DIR, usa esa ruta en el comando allure generate.
Escribir pruebas
Rust Cargo Test extiende la salida estándar de cargo test con características de reporte más detalladas. Puedes usarlo para:
- agregar descripciones, propietarios, enlaces y otros metadatos,
- organizar las pruebas en jerarquías basadas en comportamiento y en suites,
- dividir la ejecución en pasos anidados,
- describir parámetros y adjuntos,
- ejecutar solo las pruebas seleccionadas mediante un archivo de plan de pruebas.
Agregar metadatos
Dentro de una función marcada con #[allure_test], la macro inyecta una fachada allure que puedes usar para enriquecer el resultado de prueba:
use allure_cargotest::allure_test;
#[allure_test(name = "Login works", id = "AUTH-1")]
#[test]
fn login_works() {
allure.description("This test verifies login with a username and a password.");
allure.owner("John Doe");
allure.tag("smoke");
allure.severity("critical");
allure.issue("AUTH-123", "https://jira.example.com/browse/AUTH-123");
allure.tms("TMS-456", "https://tms.example.com/cases/TMS-456");
}Organizar pruebas
Allure admite jerarquías tanto basadas en comportamiento como en suites. Por ejemplo:
use allure_cargotest::allure_test;
#[allure_test]
#[test]
fn login_works() {
allure.epic("Web interface");
allure.feature("Authentication");
allure.story("Login with username and password");
allure.parent_suite("UI tests");
allure.suite("Authentication");
allure.sub_suite("Positive scenarios");
}Cuando usas #[allure_test], allure-cargotest también deriva automáticamente etiquetas de suite a partir de la ruta del módulo de Rust. Las llamadas explícitas a allure.parent_suite(...), allure.suite(...) o allure.sub_suite(...) sobrescriben las etiquetas sintéticas con el mismo nombre.
Dividir una prueba en pasos
Puedes declarar funciones de paso reutilizables con #[step]:
use allure_cargotest::{allure_test, step};
#[step(name = "Open login page")]
fn open_login_page() {
// ...
}
#[step(name = "Submit credentials")]
fn submit_credentials() {
// ...
}
#[allure_test]
#[test]
fn login_works() {
open_login_page();
submit_credentials();
}También puedes crear pasos directamente desde la API de runtime:
use allure_cargotest::allure_test;
#[allure_test]
#[test]
fn login_works() {
allure.step_with("Open login page", || {
// ...
});
let _guard = allure.step("Check profile page");
// ...
}Agregar parámetros y adjuntos
Los parámetros y adjuntos se almacenan en los resultados de Allure generados y se muestran en el reporte:
use allure_cargotest::allure_test;
#[allure_test]
#[test]
fn login_works() {
allure.parameter("browser", "firefox");
allure.parameter("environment", "staging");
allure.attachment(
"request.json",
"application/json",
br#"{"username":"demo","rememberMe":true}"#,
);
}Seleccionar pruebas mediante un archivo de plan de pruebas
allure-cargotest admite el mecanismo estándar de plan de pruebas de Allure mediante la variable de entorno ALLURE_TESTPLAN_PATH.
Crea un archivo JSON como el siguiente:
{
"version": "1.0",
"tests": [{ "id": "AUTH-1" }, { "selector": "auth::tests::login_works" }]
}Luego ejecuta las pruebas con:
ALLURE_TESTPLAN_PATH=./testplan.json cargo testLas entradas con id coinciden con pruebas anotadas con #[allure_test(id = "...")]. Las entradas con selector coinciden con el nombre completo de la prueba en Rust, incluida su ruta de módulo.
Construir una integración personalizada
Si necesitas integrar Allure con un runner o framework de pruebas personalizado en Rust, usa allure-rust-commons:
cargo add allure-rust-commonsEn ese nivel, creas un writer, inicializas un runtime, inicias un caso de prueba y lo detienes cuando la ejecución termina:
use allure_rust_commons::{AllureRuntime, FileSystemResultsWriter, StartTestCaseParams, Status};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let writer = FileSystemResultsWriter::new("target/allure-results")?;
let runtime = AllureRuntime::new(writer);
let lifecycle = runtime.lifecycle();
lifecycle.start_test_case(
StartTestCaseParams::new("login_works").with_full_name("auth::login_works"),
);
// ... actualiza metadatos, agrega pasos y adjuntos ...
lifecycle.stop_test_case(Status::Passed, None);
Ok(())
}Consulta la Referencia para los principales macros y APIs de runtime, o la Configuración para las variables de entorno admitidas.