En Rust no existe un mecanismo integrado de setup y teardown para pruebas, a diferencia de frameworks como Jest o pytest. Esto complica las pruebas de integración, en las que conviene aprovisionar infraestructura real (bases de datos, brokers de mensajes) y reutilizarla entre tests. Como, además, Rust ejecuta por defecto las pruebas en paralelo, gestionar estado compartido resulta engorroso.
La solución propuesta se apoya en RAII, el patrón de adquisición de recursos en la inicialización. RAII asocia el ciclo de vida de un recurso al de un objeto en memoria y lo libera automáticamente al ejecutar el trait Drop. El artículo muestra cómo aprovecharlo para gestionar contenedores Docker dentro de los tests: al crear un struct que envuelve el contenedor y definir su Drop, el contenedor se detiene y elimina cuando el objeto sale de ámbito, sin código manual de limpieza.
El reto técnico es que detener un contenedor es una operación asíncrona, y async drop todavía es una característica nightly en desarrollo. El texto recurre a un helper de la crate testcontainers-rs que lanza la limpieza en otro hilo y bloquea el drop hasta que termina. La crate testcontainers-rs, construida sobre bollard (cliente Docker), ofrece además el trait Image para definir imágenes y la posibilidad de centralizar toda la infraestructura en un struct TestEnv.
El post incluye un ejemplo realista, una pequeña aplicación de analítica con dos consumidores RabbitMQ, un servidor HTTP y una capa de caché Redis, para demostrar cómo aislar las pruebas y permitir su ejecución en paralelo sin interferencias.
