Tests
Pyramide de tests
Section intitulée « Pyramide de tests »| Niveau | Outil | Couverture cible |
|---|---|---|
| Composables | Vitest | 90% |
| Stores (Pinia) | Vitest | 90% |
| Composants | Vitest + @vue/test-utils | 70% |
| Vues | Vitest + @vue/test-utils | 60% |
| E2E | Playwright | Flux critiques |
Couverture globale minimum : 80%
Stack de tests
Section intitulée « Stack de tests »| Outil | Rôle |
|---|---|
| Vitest | Test runner (compatible Vite) |
| @vue/test-utils | Montage et interaction composants Vue |
| fake-indexeddb | Mock IndexedDB pour Dexie.js |
| @vitest/coverage-v8 | Mesure de couverture |
| Playwright | Tests end-to-end navigateur |
Organisation
Section intitulée « Organisation »Les tests sont colocalisés : chaque fichier a ses tests dans __tests__/ à côté.
composables/├── useVitalSigns.ts├── __tests__/│ └── useVitalSigns.spec.tscomponents/├── ui/│ ├── BaseButton.vue│ ├── __tests__/│ │ └── BaseButton.spec.tsCommandes
Section intitulée « Commandes »npm test # Tests unitaires et composantsnpm run test:watch # Mode watchnpm run test:coverage # Couverture de codenpm run test:e2e # Tests end-to-end (Playwright)Exemple : test d’un composable
Section intitulée « Exemple : test d’un composable »import { describe, it, expect } from 'vitest'import { useVitalSigns } from '../useVitalSigns'
describe('useVitalSigns', () => { it('should initialize with default values', () => { const { vitals } = useVitalSigns() expect(vitals.value.hr).toBe(0) expect(vitals.value.spo2).toBe(0) })
it('should trigger alarm when HR is too high', () => { const { setVital, isAlarming } = useVitalSigns() setVital('hr', 150) expect(isAlarming.value).toBe(true) })})Exemple : test d’un composant
Section intitulée « Exemple : test d’un composant »import { describe, it, expect } from 'vitest'import { mount } from '@vue/test-utils'import BaseButton from '../BaseButton.vue'
describe('BaseButton', () => { it('should render slot content', () => { const wrapper = mount(BaseButton, { slots: { default: 'Click me' }, }) expect(wrapper.text()).toContain('Click me') })
it('should emit click event', async () => { const wrapper = mount(BaseButton) await wrapper.trigger('click') expect(wrapper.emitted('click')).toHaveLength(1) })})Tests E2E (Playwright)
Section intitulée « Tests E2E (Playwright) »Flux critiques testés :
- Démarrer une simulation depuis l’accueil
- Naviguer entre les vues pendant une simulation
- Modifier les paramètres vitaux en cours de simulation
- Exporter une session depuis le débriefing