ML Engine Updates: - Updated BTCUSD with Polygon API data (2024-2025): 215,699 new records - Re-trained all ML models: Attention (R²: 0.223), Base, Metamodel (87.3% confidence) - Backtest results: +176.71R profit with aggressive_filter strategy Documentation Consolidation: - Created docs/99-analisis/_MAP.md index with 13 new analysis documents - Consolidated inventories: removed duplicates from orchestration/inventarios/ - Updated ML_INVENTORY.yml with BTCUSD metrics and training results - Added execution reports: FASE11-BTCUSD, correction issues, alignment validation Architecture & Integration: - Updated all module documentation with NEXUS v3.4 frontmatter - Fixed _MAP.md indexes across all folders - Updated orchestration plans and traces Files: 229 changed, 5064 insertions(+), 1872 deletions(-) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
6.4 KiB
6.4 KiB
| id | title | type | project | version | updated_date |
|---|---|---|---|---|---|
| ADR-004-testing | Estrategia de Testing | Documentation | trading-platform | 1.0.0 | 2026-01-04 |
ADR-003: Estrategia de Testing
Estado: Aceptado Fecha: 2025-12-06 Decisores: Tech Lead, Arquitecto Relacionado: ADR-001, ADR-002
Contexto
Trading Platform maneja datos financieros críticos y predicciones de ML que afectan decisiones de inversión. Necesitamos:
- Confiabilidad: Trading con dinero real requiere alta confianza en el código
- Regression Prevention: Nuevas features no deben romper funcionalidades existentes
- Velocidad de Desarrollo: Tests rápidos para no frenar el MVP (8 semanas)
- Coverage Meaningful: No solo alcanzar %, sino testear lógica crítica
- Múltiples Tecnologías: Frontend (React), Backend (Express), ML (Python)
El equipo tiene experiencia con Jest, Vitest y Pytest en proyectos previos.
Decisión
Testing Tools por Aplicación
| App | Framework | Justificación |
|---|---|---|
| Frontend | Vitest + React Testing Library | Nativo para Vite, más rápido que Jest |
| Backend | Jest + Supertest | Estándar de Node.js, buena integración |
| ML Engine | Pytest + TestClient | Estándar Python, fixtures poderosos |
| E2E | Playwright | Cross-browser, auto-wait, debugging |
Coverage Targets
frontend:
statements: 70%
branches: 65%
functions: 70%
lines: 70%
backend:
statements: 80%
branches: 75%
functions: 80%
lines: 80%
ml-engine:
statements: 75%
branches: 70%
functions: 75%
lines: 75%
Testing Pyramid
E2E (5%)
──────────────
Integration (25%)
─────────────────────
Unit Tests (70%)
──────────────────────────
Estructura de Tests
apps/frontend/
src/
components/
Button/
Button.tsx
Button.test.tsx # Co-located unit tests
__tests__/
integration/ # Integration tests
auth-flow.test.tsx
apps/backend/
src/
routes/
auth.routes.ts
auth.routes.test.ts # Co-located tests
__tests__/
integration/
api.test.ts
apps/ml-engine/
tests/
unit/ # Unit tests
integration/ # Integration tests
conftest.py # Pytest fixtures
tests/e2e/ # E2E en root del monorepo
auth.spec.ts
trading.spec.ts
Test Scripts
{
"scripts": {
"test": "npm run test --workspaces",
"test:unit": "npm run test:unit --workspaces",
"test:integration": "npm run test:integration --workspaces",
"test:e2e": "playwright test",
"test:coverage": "npm run test:coverage --workspaces",
"test:watch": "npm run test:watch -w apps/frontend"
}
}
Consecuencias
Positivas
- Fast Feedback: Vitest en frontend es ~10x más rápido que Jest
- Type Safety: Tests en TypeScript previenen errores de tipos
- Confidence: 80% coverage en backend protege lógica crítica
- Developer Experience: Watch mode + HMR para tests instantáneos
- CI Pipeline: Tests paralelos por workspace
- Debugging: Playwright trace viewer para E2E failures
- Consistent Tools: Misma API de assertions (expect) en todos los tests
Negativas
- Múltiples Frameworks: Equipo debe conocer Vitest, Jest y Pytest
- CI Time: Tests completos pueden tardar 5-10 min
- Flaky E2E: Playwright tests pueden fallar por timing issues
- Maintenance: Tests también requieren refactoring
- Learning Curve: React Testing Library requiere pensar en "user behavior"
Riesgos y Mitigaciones
| Riesgo | Mitigación |
|---|---|
| Tests lentos en CI | Paralelización + caching de dependencias |
| Flaky E2E tests | Retry logic (3 intentos) + auto-wait de Playwright |
| Low coverage | Pre-commit hook que bloquea < 70% |
| Mocks complejos | Usar MSW para mock de API requests |
Alternativas Consideradas
1. Jest para Todo (Frontend + Backend)
- Pros: Una sola herramienta, configuración compartida
- Contras: Más lento en frontend, no nativo para Vite
- Decisión: ❌ Descartada - Vitest es superior para proyectos Vite
2. Cypress para E2E
- Pros: Developer-friendly, time-travel debugging
- Contras: Solo Chrome, más lento que Playwright
- Decisión: ❌ Descartada - Playwright es más rápido y multi-browser
3. Coverage al 100%
- Pros: Máxima confianza
- Contras: Tiempo de desarrollo excesivo, diminishing returns
- Decisión: ❌ Descartada - 70-80% es balance óptimo para MVP
4. Solo E2E Tests (Testing Trophy)
- Pros: Tests que cubren flujos reales
- Contras: Lentos, difíciles de debuggear, frágiles
- Decisión: ❌ Descartada - Necesitamos pirámide balanceada
5. TDD Estricto
- Pros: Diseño guiado por tests
- Contras: Ralentiza MVP, no todo el equipo tiene experiencia
- Decisión: ❌ Descartada - TDD opcional, no obligatorio
Testing de Componentes Críticos
Backend
// ✅ MUST TEST
- Authentication & Authorization
- Payment processing (Stripe)
- ML predictions API
- Database transactions
- Rate limiting
// ⚠️ SHOULD TEST
- Validation middleware
- Error handlers
- Email/SMS services
// ❌ SKIP
- Trivial getters/setters
- Type definitions
Frontend
// ✅ MUST TEST
- Forms con validación
- Trading dashboard calculations
- Chart data transformations
- Authentication flows
// ⚠️ SHOULD TEST
- Hooks personalizados
- Zustand stores
- Utilities/helpers
// ❌ SKIP
- Componentes puramente visuales sin lógica
- Wrappers triviales
ML Engine
# ✅ MUST TEST
- Model predictions
- Feature engineering
- Data preprocessing
- Model loading/validation
# ⚠️ SHOULD TEST
- API endpoints
- Data validation
- Cache logic
# ❌ SKIP
- Configuración constants
- Type hints