Préparation entretien · 227 questions

Questions d'entretien test d'API

Mis à jour

Les questions de test d'API que les examinateurs posent vraiment — HTTP et codes de statut, authentification, validation de schéma, les cas négatifs qui séparent les juniors des seniors — chacune avec la réponse courte à dire à voix haute, la relance, et le piège. Parcourez les aperçus ; ouvrez ce dont vous avez besoin.

16 questions

Qu'est-ce que le test d'API, et pourquoi tester à la couche API ?

Fondamentaux des APIjuniormid

Le test d'API vérifie directement la couche service — vous envoyez une requête et faites vos assertions sur la réponse, sans navigateur.

Le test d'API vérifie directement la couche service — vous envoyez une requête et faites vos assertions sur la réponse, sans navigateur. Vous vérifiez le statut, le corps, les en-têtes et le comportement là où la logique vit réellement.

Vous testez ici parce que c'est plus rapide, plus stable et plus proche du bug que l'UI. Une règle métier cassée apparaît dans la réponse de l'API bien avant de se manifester comme un bouton mal étiqueté, et un test d'API n'est pas instable à cause d'un rendu lent.

Exemple concret

Une règle de remise qui n'échouait que pour les paniers de plus de 500 $ était invisible dans les tests d'UI — le total semblait plausible. Un seul appel d'API avec un panier de 600 $ renvoyait un total erroné, attrapé en quelques secondes.

Points clés
  • Tester le service directement : requête en entrée, assertion sur la réponse
  • Plus rapide et moins instable que l'UI — pas de navigateur, pas d'attente de rendu
  • Attrape la logique cassée à la couche où elle vit
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Ne dites pas « le test d'API remplace le test d'UI » — ils couvrent des modes de défaillance différents. Dire que l'un supprime le besoin de l'autre se lit comme junior.

Copier le lien

Quelle est la différence entre le test d'API et le test unitaire ?

Fondamentaux des APIjuniormid

Un test unitaire vérifie une fonction isolée, généralement avec tout ce qui l'entoure mocké — il prouve que l'unité de code est correcte.

Un test unitaire vérifie une fonction isolée, généralement avec tout ce qui l'entoure mocké — il prouve que l'unité de code est correcte. Un test d'API frappe un service en cours d'exécution via HTTP et vérifie tout le chemin de la requête à la réponse : routage, sérialisation, auth, la base de données, tout.

Les tests unitaires sont ceux du développeur ; les tests d'API sont souvent les vôtres. Ils se recoupent en intention mais pas en portée — un test unitaire qui passe dit que la fonction marche ; un test d'API qui passe dit que l'endpoint déployé marche.

Points clés
  • Unitaire : une fonction, isolée, dépendances mockées
  • API : le service en cours d'exécution de bout en bout, via HTTP
  • Les deux peuvent passer pendant que l'autre échoue — portée différente
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Passez en revue les principales méthodes HTTP et à quoi sert chacune.

HTTP & codes de statutjunior

GET lit une ressource et ne change rien. POST en crée une nouvelle. PUT remplace une ressource en totalité. PATCH en met à jour une partie. DELETE la supprime.

GET lit une ressource et ne change rien. POST en crée une nouvelle. PUT remplace une ressource en totalité. PATCH en met à jour une partie. DELETE la supprime.

La distinction que les examinateurs écoutent, c'est la sûreté et l'idempotence : GET est sûr (aucun effet de bord) ; GET, PUT et DELETE sont idempotents (deux fois la même requête = même état final) ; POST n'est ni l'un ni l'autre — appelez-le deux fois et vous pourriez créer deux ressources.

Points clés
  • GET lire · POST créer · PUT remplacer · PATCH mise à jour partielle · DELETE supprimer
  • Sûr = aucun effet de bord (GET)
  • Idempotent = répétable avec le même état final (GET, PUT, DELETE)
  • POST n'est ni l'un ni l'autre — un double envoi crée des doublons
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Que signifient les familles de codes de statut HTTP ?

HTTP & codes de statutjunior

2xx a réussi — 200 OK, 201 Created, 204 No Content. 3xx redirection. 4xx la faute du client — 400 requête erronée, 401 non authentifié, 403 interdit, 404 non trouvé, 409 conflit, 422 non traitable.

2xx a réussi — 200 OK, 201 Created, 204 No Content. 3xx redirection. 4xx la faute du client — 400 requête erronée, 401 non authentifié, 403 interdit, 404 non trouvé, 409 conflit, 422 non traitable. 5xx la faute du serveur — 500 erreur interne, 503 indisponible.

La ligne qui compte en entretien : 401 veut dire « je ne sais pas qui vous êtes », 403 veut dire « je sais qui vous êtes et vous ne pouvez pas ». Les confondre est un bug d'API réel et courant que vous devriez tester.

Points clés
  • 2xx succès · 3xx redirection · 4xx erreur client · 5xx erreur serveur
  • 401 = non authentifié ; 403 = authentifié mais non autorisé
  • 201 pour une création, 204 pour une suppression réussie sans corps
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Confondre 401 et 403 est le faux pas classique. Si vous les mélangez, l'examinateur suppose que vous n'avez jamais réellement débogué un échec d'auth.

Copier le lien

Quelle est la différence entre PUT et PATCH, et comment la testeriez-vous ?

HTTP & codes de statutmid

PUT remplace toute la ressource — ce que vous n'envoyez pas, le serveur peut le vider. PATCH ne met à jour que les champs que vous envoyez et laisse le reste tranquille.

PUT remplace toute la ressource — ce que vous n'envoyez pas, le serveur peut le vider. PATCH ne met à jour que les champs que vous envoyez et laisse le reste tranquille.

Le test qui attrape le vrai bug : PATCH un seul champ, puis GET la ressource et vérifiez que chaque AUTRE champ est inchangé. Les équipes implémentent régulièrement PATCH comme un PUT déguisé, mettant silencieusement à null les champs que le client n'a pas inclus — et ça n'apparaît que lorsqu'un utilisateur perd des données.

Exemple concret

Un PATCH de profil qui mettait à jour displayName effaçait discrètement bio parce que le handler reconstruisait tout l'enregistrement. Personne ne l'a remarqué jusqu'à ce que la bio d'un utilisateur disparaisse après qu'il ait changé son nom.

Points clés
  • PUT = remplacement complet ; PATCH = mise à jour partielle
  • Test clé : PATCH un champ, GET, vérifier que les autres ont survécu
  • « Un PATCH qui se comporte comme un PUT » est un bug courant qui perd des données
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Qu'est-ce qui rend une API RESTful ?

Fondamentaux des APImid

Des ressources adressées par URL (/orders/42), sur lesquelles on agit avec des méthodes HTTP, communiquant via des représentations (généralement JSON), sans état — chaque requête porte ce dont le…

Des ressources adressées par URL (/orders/42), sur lesquelles on agit avec des méthodes HTTP, communiquant via des représentations (généralement JSON), sans état — chaque requête porte ce dont le serveur a besoin, rien n'est retenu entre les appels.

En pratique la plupart des API « REST » sont pragmatiques, pas conformes au manuel. Ce qui compte pour les tests, c'est l'absence d'état : si un endpoint dépend d'un état de session côté serveur caché, c'est votre terrain de chasse aux bugs — rejouez une requête isolément et voyez si elle marche toujours.

Points clés
  • Ressources comme URLs, méthodes HTTP comme verbes, représentations JSON
  • Sans état : chaque requête est autonome
  • L'absence d'état est un levier de test — rejouez les requêtes isolément
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment testez-vous l'authentification — clés d'API, tokens Bearer, OAuth2 ?

Authentificationmidsenior

D'abord obtenez une identification valide comme le ferait un vrai client, puis prouvez que l'endpoint la fait respecter.

D'abord obtenez une identification valide comme le ferait un vrai client, puis prouvez que l'endpoint la fait respecter. Pour un flux Bearer/JWT : obtenez un token, envoyez-le dans l'en-tête Authorization, et vérifiez que le chemin nominal marche.

Puis testez la mise en application, là où sont les bugs : pas de token → 401, token mal formé → 401, token expiré → 401, token valide mais mauvaises permissions → 403, et le token d'un autre utilisateur → il ne peut pas atteindre vos données. Les cas négatifs sont le test, pas le chemin nominal.

Exemple concret

Un endpoint acceptait n'importe quel JWT bien formé sans vérifier la signature — un token d'un environnement différent marchait en production. Seul un test négatif « token falsifié » l'a attrapé.

Points clés
  • Obtenez une vraie identification, puis vérifiez la mise en application — pas seulement le chemin nominal
  • Couvrez : pas de token, mal formé, expiré, mauvaise portée (403), token d'un autre utilisateur
  • OAuth2 : automatisez au moins un vrai échange de token, ne codez pas en dur un token périmé
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Ne tester que le chemin nominal (« j'ai envoyé un token valide et obtenu 200 ») rate tout l'intérêt. Le test d'auth, CE SONT les cas négatifs.

Copier le lien

Au-delà du code de statut, qu'affirmez-vous réellement dans une réponse d'API ?

Validation de réponsemid

Le code de statut est le minimum. Ensuite : la structure du corps (les champs dont vous dépendez existent, avec les bons types), les valeurs (celles que la requête aurait dû changer), les en-têtes…

Le code de statut est le minimum. Ensuite : la structure du corps (les champs dont vous dépendez existent, avec les bons types), les valeurs (celles que la requête aurait dû changer), les en-têtes clés (content-type, cache, rate-limit), et le temps de réponse s'il est sous budget.

Un 200 avec un corps cassé est l'échec qu'un test paresseux rate. Affirmer status == 200 et s'arrêter, c'est comme ça qu'une suite verte livre un null là où devrait figurer un nom de client.

Points clés
  • Structure (champs + types), valeurs, en-têtes, timing — pas seulement le statut
  • Un 200 avec un corps erroné ou null est le bug que les tests superficiels ratent
  • Affirmez les valeurs précises que votre requête aurait dû changer
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Je vérifie que le statut est 200 » comme réponse complète. Les examinateurs attendent la suite — si rien ne suit, la réponse s'arrête là.

Copier le lien

Comment validez-vous le schéma d'une réponse, et pourquoi s'embêter si les valeurs semblent correctes ?

Validation de réponsemidsenior

Vous affirmez que la réponse correspond à une forme définie — noms de champs, types, ce qui est requis, ce qui est nullable — avec un validateur JSON Schema ou un modèle typé (pydantic, un POJO, un…

Vous affirmez que la réponse correspond à une forme définie — noms de champs, types, ce qui est requis, ce qui est nullable — avec un validateur JSON Schema ou un modèle typé (pydantic, un POJO, un schéma Zod). Une seule assertion couvre toute la structure.

Vous vous embêtez parce que les vérifications de valeurs et de schéma attrapent des bugs différents. Votre test de valeur affirme price == 41.98 ; il ne dit rien du jour où price commence à arriver comme une chaîne, ou où un champ requis disparaît silencieusement. Le schéma est votre alerte précoce de dérive de contrat.

Exemple concret

Un backend a changé price de nombre à chaîne (« 41.98 ») dans un refactoring. Chaque assertion de valeur passait toujours après un cast ; la vérification de schéma a échoué instantanément et a nommé le champ.

Points clés
  • Validez la forme : noms de champs, types, requis vs nullable
  • Utilisez un validateur de schéma ou un modèle typé, pas des vérifications de champs écrites à la main
  • Attrape la dérive de contrat que les assertions de valeurs laissent passer
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Quels cas négatifs et limites testeriez-vous sur un seul endpoint ?

Tests négatifsmid

Démontez le chemin nominal : champs requis manquants, mauvais types, valeurs vides et null, valeurs limites (0, négatif, longueur max, un de plus), JSON mal formé, champs supplémentaires inattendus,…

Démontez le chemin nominal : champs requis manquants, mauvais types, valeurs vides et null, valeurs limites (0, négatif, longueur max, un de plus), JSON mal formé, champs supplémentaires inattendus, et envois en double.

Puis ceux qu'on oublie : des entrées ressemblant à du SQL/script dans les champs texte, une charge énorme, un mauvais content-type, et un accès non autorisé à la ressource de quelqu'un d'autre. Le chemin nominal est un test ; la couverture intéressante, c'est tout ce que l'endpoint devrait rejeter proprement — avec le bon 4xx, pas un 500.

Points clés
  • Entrées manquantes/mauvais type/null/limite, JSON mal formé, champs supplémentaires
  • Envoi en double, charge surdimensionnée, mauvais content-type
  • Les rejets devraient être un 4xx propre — un 500 sur une mauvaise entrée est lui-même un bug
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment gérez-vous les données de test et l'état à travers les tests d'API ?

Automatisation d'APIsenior

Chaque test possède ses données. Créez ce dont vous avez besoin dans le setup (via l'API ou un seed), utilisez-le, et nettoyez-le dans le teardown — pour que les tests ne dépendent pas d'un…

Chaque test possède ses données. Créez ce dont vous avez besoin dans le setup (via l'API ou un seed), utilisez-le, et nettoyez-le dans le teardown — pour que les tests ne dépendent pas d'un enregistrement partagé qu'un autre test pourrait changer ou supprimer.

L'anti-pattern, ce sont les tests qui supposent que « l'utilisateur 42 existe » ou tournent dans un ordre fixe. Ceux-là passent en local et échouent en CI dès qu'ils tournent en parallèle ou que quelqu'un modifie le seed. Des données autonomes, c'est ce qui rend une suite d'API sûre à exécuter en parallèle et répétable.

Exemple concret

Une suite qui partageait une seule « commande de test » a cassé le jour où elle a tourné en parallèle — un test la marquait expédiée pendant qu'un autre affirmait qu'elle était en attente. Donner à chaque test sa propre commande via le setup l'a réglé pour de bon.

Points clés
  • Chaque test crée et détruit ses propres données
  • Pas d'enregistrements partagés, pas de dépendance d'ordre — les tueurs de CI/parallèle
  • Amorcez via l'API ou la BD dans le setup, nettoyez ensuite
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Postman ou du code (REST Assured, requests) — quand prenez-vous chacun ?

Automatisation d'APImid

Postman pour explorer, des vérifications ponctuelles, et partager une collection avec des gens qui ne codent pas — c'est rapide de fouiller une API et de voir ce qu'elle fait.

Postman pour explorer, des vérifications ponctuelles, et partager une collection avec des gens qui ne codent pas — c'est rapide de fouiller une API et de voir ce qu'elle fait. Le code (REST Assured, Python requests + pytest) pour tout ce qui doit tourner en CI, partager du setup, boucler sur des données, ou vivre à côté du reste de l'automatisation.

La réponse honnête en entretien : commencez dans Postman pour comprendre l'API, puis reconstruisez les vérifications en code une fois qu'elles valent la peine d'être gardées. Les collections Postman en CI via Newman existent, mais un vrai framework les dépasse.

Points clés
  • Postman : explorer, ponctuels, partager avec des non-codeurs
  • Code : CI, setup partagé, piloté par données, vit avec le framework
  • Flux courant : explorer dans Postman → reconstruire en code pour garder
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment structureriez-vous un framework d'automatisation de tests d'API ?

Automatisation d'APIsenior

En couches. Une fine couche client/service enveloppe les appels HTTP (un endroit par endpoint, pour qu'un changement d'URL soit une seule modification).

En couches. Une fine couche client/service enveloppe les appels HTTP (un endroit par endpoint, pour qu'un changement d'URL soit une seule modification). Les tests appellent ces méthodes et affirment — ils ne construisent jamais de requêtes brutes en ligne. La config (URLs de base, identifiants) vient de l'environnement, pas codée en dur. Le setup/teardown des données est dans les fixtures. Les schémas vivent en un seul endroit et sont réutilisés.

Le test se lit comme une intention — createOrder(); assertStatus(201); assertSchema(order) — et la mécanique HTTP se cache derrière. Cette séparation est ce qui permet à la suite de survivre à une API qui n'arrête pas de changer.

Points clés
  • Une couche service enveloppe HTTP — endpoints définis une seule fois
  • Config et secrets depuis l'env ; données dans les fixtures ; schémas réutilisés
  • Les tests expriment l'intention, pas les requêtes brutes
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment testez-vous la pagination et la limitation de débit ?

Tests négatifssenior

Pagination : vérifiez que la taille de page est respectée, que le curseur/offset avance sans répéter ni sauter d'éléments, que la dernière page se termine proprement, et que les totaux sont cohérents…

Pagination : vérifiez que la taille de page est respectée, que le curseur/offset avance sans répéter ni sauter d'éléments, que la dernière page se termine proprement, et que les totaux sont cohérents tant que les données sont stables. Le bug classique, ce sont les éléments qui se décalent entre les pages quand la liste sous-jacente change en cours de parcours.

Limitation de débit : envoyez des requêtes au-delà de la limite et vérifiez que vous obtenez 429 (pas 500), que les en-têtes Retry-After/limite sont corrects, et que le compteur se réinitialise quand il le devrait. Et vérifiez que la limite est par la bonne clé — par utilisateur, pas globale, sinon un client bruyant affame tout le monde.

Points clés
  • Pagination : taille de page respectée, pas de répétitions/sauts, dernière page propre
  • Limite de débit : 429 pas 500, en-tête Retry-After correct, réinitialisation propre
  • Vérifiez que la limite est cadrée par utilisateur, pas globale
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment testez-vous une API sans documentation ?

Fondamentaux des APIsenior

Explorez d'abord, documentez au fur et à mesure. Observez le trafic réseau de l'app pour voir les vraies requêtes, ou lisez le code si vous le pouvez.

Explorez d'abord, documentez au fur et à mesure. Observez le trafic réseau de l'app pour voir les vraies requêtes, ou lisez le code si vous le pouvez. Pour chaque endpoint, cartographiez la méthode, les paramètres requis et optionnels, l'auth, et la forme de la réponse en faisant des appels et en observant — construisant une mini-spec à partir de ce que vous trouvez.

Puis transformez cette spec en tests : le chemin nominal, les cas négatifs, le schéma que vous venez de rétro-concevoir. Le compte rendu que vous produisez est lui-même précieux — vous avez documenté une API non documentée, ce dont l'équipe avait probablement besoin de toute façon.

Points clés
  • Observez le vrai trafic / lisez le code pour cartographier les endpoints
  • Construisez une mini-spec : méthode, paramètres, auth, forme de réponse
  • Transformez la spec en tests — et rendez la documentation
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Passez-moi en revue le test d'un POST qui crée une ressource, de bout en bout.

Automatisation d'APImid

Envoyez le POST avec un corps valide, vérifiez 201 et que la réponse inclut le nouvel id et renvoie les données.

Envoyez le POST avec un corps valide, vérifiez 201 et que la réponse inclut le nouvel id et renvoie les données. Puis GET cet id et vérifiez que la ressource a réellement persisté avec les bonnes valeurs — la création n'est pas prouvée tant que vous ne pouvez pas la relire.

Puis les bords : POST la même chose à nouveau (doublon — renvoie-t-il 409 ou en crée-t-il un second ?), POST avec un champ requis manquant (400/422), et nettoyez la ressource créée dans le teardown. Le round-trip plus les négatifs, c'est le test complet ; n'affirmer que le 201 en est la moitié.

Exemple concret

Un endpoint renvoyait 201 et un bel id, mais un bug faisait que l'enregistrement n'atteignait jamais la base de données. Seul le GET de suivi — qui renvoyait 404 — a prouvé que la création « réussie » était un mensonge.

Points clés
  • POST → vérifier 201 + id, puis GET l'id pour prouver qu'il a persisté
  • Testez la création en double (409 vs seconde copie) et les champs manquants (4xx)
  • Nettoyez dans le teardown ; un 201 seul ne prouve pas la création
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

S'arrêter à « affirmer 201 » saute la preuve de persistance. Le round-trip GET-après-POST est ce qui sépare un vrai test d'API d'un test superficiel.

Copier le lien
Ils demanderont ensuite