# Testing Strategy Models ## Model Comparison | Model | Structure | Best For | |-------|-----------|----------| | Pyramid | Unit 70% > Integration 20% > E2E 10% | Monoliths, logic-heavy | | Trophy (Dodds) | Static > Integration (largest) > Unit > E2E | Modern SPAs | | Honeycomb (Spotify) | Contract-centric cells | Microservices | | Diamond | Balanced unit/integration | Domain services | ## Testing Trophy (Recommended for SPAs) ``` E2E (minimal) /------------\ / Integration \ <-- Largest portion /----------------\ / Unit Tests \ /--------------------\ / Static Analysis \ <-- Foundation /________________________\ ``` **Philosophy:** "The more your tests resemble how software is used, the more confidence they give you." - Kent C. Dodds **Key Principles:** - Test behavior, not implementation - Minimize mocking - Prioritize integration tests - Use accessible queries (getByRole first) ## Testing Honeycomb (Microservices) Contract testing at center, interconnected cells for: - Unit tests (implementation details) - Integration tests (service boundaries) - Contract tests (API agreements) - E2E tests (critical paths only) ## Ratios by Context | Context | Unit | Integration | E2E | |---------|------|-------------|-----| | Classic Pyramid | 70% | 20% | 10% | | Testing Trophy | 30% | 50% | 10% | | API-heavy | 75% | 15% | 10% | | Microservices | 40% | 40% | 20% | ## Priority Matrix | Priority | Category | Examples | |----------|----------|----------| | P0 | Core flows | Signup, login, checkout, payment | | P1 | Major features | Search, CRUD, navigation | | P2 | Secondary | Filters, sorting, pagination | | P3 | Edge cases | Empty states, max limits | ## Coverage Targets | Area | Target | |------|--------| | Critical paths | 100% | | Core features | 80-90% | | Overall | 75-85% | **Note:** Coverage as diagnostic, not target. Focus on what's uncovered. ## CI/CD Order ```yaml - run: npm run lint # Gate 0: Static analysis - run: npm run test:unit # Gate 1: Fast fail - run: npm run test:integration # Gate 2 - run: npm run test:e2e # Gate 3: Pre-merge ```