Patrones de Pruebas Rust
Patrones completos de pruebas en Rust para escribir pruebas confiables y mantenibles siguiendo la metodología TDD.
Cuándo Usar
- Escribir nuevas funciones, métodos o traits en Rust
- Agregar cobertura de pruebas a código existente
- Crear benchmarks para código con requisitos de rendimiento
- Implementar pruebas basadas en propiedades para validación de entrada
- Seguir el flujo de trabajo TDD en proyectos Rust
Cómo Funciona
- Identificar el código objetivo — Encontrar la función, trait o módulo a probar
- Escribir una prueba — Usar
#[test]en un módulo#[cfg(test)], rstest para pruebas parametrizadas, o proptest para pruebas basadas en propiedades - Mockear dependencias — Usar mockall para aislar la unidad bajo prueba
- Ejecutar pruebas (ROJO) — Verificar que la prueba falla con el error esperado
- Implementar (VERDE) — Escribir el código mínimo para que pase
- Refactorizar — Mejorar mientras se mantienen las pruebas en verde
- Verificar cobertura — Usar cargo-llvm-cov, objetivo 80%+
Flujo de Trabajo TDD en Rust
El Ciclo ROJO-VERDE-REFACTORIZAR
TDD Paso a Paso en Rust
Pruebas Unitarias
Organización de Pruebas a Nivel de Módulo
Macros de Aserción
Pruebas de Errores y Panics
Probar Retornos de Result
Probar Panics
Pruebas de Integración
Estructura de Archivos
Escribir Pruebas de Integración
Pruebas Async
Con Tokio
Patrones de Organización de Pruebas
Pruebas Parametrizadas con rstest
Helpers de Prueba
Pruebas Basadas en Propiedades con proptest
Pruebas de Propiedades Básicas
Estrategias Personalizadas
Mocking con mockall
Mocking Basado en Traits
Pruebas de Documentación
Documentación Ejecutable
Benchmarks con Criterion
Cobertura de Pruebas
Ejecutar Cobertura
Objetivos de Cobertura
Comandos de Prueba
Buenas Prácticas
HACER:
- Escribir pruebas PRIMERO (TDD)
- Usar módulos
#[cfg(test)]para pruebas unitarias - Probar comportamiento, no implementación
- Usar nombres de prueba descriptivos que expliquen el escenario
- Preferir
assert_eq!sobreassert!para mejores mensajes de error - Usar
?en pruebas que retornanResultpara salida de errores más limpia - Mantener las pruebas independientes — sin estado mutable compartido
NO HACER:
- Usar
#[should_panic]cuando se puede probarResult::is_err() - Mockear todo — preferir pruebas de integración cuando sea factible
- Ignorar pruebas inestables — corregirlas o ponerlas en cuarentena
- Usar
sleep()en pruebas — usar canales, barreras otokio::time::pause() - Omitir las pruebas de rutas de error
Integración con CI
Recuerda: Las pruebas son documentación. Muestran cómo debe usarse tu código. Escríbelas con claridad y mantenlas actualizadas.

