Pruebas

🧪 Guía Completa de Testing en Stellar Soroban

🔍 ¿Por qué necesitamos tests? (detallado)

🛡️ Prevención de bugs críticos: detecta errores en lógica de negocio antes de deployment que podrían resultar en pérdida de fondos o estados inconsistentes. 🎯 Validación de edge cases: simula condiciones extremas (overflow, underflow, fondos insuficientes) para asegurar comportamiento robusto. 💰 Protección de inversión: evita costos de re-deployment y pérdida de confianza por bugs en mainnet. 🔄 Refactoring seguro: permite cambiar implementaciones manteniendo garantías de comportamiento. 🧪 Simulación de ataques: prueba vectores de ataque conocidos (reentrancy, front-running, privilege escalation) de forma controlada.

🌟 ¿Qué ofrece Soroban para testing? (explicación técnica)

📦 soroban_sdk::testutils: módulo con herramientas para crear entornos de prueba aislados y mockear comportamientos. 🏗️ Env::default(): crea un entorno de testing limpio con ledger simulado, storage independiente y control total sobre el tiempo. 👤 MockAuth: permite simular firmas y autorizaciones sin claves privadas reales. 📊 Budget tracking: monitorea consumo de CPU y memoria durante tests para optimizar gas costs. 🎭 Address generation: crea direcciones determinísticas para tests reproducibles.

🔧 Herramientas y conceptos clave (más allá de la sintaxis)

Env::default() — qué hace y efectos

  • Crea un entorno aislado donde cada test ejecuta independientemente

  • Simula un ledger con timestamp, sequence numbers y storage limpio

  • Permite control sobre authorizaciones y mock data

  • Úsalo siempre al inicio de cada función de test

MockAuth patterns

  • MockAuth::authorize(): simula que una dirección específica autorizó la transacción

  • MockAuthInvoke: para casos complejos con múltiples contratos

  • Cuidado: solo para testing; en mainnet require_auth() usa firmas reales

Testing strategies

  • Unit tests: funciones individuales con inputs específicos

  • Integration tests: flujos completos entre múltiples funciones

  • Fuzzing: inputs aleatorios para encontrar casos no contemplados

  • Attack simulation: reproduce vectores de ataque conocidos

Error handling validation

  • Usa should_panic o assert!(result.is_err()) para validar fallos esperados

  • Verifica que error codes específicos se generen correctamente

  • Simula condiciones de falla (fondos insuficientes, permisos incorrectos)

📋 Estrategias y patrones prácticos (con por qué y cuándo usarlas)

Arrange-Act-Assert pattern

  • Arrange: configura estado inicial (addresses, balances, roles)

  • Act: ejecuta la función bajo prueba

  • Assert: verifica resultados esperados

Test data management

  • Usa direcciones determinísticas para reproducibilidad

  • Crea helpers para setup común (inicializar contratos, crear usuarios)

  • Mantén tests independientes — no dependas de estado previo

Mocking strategies

  • Mock external contracts durante unit tests

  • Simula condiciones de red (timeouts, failures) en integration tests

  • Usa MockAuth para probar flujos sin manejar claves privadas

Performance testing

  • Mide budget consumption para optimizar gas costs

  • Prueba límites de storage y memoria

  • Valida que operaciones batch no excedan límites de transacción

💡 Ejemplos Prácticos — Código + explicaciones detalladas (línea a línea)

En proceso...

Last updated

Was this helpful?