Referencia de Rust Cargo Test
Estos son los principales bloques de construcción que puedes usar para integrar pruebas de Rust con Allure mediante allure-cargotest.
Macros
#[allure_test]
Formas compatibles:
#[allure_test]#[allure_test(name = "Login works")]#[allure_test(id = "AUTH-1")]#[allure_test(name = "Login works", id = "AUTH-1")]
Usa el macro junto con #[test]:
use allure_cargotest::allure_test;
#[allure_test(name = "Login works", id = "AUTH-1")]
#[test]
fn login_works() {
allure.feature("Authentication");
allure.story("Login with username and password");
}Lo que hace el macro:
- inicializa el reporter usando
ALLURE_RESULTS_DIRotarget/allure-results, - inyecta una fachada
allureen el cuerpo de la prueba, - inicia y detiene el ciclo de vida de la prueba automáticamente,
- aplica las etiquetas predeterminadas descritas en Configuración,
- deriva etiquetas de suite a partir de
module_path!().
Notas de comportamiento:
#[allure_test]actualmente solo admite funciones de prueba síncronas que devuelven(),async fnno está soportado,#[should_panic]está soportado,#[should_panic(expected = "...")]marca la prueba como aprobada solo cuando el mensaje de pánico contiene la subcadena esperada.
#[step]
Formas compatibles:
#[step]#[step(name = "Open login page")]
Usa #[step] en funciones auxiliares que quieras mostrar como pasos en el reporte:
use allure_cargotest::{allure_test, step};
#[step(name = "Open login page")]
fn open_login_page() {
// ...
}
#[allure_test]
#[test]
fn login_works() {
open_login_page();
}Cuando la función se ejecuta dentro de una prueba Allure activa, el adaptador inicia y detiene un paso automáticamente. Fuera de un contexto Allure activo, la función se comporta como una función Rust normal.
API de la fachada en tiempo de ejecución
Dentro de #[allure_test], la fachada allure proporciona métodos para las tareas de reporte más comunes.
Metadatos y etiquetas
allure.description(text)allure.description_html(html)allure.label(name, value)allure.labels([(name, value), ...])allure.owner(value)allure.severity(value)allure.layer(value)allure.tag(value)allure.tags(["smoke", "auth"])allure.id(value)
Ejemplo:
use allure_cargotest::allure_test;
#[allure_test]
#[test]
fn login_works() {
allure.description("Checks that a valid user can sign in.");
allure.owner("John Doe");
allure.severity("critical");
allure.label("microservice", "ui");
allure.tags(["smoke", "auth"]);
}Jerarquías
allure.epic(value)allure.feature(value)allure.story(value)allure.parent_suite(value)allure.suite(value)allure.sub_suite(value)
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");
}Enlaces y parámetros
allure.link(url, Some(name), Some(link_type))allure.links([(url, Some(name), Some(link_type)), ...])allure.issue(name, url)allure.tms(name, url)allure.parameter(name, value)
Ejemplo:
use allure_cargotest::allure_test;
#[allure_test]
#[test]
fn login_works() {
allure.issue("AUTH-123", "https://jira.example.com/browse/AUTH-123");
allure.tms("TMS-456", "https://tms.example.com/cases/TMS-456");
allure.parameter("browser", "firefox");
}Adjuntos
allure.attachment(name, content_type, body)
Ejemplo:
use allure_cargotest::allure_test;
#[allure_test]
#[test]
fn login_works() {
allure.attachment(
"response.json",
"application/json",
br#"{"status":"ok","user":"demo"}"#,
);
}Pasos
allure.step(name)devuelveStepGuardallure.step_with(name, || { ... })allure.log_step(name)allure.log_step_with(name, status, error)allure.step_display_name(name)allure.step_parameter(name, value)
Ejemplos:
use allure_cargotest::{allure_test, Status};
#[allure_test]
#[test]
fn login_works() {
allure.step_with("Open login page", || {
// ...
});
let _guard = allure.step("Submit credentials");
// ...
allure.log_step("Verify the page title");
allure.log_step_with("Check audit log", Some(Status::Failed), Some("entry not found"));
}StepGuard también te permite sobreescribir el estado final del paso antes de que el guard sea descartado:
use allure_cargotest::allure_test;
#[allure_test]
#[test]
fn login_works() {
let _guard = allure.step("Validate response").failed("Unexpected status code");
}Integración manual con CargoTestReporter
Si los macros no son suficientes para tu harness de pruebas, puedes usar CargoTestReporter directamente:
use allure_cargotest::CargoTestReporter;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let reporter = CargoTestReporter::new("target/allure-results")?;
reporter.run_test("login_works", |allure| {
allure.feature("Authentication");
allure.parameter("browser", "firefox");
});
Ok(())
}Métodos útiles:
CargoTestReporter::new(results_dir)run_test(name, |allure| { ... })run_test_with_metadata(test_name, full_name, allure_id, tags, |allure| { ... })run_test_with_result(name, |allure| { ... })is_selected(full_name, allure_id, tags)
Construyendo un adaptador personalizado con allure-rust-commons
Usa allure-rust-commons cuando necesites control de bajo nivel sobre el ciclo de vida:
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"),
);
lifecycle.stop_test_case(Status::Passed, None);
Ok(())
}Los principales tipos de bajo nivel son:
AllureRuntimeAllureLifecycleStartTestCaseParamsFileSystemResultsWriterStatusyStatusDetails- los tipos del modelo exportados desde
allure_rust_commons::model