cargo-nextest - Ejecutor de Pruebas Rust de Nueva Generación Hoja de Trucos
cargo-nextest es un ejecutor de pruebas de nueva generación para Rust. Su diferencia arquitectónica fundamental de cargo test es que ejecuta cada prueba en su propio proceso, lo que da verdadero aislamiento (una prueba no puede corromper el estado global de otra), mejor paralelismo y la capacidad de informar una prueba que bloquea el proceso en lugar de perder toda la ejecución. En la práctica es típicamente 2–3x más rápido que cargo test en suites grandes, con salida mucho más limpia, detección de pruebas inestables y particionamiento para sharding de CI.
Instalación
| Método | Comando |
|---|
| Precompilado (más rápido) | cargo install cargo-nextest --locked |
| Binary | descarga desde los releases de nextest |
| macOS (Homebrew) | brew install cargo-nextest |
| Verificar | cargo nextest --version |
Uso Básico
| Comando | Descripción |
|---|
cargo nextest run | Ejecutar todas las pruebas |
cargo nextest run -p mycrate | Un paquete |
cargo nextest run test_name | Filtrar por substring |
cargo nextest list | Listar pruebas sin ejecutar |
cargo nextest run --release | Perfil release |
cargo nextest run --no-fail-fast | Seguir después de fallos |
Filtrado (Filtersets)
nextest tiene un lenguaje de expresión para seleccionar pruebas.
| Expresión | Selecciona |
|---|
-E 'test(auth)' | Pruebas cuyo nombre coincida auth |
-E 'package(mycrate)' | Todas las pruebas en un paquete |
-E 'kind(lib)' | Solo pruebas lib (unitarias) |
-E 'binary(integration)' | Un binario de prueba específico |
-E 'test(a) + test(b)' | Unión |
-E 'package(x) - test(slow)' | Diferencia |
# Ejecutar pruebas de integración para un crate, excluyendo las lentas
cargo nextest run -E 'package(api) and kind(test) - test(slow)'
Detección de Pruebas Inestables
# Reintentar fallos hasta 3 veces; pruebas que pasan en reintento se marcan FLAKY
cargo nextest run --retries 3
| Config | Efecto |
|---|
--retries N | Reintentar pruebas fallidas N veces |
| Reportado como FLAKY | Pasó solo después de un reintento |
| Overrides por prueba | Configurar reintentos para pruebas específicas |
Esta distinción importa: una prueba inestable es un problema diferente de una prueba fallida, y nextest lo expone explícitamente en lugar de ocultarlo detrás de una re-ejecución.
Configuración
# .config/nextest.toml
[profile.default]
retries = 0
fail-fast = false
slow-timeout = { period = "30s", terminate-after = 2 }
[profile.ci]
retries = 2
failure-output = "immediate-final"
status-level = "skip"
[[profile.default.overrides]]
filter = 'test(integration)'
threads-required = 2
| Setting | Propósito |
|---|
retries | Conteo de reintento predeterminado |
slow-timeout | Flag/matar pruebas excediendo duración |
threads-required | Reservar capacidad para pruebas pesadas |
failure-output | Cuándo imprimir detalles de fallo |
| Perfiles | cargo nextest run -P ci |
Sharding de CI
# Dividir la suite en 4 máquinas de CI
cargo nextest run --partition count:1/4 # en runner 1
cargo nextest run --partition count:2/4 # en runner 2
| Modo | Divide por |
|---|
count:N/M | Round-robin por conteo de pruebas |
hash:N/M | Hash estable (misma prueba → mismo shard) |
Salida y Reporte
| Opción | Efecto |
|---|
--status-level all | Mostrar estado de cada prueba |
--failure-output immediate | Imprimir fallos mientras suceden |
--message-format libtest-json | Salida legible para máquina |
--profile ci | Usar configuraciones ajustadas para CI |
| Salida JUnit | Configurar en nextest.toml para reporte de CI |
Limitaciones
| No soportado | Por qué |
|---|
| Doctests | Ejecutar separadamente con cargo test --doc |
#[bench] | Usar criterion en su lugar |
| Algunos flags de libtest | Semántica de ejecutor diferente |
Un patrón común de CI es cargo nextest run && cargo test --doc.
nextest vs cargo test
| Aspecto | cargo nextest | cargo test |
|---|
| Modelo de proceso | Uno por prueba | Uno por binario |
| Aislamiento | Fuerte | Compartido dentro de binario |
| Velocidad | 2–3x más rápido típico | Línea base |
| Detección flaky | Integrada | Ninguna |
| Sharding de CI | Integrado | Manual |
| Doctests | No | Sí |
Recursos