Guide QA
Guide complet pour l'assurance qualite (QA) de l'API MyTelevision.
Vue d'ensemble
Philosophie QA
- Shift-left testing -- Trouver les bugs tot dans le developpement
- Automatisation d'abord -- Automatiser les tests repetitifs
- Base sur le risque -- Se concentrer sur les chemins critiques
- Continu -- Tester a chaque changement
Quality Gates
| Gate | Exigence | Bloquant |
|---|---|---|
| Tests unitaires | 80% de couverture | Oui |
| Lint | Aucune erreur | Oui |
| Build | Reussi | Oui |
| Tests E2E | Passes sur les PRs main | Oui |
| Securite | Aucune vuln. high/critical | Oui |
| Code Review | 1 approbation | Oui |
Environnements de Test
Matrice des Environnements
| Environnement | URL | Objectif | Donnees |
|---|---|---|---|
| Local | http://localhost:3000 | Developpement | Fraiches/seeded |
| Staging | https://staging-api.mytelevision.com | QA et UAT | Production-like |
| Production | https://api.mytelevision.com | Live | Donnees reelles |
Configuration Locale
# Cloner et installer
git clone <repo>
cd mytelevision-api
npm install
# Demarrer les dependances
docker-compose up -d postgres redis
# Migrations et seed
npm run prisma:migrate:dev
npm run prisma:seed
# Demarrer l'API
npm run start:dev
Acces Staging
# Importer l'environnement Postman
postman/environments/staging.json
# Ou configurer manuellement
BASE_URL=https://staging-api.mytelevision.com
API_VERSION=v2
Categories de Tests
Tests Fonctionnels
| Categorie | Description | Priorite |
|---|---|---|
| Authentification | Login, logout, token refresh | Critique |
| Autorisation | RBAC, permissions | Critique |
| Operations CRUD | Create, Read, Update, Delete | Haute |
| Logique metier | Abonnements, paiements | Haute |
| Cas limites | Valeurs limites, etats vides | Moyenne |
| Gestion d'erreurs | Entrees invalides, not found | Moyenne |
Tests Non-Fonctionnels
| Categorie | Description | Outils |
|---|---|---|
| Performance | Temps de reponse, debit | K6, Postman |
| Charge | Utilisateurs concurrents | K6 |
| Securite | Bypass auth, injection | OWASP ZAP |
| Utilisabilite | Ergonomie API | Revue manuelle |
| Documentation | Precision Swagger | Swagger UI |
Tests API avec Postman
Collections
postman/
├── MyTelevision_API_Collection.json # API Publique (179 endpoints)
├── MyTelevision_Admin_Collection.json # API Admin (150+ endpoints)
├── MyTelevision_Account_Profile_Collection.json # Systeme de comptes
└── environments/
├── local.json
├── staging.json
└── production.json
Import et Configuration
- Importer les Collections -- Ouvrir Postman, cliquer "Import", selectionner les fichiers JSON
- Importer l'Environnement -- Aller dans Environments, importer
local.jsonoustaging.json - Configurer les Variables :
baseUrl: http://localhost:3000
apiUrl: {{baseUrl}}/api/v2
adminUrl: {{baseUrl}}/api/v2/admin
Flux d'Authentification
1. POST /api/v2/auth/login
Body: { "email": "[email protected]", "password": "TestPassword123!" }
2. Sauvegarder accessToken depuis la reponse
pm.environment.set("accessToken", pm.response.json().accessToken);
3. Utiliser dans les requetes suivantes
Authorization: Bearer {{accessToken}}
Scenarios de Test Courants
Test : Creer et Recuperer un Film
// Test 1 : Creer un Film (Admin)
pm.test('Create movie returns 201', () => {
pm.response.to.have.status(201);
});
pm.test('Movie has ID', () => {
const movie = pm.response.json();
pm.expect(movie.id).to.be.a('string');
pm.environment.set('movieId', movie.id);
});
// Test 2 : Recuperer le Film
pm.test('Get movie returns created movie', () => {
pm.response.to.have.status(200);
const movie = pm.response.json();
pm.expect(movie.id).to.eql(pm.environment.get('movieId'));
});
Test : Pagination
pm.test('Pagination metadata present', () => {
const response = pm.response.json();
pm.expect(response.meta).to.have.property('page');
pm.expect(response.meta).to.have.property('limit');
pm.expect(response.meta).to.have.property('total');
pm.expect(response.meta).to.have.property('totalPages');
});
pm.test('Data is array', () => {
pm.expect(pm.response.json().data).to.be.an('array');
});
Test : Gestion d'Erreurs
pm.test('Invalid ID returns 404', () => {
pm.response.to.have.status(404);
});
pm.test('Error response format', () => {
const error = pm.response.json();
pm.expect(error).to.have.property('statusCode');
pm.expect(error).to.have.property('message');
});
Execution des Collections
# Via Newman (CLI)
newman run postman/MyTelevision_API_Collection.json \
-e postman/environments/staging.json \
--reporters cli,htmlextra \
--reporter-htmlextra-export ./reports/api-test-report.html
Checklist de Test Manuel
Module Authentification
- Inscription -- Format email valide, mot de passe 8 caracteres minimum, rejet des emails dupliques
- Connexion -- Credentials valides retournent tokens, credentials invalides retournent 401, rate limiting apres 5 echecs
- Social Login -- Google, Apple, Facebook fonctionnels, creation de nouveaux utilisateurs, liaison correcte des comptes existants
- Refresh Token -- Token valide retourne nouveau access token, token expire retourne 401, rotation des tokens
- Deconnexion -- Session terminee, tokens invalides, logout-all termine toutes les sessions
Modules de Contenu
- Films -- Liste paginee, filtres par statut/genre, recherche par titre, details complets, films lies, token streaming (premium)
- Series -- Liste avec nombre de saisons, saisons avec episodes, streaming d'episodes
- TV en Direct -- Liste par categorie, URL de stream, donnees EPG
- Podcasts -- Liste des collections, episodes dans collection, streaming audio
Systeme de Comptes
- Gestion des Profils -- Creation (max 4), edition, suppression (pas le defaut), changement, protection PIN
- Profil Enfant -- Restrictions age appliquees, categories restreintes, fenetres horaires appliquees
- Gestion des Appareils -- Appareil enregistre a la connexion, liste recuperee, revocation correcte
- Gestion des Sessions -- Sessions actives listees, revocation correcte, limite de sessions concurrentes appliquee
Tests de Regression
Tests du Chemin Critique
A executer avant chaque release :
| ID | Description | Priorite |
|---|---|---|
| REG-001 | Flux d'inscription utilisateur | P0 |
| REG-002 | Flux de connexion utilisateur | P0 |
| REG-003 | Refresh de token | P0 |
| REG-004 | Liste des films | P0 |
| REG-005 | Details d'un film | P0 |
| REG-006 | Streaming de contenu | P0 |
| REG-007 | Changement de profil | P1 |
| REG-008 | Flux de paiement | P0 |
| REG-009 | Authentification admin | P0 |
| REG-010 | Operations CRUD admin | P1 |
Suite de Regression
# Regression complete
npm run test:e2e
# Module specifique
npm run test:e2e -- --testPathPattern=auth
# Generer un rapport
npm run test:e2e -- --coverage --coverageReporters=html
Tests de Performance
Criteres de Performance
| Metrique | Cible | Acceptable | Critique |
|---|---|---|---|
| p50 Reponse | < 100ms | < 200ms | > 500ms |
| p95 Reponse | < 300ms | < 500ms | > 1000ms |
| p99 Reponse | < 500ms | < 1000ms | > 2000ms |
| Taux d'erreur | < 0.1% | < 1% | > 5% |
| Debit | > 500 rps | > 200 rps | < 100 rps |
Checklist Performance
- Endpoint health repond < 50ms
- Endpoints de liste paginent correctement
- Reponses en cache plus rapides que sans cache
- Requetes DB optimisees (pas de N+1)
- Rate limiting fonctionne sous charge
- Pas de fuites memoire dans le temps
- Pool de connexions non epuise
Tests de Securite
Checklist OWASP Top 10
- A01 : Broken Access Control -- L'utilisateur ne peut pas acceder aux donnees d'autres utilisateurs, endpoints admin requirent le role admin, RBAC applique correctement
- A02 : Cryptographic Failures -- Mots de passe correctement hashes, secrets JWT solides (32+ caracteres), TLS enforce
- A03 : Injection -- SQL injection prevenue, NoSQL injection prevenue, injection de commande prevenue
- A04 : Insecure Design -- Rate limiting implemente, validation des entrees sur tous les endpoints, messages d'erreur ne divulguent pas d'info
- A05 : Security Misconfiguration -- Pas de credentials par defaut, mode debug desactive, fonctionnalites inutiles desactivees
- A06 : Vulnerable Components --
npm auditpropre, aucune vuln high/critical, dependances a jour - A07 : Authentication Failures -- Politique de mot de passe forte, verrouillage de compte apres echecs, timeout de session fonctionne
- A08 : Data Integrity Failures -- Tokens signes valides, pas de serialisation non fiable, pipeline CI/CD securise
- A09 : Logging Failures -- Echecs de connexion enregistres, donnees sensibles non enregistrees, logs inviolables
- A10 : SSRF -- URLs externes validees, URLs internes bloquees, validation des redirections
Cas de Test Securite
// Test : Prevention SQL Injection
pm.test('SQL injection prevented', () => {
// Tentative: GET /movies?search=' OR '1'='1
pm.response.to.not.have.status(500);
});
// Test : Tentative de Bypass Auth
pm.test('Missing token returns 401', () => {
pm.response.to.have.status(401);
});
// Test : Prevention IDOR
pm.test('Cannot access other user data', () => {
// Tentative: GET /users/{other_user_id}
pm.response.to.have.status(403);
});
Rapport de Bugs
Template de Rapport
## Bug Report
**Titre :** [Description courte]
**Environnement :**
- Environnement : [Local/Staging/Production]
- Version API : [v2]
- Date/Heure : [2025-01-15 10:30 UTC]
**Etapes pour Reproduire :**
1. [Etape 1]
2. [Etape 2]
3. [Etape 3]
**Resultat Attendu :** [Ce qui devrait se passer]
**Resultat Reel :** [Ce qui se passe reellement]
**Details de la Requete :**
- Methode : [GET/POST/PUT/DELETE]
- URL : [URL complete]
- Headers : [Headers pertinents]
- Body : [Corps de la requete si applicable]
**Reponse :**
- Code statut : [ex: 500]
- Body : [Reponse d'erreur]
**Severite :**
- [ ] Critique (Systeme en panne, perte de donnees)
- [ ] Haute (Fonctionnalite majeure cassee)
- [ ] Moyenne (Fonctionnalite degradee)
- [ ] Basse (Probleme mineur)
Definitions de Severite
| Severite | Description | SLA |
|---|---|---|
| Critique | Systeme en panne, faille securite, perte de donnees | 4 heures |
| Haute | Fonctionnalite majeure cassee, pas de contournement | 24 heures |
| Moyenne | Fonctionnalite degradee, contournement existant | 72 heures |
| Basse | Probleme mineur, cosmetique | 1 semaine |
Criteres de Release
Definition of Done
- Tous les tests unitaires passent
- Couverture de code >= 80%
- Tests E2E passent
- Aucune erreur lint
- Scan de securite propre
- Benchmarks de performance atteints
- Code review approuve
- Documentation mise a jour
- Collection Postman mise a jour
- Changelog mis a jour
Checklist de Release
- Branche feature mergee vers develop
- Develop deploye sur staging
- Regression staging passee
- Sign-off UAT obtenu
- Branche release creee
- Version incrementee
- Changelog finalise
- Deploiement production
- Smoke tests passes
- Monitoring verifie