Pruebas en Rust: frameworks y herramientas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Pruebas en Rust: frameworks y herramientas



Rust es un lenguaje de programación de sistemas que presta gran atención a la confiabilidad y seguridad del código. El sistema de pruebas integrado permite a los desarrolladores escribir pruebas unitarias, pruebas de integración y pruebas de documentación sin instalar bibliotecas adicionales. Sin embargo, para escenarios complejos —parametrización, generación de datos aleatorios o simulación (mocking)— la comunidad de Rust ha creado potentes frameworks. En este artículo, analizaremos las herramientas clave de pruebas en Rust.



Módulo integrado test



Rust viene con un módulo integrado test, que se activa mediante el atributo #[test]. Para ejecutar las pruebas se usa el comando cargo test. Ejemplo de una prueba unitaria simple:



// src/lib.rspub fn add(a: i32, b: i32) -> i32 {    a + b}

#[cfg(test)]mod tests { use super::*;

#[test] fn test_add() { assert_eq!(add(2, 2), 4); }

#[test] fn test_add_negative() { assert_eq!(add(-1, 1), 0); }}


Capacidades clave del módulo integrado:

  • Atributos: #[test], #[ignore], #[should_panic].
  • Macros de aserción: assert!, assert_eq!, assert_ne!.
  • Pruebas de integración: se colocan en la carpeta tests/ y prueban la API pública.
  • Pruebas de documentación: ejemplos de código en comentarios de documentación, verificados mediante cargo test.


Para la mayoría de los proyectos, esto es suficiente. Pero cuando se requiere parametrización, generación de datos aleatorios o simulación (mocking), entran en juego frameworks especializados.



Framework rstest — pruebas parametrizadas



La biblioteca rstest proporciona un potente mecanismo de parametrización de pruebas, similar a pytest en Python. Permite definir múltiples conjuntos de datos de entrada y resultados esperados sin duplicar código.



Instalación:

[dev-dependencies]rstest = "0.22"


Ejemplo de una prueba parametrizada:



use rstest::rstest;

#[rstest]#[case(1, 2, 3)]#[case(0, 0, 0)]#[case(-1, 1, 0)]fn test_add(#[case] a: i32, #[case] b: i32, #[case] expected: i32) { assert_eq!(add(a, b), expected);}


Capacidades de rstest:

  • Parametrización mediante #[case].
  • Generación de datos aleatorios mediante #[random].
  • Fixtures contextuales mediante #[fixture].
  • Soporte para pruebas asíncronas.


Este framework es especialmente útil al probar funciones matemáticas, analizadores sintácticos (parsers) o algoritmos, donde se necesita verificar múltiples casos límite.



Pruebas basadas en propiedades con proptest



Las pruebas basadas en propiedades (property-based testing) son un método en el que se describen invariantes (propiedades) que deben cumplirse para todos los posibles datos de entrada. La biblioteca proptest genera datos de entrada aleatorios y verifica estas propiedades.



Instalación:

[dev-dependencies]proptest = "1.5"


Ejemplo: verificar que la ordenación conserva la longitud y todos los elementos:



use proptest::prelude::*;

proptest! { #[test] fn test_sort_keeps_elements(mut vec: Vec<i32>) { let original_len = vec.len(); let mut sorted = vec.clone(); sorted.sort(); assert_eq!(sorted.len(), original_len); for item in &vec { assert!(sorted.contains(item)); } }}


Ventajas de proptest:

  • Generación automática de miles de escenarios aleatorios.
  • Minimización (shrink) — cuando una prueba falla, la bi

Recommendations