Les questions d'entretien sur les tests API couvrent les méthodes HTTP, les codes de statut, et les flux d'authentification. Elles portent aussi sur la structure des requêtes et réponses, et sur l'utilisation d'outils comme Postman et APIRequestContext de Playwright pour tester les endpoints directement.
Questions fondamentales
1. "Qu'est-ce que le test d'API et pourquoi est-il important ?"
Réponse solide : "Le test d'API consiste à tester directement l'interface entre le frontend et le backend, en contournant l'interface utilisateur. On vérifie que les endpoints acceptent les requêtes valides, renvoient des réponses correctes, gèrent les entrées invalides proprement, et appliquent correctement les autorisations. C'est important parce que les tests API sont plus rapides que les tests UI, plus stables (pas de sélecteurs fragiles), et peuvent détecter les bugs plus tôt. On peut aussi tester des comportements qui ne sont pas exposés dans l'UI du tout. Par exemple les APIs internes, les frontières de permission, ou les cas limites dans la gestion des entrées."2. "Quelle est la différence entre le test d'API et le test UI ?"
| | Test d'API | Test UI |
|-|------------|---------|
| Ce qui est testé | Requête/réponse, logique métier | Interface, éléments visuels, parcours utilisateur |
| Vitesse | Très rapide (millisecondes) | Plus lent (secondes, démarrage du navigateur) |
| Stabilité | Haute : pas de changements DOM | Plus basse : les sélecteurs UI cassent |
| Couverture | Logique métier, sécurité, intégrité des données | Expérience utilisateur, correction visuelle |
| Outils | Playwright request API, Postman, REST Assured | Playwright, Cypress, Selenium |
Aucun ne remplace l'autre : ils détectent des bugs différents.
3. "Que vérifiez-vous dans un test d'API ?"
Un bon test d'API vérifie :
- Le code de statut : est-ce un 200 quand ça devrait être un 201 ? Un token d'authentification manquant renvoie-t-il bien 401 ?
- Le corps de la réponse : les bons champs sont-ils présents ? Les valeurs sont-elles correctes ?
- Les types de données :
ageest-il un nombre ou une chaîne ?is_activeest-il un booléen ? - Les champs obligatoires : champs manquants ou null qui devraient être présents
- Aucune donnée sensible exposée : hachages de mot de passe, IDs internes, données personnelles qui ne devraient pas figurer dans la réponse
- Les réponses d'erreur : les requêtes invalides renvoient-elles des messages d'erreur utiles avec le bon code de statut ?
- La performance : la réponse revient-elle dans un délai acceptable ?
4. "Expliquez les méthodes HTTP que vous utilisez dans les tests d'API."
| Méthode | Objectif | Exemple |
|---------|----------|---------|
| GET | Récupérer des données | Obtenir le profil d'un utilisateur |
| POST | Créer une nouvelle ressource | Enregistrer un nouvel utilisateur |
| PUT | Remplacer une ressource entièrement | Mettre à jour tous les champs d'un utilisateur |
| PATCH | Mettre à jour une partie d'une ressource | Mettre à jour uniquement l'email d'un utilisateur |
| DELETE | Supprimer une ressource | Supprimer un compte utilisateur |
Distinction clé : GET doit être idempotent (l'appeler 10 fois produit le même résultat). DELETE doit aussi être idempotent (supprimer une ressource déjà supprimée doit renvoyer 404, pas planter). POST ne l'est pas, car l'appeler deux fois crée généralement deux enregistrements.5. "Quels codes de statut vérifiez-vous le plus dans les tests d'API ?"
Plutôt que de lister tous les codes de statut, donnez une réponse orientée test :
"Je vérifie toujours que les réponses de succès utilisent le bon code : 201 pour les créations, 204 pour les suppressions, 200 pour les lectures. Pour les erreurs, j'attends 400 ou 422 pour les échecs de validation, 401 pour une authentification manquante ou invalide, 403 pour des permissions insuffisantes, 404 pour les ressources manquantes. Je fais attention à ce que le serveur ne renvoie pas 500 pour des entrées invalides. Une entrée invalide doit renvoyer 4xx, pas 5xx."Questions sur les outils et l'implémentation
6. "Comment testez-vous les APIs avec Playwright ?"
test('POST /users renvoie 201 avec le bon corps', async ({ request }) => {
const response = await request.post('https://api.becomeqa.com/users', {
data: {
email: 'new_user@test.com',
password: 'ValidPass1',
role: 'member',
},
});
expect(response.status()).toBe(201);
const body = await response.json();
expect(body.id).toBeTruthy();
expect(body.email).toBe('new_user@test.com');
expect(body).not.toHaveProperty('password'); // pas de mot de passe dans la réponse
});request qui fait des appels HTTP sans navigateur. Je l'utilise pour les tests au niveau API et aussi pour préparer les données de test dans les tests E2E. Par exemple, créer un utilisateur via API avant de tester l'UI de connexion, ce qui est bien plus rapide que de s'inscrire via le formulaire."
7. "Comment gérez-vous l'authentification dans les tests d'API ?"
Structure d'une réponse solide : "Ça dépend du mécanisme d'authentification. Pour l'auth par token Bearer, je m'authentifie une fois dans un hookbeforeAll, je stocke le token, et je l'inclus dans les requêtes suivantes via le header Authorization. Pour l'auth par cookie, Playwright gère les cookies automatiquement. Je teste aussi que les requêtes non authentifiées renvoient 401 et que les tokens avec des permissions insuffisantes renvoient 403."
let authToken: string;
test.beforeAll(async ({ request }) => {
const response = await request.post('/api/auth/login', {
data: { email: 'admin@test.com', password: 'AdminPass1' },
});
const body = await response.json();
authToken = body.token;
});
test('la requête authentifiée fonctionne', async ({ request }) => {
const response = await request.get('/api/users', {
headers: { Authorization: `Bearer ${authToken}` },
});
expect(response.status()).toBe(200);
});8. "Quelle est la différence entre Postman et Playwright pour les tests d'API ?"
| | Postman | Playwright |
|-|---------|-----------|
| Type | Outil GUI pour les tests manuels et scriptés | Framework d'automatisation basé sur du code |
| Idéal pour | Exploration API, vérifications rapides, mocking | Suites de tests automatisés, CI/CD, E2E + API combinés |
| Courbe d'apprentissage | Faible | Modérée (nécessite de programmer) |
| Intégration CI/CD | Possible (Newman CLI) | Native, prioritaire |
| Qualité du code de test | Limitée | Support TypeScript complet |
| Débogage | Visualiseur requête/réponse | Logs, trace viewer |
"J'utilise Postman pour l'exploration initiale des APIs : envoyer quelques requêtes pour comprendre la structure avant d'écrire des tests automatisés. Ensuite je passe à Playwright pour la vraie suite de tests qui tourne en CI."Questions basées sur des scénarios
9. "Vous testez un endpoint DELETE. Que vérifiez-vous ?"
Un test complet d'endpoint DELETE doit vérifier :
1. Chemin nominal : supprimer une ressource avec une auth valide → 204 No Content
2. Ressource vraiment supprimée : GET suivant → 404
3. Idempotence : deuxième DELETE → 404 (pas 500, pas 204 à nouveau)
4. Autorisation : supprimer sans auth → 401
5. Mauvais utilisateur : supprimer la ressource de quelqu'un d'autre → 403
6. Ressource inexistante : supprimer une ressource qui n'a jamais existé → 404 (pas 500)
test('DELETE /orders/:id couverture complète', async ({ request }) => {
// Créer la commande à supprimer
const createResp = await request.post('/api/orders', {
data: { product_id: 1, quantity: 2 },
headers: { Authorization: `Bearer ${userToken}` },
});
const { id } = await createResp.json();
// La supprimer
const deleteResp = await request.delete(`/api/orders/${id}`, {
headers: { Authorization: `Bearer ${userToken}` },
});
expect(deleteResp.status()).toBe(204);
// Vérifier qu'elle a disparu
const getResp = await request.get(`/api/orders/${id}`, {
headers: { Authorization: `Bearer ${userToken}` },
});
expect(getResp.status()).toBe(404);
// Deuxième suppression → 404, pas de plantage
const redoResp = await request.delete(`/api/orders/${id}`, {
headers: { Authorization: `Bearer ${userToken}` },
});
expect(redoResp.status()).toBe(404);
});10. "Comment testez-vous la gestion des erreurs API ?"
"Je teste que l'API gère les entrées invalides proprement, sans jamais renvoyer 500 pour des choses comme des champs obligatoires manquants, des formats invalides, ou des valeurs hors limites. Je vérifie aussi que les messages d'erreur sont utiles (ils indiquent au client ce qui s'est passé) sans être trop révélateurs (ils n'exposent pas les stack traces ou les détails internes)."Checklist de test :
- Champ obligatoire manquant → 400/422 avec un message d'erreur clair
- Mauvais type de données (chaîne à la place d'un nombre) → 400/422
- Valeur hors limites → 400/422
- JSON valide mais qui échoue la logique métier (email en double) → 409
- Corps JSON malformé → 400
- Header Content-Type manquant → 400 ou 415
11. "Qu'est-ce que le contract testing et quand l'utiliseriez-vous ?"
Le contract testing vérifie qu'une API respecte un contrat convenu : la spécification de ce à quoi les requêtes et réponses doivent ressembler. Des outils comme Pact définissent ces contrats entre le consommateur (frontend) et le fournisseur (backend).
"Le contract testing est utile quand plusieurs équipes consomment la même API. Plutôt que de lancer des tests E2E complets pour chaque changement, on vérifie que l'API correspond toujours au contrat dont chaque consommateur dépend. Je le recommande dans une architecture microservices avec plusieurs équipes où le coût des tests d'intégration de toutes les combinaisons devient trop élevé."12. "Comment testez-vous la pagination dans une API ?"
test('la pagination renvoie les bonnes tailles de page', async ({ request }) => {
// Première page
const page1 = await request.get('/api/products?page=1&limit=10');
const body1 = await page1.json();
expect(body1.data).toHaveLength(10);
expect(body1.pagination.current_page).toBe(1);
expect(body1.pagination.total_pages).toBeTruthy();
// Deuxième page
const page2 = await request.get('/api/products?page=2&limit=10');
const body2 = await page2.json();
// Éléments différents de la page 1
expect(body2.data[0].id).not.toBe(body1.data[0].id);
// Dernière page
const lastPage = await request.get(`/api/products?page=${body1.pagination.total_pages}&limit=10`);
const bodyLast = await lastPage.json();
expect(bodyLast.data.length).toBeGreaterThan(0);
expect(bodyLast.data.length).toBeLessThanOrEqual(10);
// Au-delà de la dernière page
const overPage = await request.get(`/api/products?page=${body1.pagination.total_pages + 1}&limit=10`);
expect(overPage.status()).toBe(200); // ou 404 selon la conception de l'API
const bodyOver = await overPage.json();
expect(bodyOver.data).toHaveLength(0); // ou tableau vide
});Ce que les recruteurs veulent voir
Au-delà des bonnes réponses, les recruteurs observent :
Pensez-vous à la sécurité ? Mentionner le contournement d'authentification, 401/403, et les données sensibles exposées signale une conscience de la sécurité. Testez-vous les cas positifs et négatifs ? Les meilleurs candidats mentionnent naturellement "et je testerais aussi que les entrées invalides renvoient 422, pas 500." Avez-vous une expérience pratique des outils ? Mentionner des outils précis (la fixture request de Playwright, Postman, k6) et de vrais exemples de code signale une expérience réelle. Connectez-vous le test d'API à une vision d'ensemble ? Montrer que vous utilisez les appels API pour préparer les données de test E2E (et expliquer pourquoi c'est mieux que la configuration via UI) montre une réflexion architecturale. → See also: Tests d'API 101: Tout ce que Chaque Ingénieur QA Doit Savoir en 2026 | Tests d'API avec Playwright: Au-delà de l'Interface | Codes de Statut HTTP que Tout Ingénieur QA Doit Connaître | Comment Se Préparer pour un Entretien Technique QA: Guide Étape par Étape