Préparation entretien · 227 questions

Questions d'entretien SDET

Mis à jour

Architecture, system design pour le test, et le round de code. Ce sont les questions qui décident si vous êtes embauché comme SDET ou comme ingénieur automatisation avec un autre intitulé.

70 questions

Quelle est la différence entre un ingénieur QA et un SDET ?

Rôle & périmètrejuniormid

Un ingénieur QA porte le jugement qualité : quoi tester, quel risque on porte, si cette release est sûre.

Un ingénieur QA porte le jugement qualité : quoi tester, quel risque on porte, si cette release est sûre. Un SDET porte cela plus l'ingénierie qui le prouve : le framework, l'infrastructure de test, le pipeline CI, les systèmes de données de test — du code de qualité production, revu par les développeurs en tant que pair.

Les deux testent. L'un est aussi responsable du code qui teste.

Exemple concret

Même mardi, deux rôles : l'ingénieur QA remarque que la user story de paiement ne définit pas ce qui se passe quand la carte échoue en plein renouvellement — et pose la question. Le SDET se fait demander pourquoi la suite prend 40 minutes, découvre des tests partageant un seul compte seedé, reconstruit la couche de données parallel-safe et shard le run à 8 minutes. Problèmes différents, tous deux qualité.

Points clés
  • QA : la décision qualité
  • SDET : + l'ingénierie derrière
  • Le code du SDET passe la revue dev
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« SDET = un QA qui code » — c'est la propriété des systèmes de test, pas un badge de scripting.

Copier le lien

Expliquez la pyramide des tests. Que se passe-t-il quand elle est inversée ?

Architecture de testjuniormidsenior

Beaucoup de tests unitaires rapides à la base, moins de tests API/intégration au milieu, peu de tests E2E/UI au sommet — parce que le coût, la lenteur et l'instabilité augmentent à mesure qu'on monte.

Beaucoup de tests unitaires rapides à la base, moins de tests API/intégration au milieu, peu de tests E2E/UI au sommet — parce que le coût, la lenteur et l'instabilité augmentent à mesure qu'on monte.

Inversée (le « cornet de glace ») : des centaines de tests UI, une couche API mince, peu d'unitaires — pipelines lents, rouges instables, échecs qui ne pointent nulle part, et une équipe qui cesse de faire confiance au vert. Le correctif, c'est descendre les vérifications, pas ajouter du matériel.

Exemple concret

Hérité d'une suite inversée : 600 tests UI, 90 minutes, rouge deux fois par semaine pour des non-bugs. Un quart des tests UI re-vérifiaient des règles de tarification que l'API pouvait valider en millisecondes. Six mois à descendre les vérifications : 150 parcours UI, 800 vérifications API, pipeline de 12 minutes — et le vert voulait de nouveau dire quelque chose.

Points clés
  • Unitaires nombreux, API au milieu, UI rares
  • Vers le haut = plus lent, plus cher, plus instable
  • Inversée = lenteur, instabilité, méfiance
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Dessiner le triangle sans la conséquence — la question porte vraiment sur le cas inversé et sa facture.

Copier le lien

Concevez un framework d'automatisation de tests de zéro. Décrivez votre architecture.

Architecture de testsenior

En couches, de bas en haut : config (par environnement, secrets injectés) ; drivers/clients (browser factory, client API) ; pages/composants pour la structure UI ; couche de données…

En couches, de bas en haut : config (par environnement, secrets injectés) ; drivers/clients (browser factory, client API) ; pages/composants pour la structure UI ; couche de données (builders/factories, seedées par API, parallel-safe) ; tests — scénarios minces uniquement ; reporting (artefacts à l'échec, publiés en CI). L'authentification gérée une fois, sous l'UI.

Puis défendez les choix : composition plutôt qu'héritage, setup API-first, isolation plutôt qu'état partagé — et ce que vous avez délibérément laissé de côté.

Exemple concret

Le choix que les examinateurs sondent toujours dans le mien : pas de god-class BaseTest. Les fixtures se composent — un test qui n'a besoin que d'un client API ne paie jamais pour un navigateur. Deuxième sonde : l'auth est un appel API qui injecte l'état de session par worker ; le login UI est un seul test dédié, pas une taxe sur 200 tests.

Points clés
  • Config → clients → pages → données → tests → reporting
  • Tests minces, auth sous l'UI
  • Défendez les compromis
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Nommer des outils au lieu de couches — « Playwright, pytest, Allure » est une stack, pas une architecture.

Copier le lien

Comment concevriez-vous une stratégie de test pour une architecture microservices ?

System design pour le testsenior

Descendez la confiance et découplez les équipes : de solides tests unitaires + de service par service en isolation (dépendances mockées) ; des tests de contrat entre chaque paire…

Descendez la confiance et découplez les équipes : de solides tests unitaires + de service par service en isolation (dépendances mockées) ; des tests de contrat entre chaque paire consommateur-fournisseur — la couche qui remplace la plupart des E2E inter-services ; un mince ensemble d'E2E de parcours critiques sur un environnement complet ; et du shift-right — canaries, monitoring, alerting comme partie de la stratégie, parce que la vérité de l'intégration vit en production.

L'anti-objectif : un staging géant où tous les services doivent être verts pour tester quoi que ce soit.

Exemple concret

Douze services, et l'ancienne approche — E2E full-stack pour chaque fonctionnalité — signifiait que le bug de n'importe quelle équipe bloquait le pipeline de tous. La refonte : des contrats Pact sur toutes les paires, des tests de service contre des mocks, et l'E2E réduit à huit parcours d'argent. L'indépendance de déploiement est revenue ; le canal « le staging est encore cassé » s'est tu.

Points clés
  • Tests de service isolés, deps mockées
  • Les contrats remplacent la plupart des E2E
  • Parcours minces + signaux de production
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Proposer de tester en E2E chaque interaction de service — la stratégie exacte que les microservices rendent impossible.

Copier le lien

Concevez un système de gestion des données de test.

System design pour le testsenior

Trois capacités : création — factories/builders fabriquant des entités à la demande via API ou seeding direct (« un utilisateur avec une carte expirée » en un appel) ; isolation — données uniques par…

Trois capacités : création — factories/builders fabriquant des entités à la demande via API ou seeding direct (« un utilisateur avec une carte expirée » en un appel) ; isolation — données uniques par run, parallel-safe, détruites ou namespacées ; volume réaliste — jeux de données anonymisés à la forme de la production pour le volume, la migration et le travail de performance, rafraîchis selon un planning.

Règle un : les tests fonctionnels ne partagent jamais de données mutables. Règle deux : les données de production n'entrent jamais dans les systèmes de test sans anonymisation.

Exemple concret

Le système qui a mis fin à nos instabilités du lundi : une API de données dans l'environnement de test — POST /test-data/users avec des traits, adossée à des factories, auto-taggée par run-id, balayée chaque nuit. N'importe quel test, n'importe quel worker, des données fraîches en ~200 ms. Le vieux tableur de « comptes en or » partagés a été supprimé avec cérémonie.

Points clés
  • Factories à la demande, via API
  • Uniques par run, balayées après
  • Volume anonymisé pour le travail d'échelle
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Une base seedée partagée » — la conception dont ce genre d'instabilités a motivé la question.

Copier le lien

Concevez un système pour exécuter 10 000 tests en moins de 10 minutes.

System design pour le testsenior

Du parallélisme, plus de l'honnêteté sur le mix. Le calcul à voix haute : si le test moyen dure 3 s, c'est 30 000 s de travail — ~50 workers pour 10 minutes.

Du parallélisme, plus de l'honnêteté sur le mix. Le calcul à voix haute : si le test moyen dure 3 s, c'est 30 000 s de travail — ~50 workers pour 10 minutes. Donc : shard sur des workers (conteneurs, éphémères), équilibrez les shards par durée et non par nombre, rendez chaque test isolation-safe d'abord, séparez par couche (les unitaires en secondes restent locaux ; la tranche UI reçoit les workers), cachez les builds/deps, et échouez vite avec des résultats en direct.

Le déclic n'est jamais le matériel seul — ce sont des tests qui peuvent tourner n'importe où, dans n'importe quel ordre.

Exemple concret

Le vrai goulot quand on a fait ça n'était pas le calcul — c'étaient 200 tests épinglés à une seule base de staging partagée. On a corrigé l'isolation des données d'abord (namespacée par worker), puis le sharding a vraiment marché : 42 conteneurs, équilibrés par durée depuis l'historique de timing, 10k tests en 8:40. Le découpage naïf par nombre avait un shard qui finissait 6 minutes en retard à chaque run.

Points clés
  • Faites le calcul des workers à voix haute
  • L'isolation avant le parallélisme
  • Équilibrez les shards par durée
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Ajoutez des machines » sans le calcul d'isolation — 10k tests entremêlés sur 50 workers, c'est 50 façons d'entrer en collision.

Copier le lien

Concevez un tableau de bord de reporting et d'analytique de tests. Que suivriez-vous ?

System design pour le testsenior

Deux publics, deux vues. Ingénieurs, par run : les échecs avec artefacts inline (trace, capture, logs), échec nouveau-vs-connu, durée, marqueurs d'instabilité, build/commit testé.

Deux publics, deux vues. Ingénieurs, par run : les échecs avec artefacts inline (trace, capture, logs), échec nouveau-vs-connu, durée, marqueurs d'instabilité, build/commit testé. Leads, dans le temps : tendances de taux de réussite et d'instabilité, dérive de la durée de suite, tests les plus lents, nombre et âge des quarantaines, corrélation avec les défauts échappés.

Chaque widget doit répondre à une question que quelqu'un pose vraiment — les tableaux de bord meurent de décoration.

Exemple concret

La vue de loin la plus utilisée qu'on ait construite n'était pas le graphe de taux de réussite — c'était « qu'est-ce qui échoue nouvellement sur CE commit vs hier » : ça a transformé le triage de lire 40 rouges en lire 3. Deuxième plus utilisée : le classement des instables, parce que la honte est une stratégie de maintenance étonnamment efficace.

Points clés
  • Par run : artefacts + nouveau-vs-connu
  • Tendances : instabilité, durée, âge de quarantaine
  • Chaque widget répond à une question
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Un camembert de taux de réussite comme pièce maîtresse — joli, et il ne répond à aucune question posée pendant le triage.

Copier le lien

Comment testeriez-vous un raccourcisseur d'URL ?

System design pour le testmidsenior

Structurez à voix haute. Fonctionnel : aller-retour raccourcir → rediriger, alias personnalisés, doublons, URL invalides/malveillantes.

Structurez à voix haute. Fonctionnel : aller-retour raccourcir → rediriger, alias personnalisés, doublons, URL invalides/malveillantes. Limites : URL unicode, URL énormes, liens expirés, comportement de collision à l'échelle. Non fonctionnel : latence de redirection (c'EST le produit), charge à lecture dominante (les lectures écrasent les écritures), disponibilité. Sécurité : abus d'open-redirect, énumération des codes courts, rate limits, injection de schéma javascript:.

Concluez par la priorisation : la justesse de la redirection et sa latence d'abord — c'est le seul travail du produit.

Exemple concret

Les deux trouvailles qui impressionnent dans cette conception : des codes courts séquentiels (énumérer les liens de tout le monde — fuite de vie privée), et le service raccourcissant joyeusement javascript:alert(1) (XSS stocké via redirection). Les deux sont des réponses « concevez les tests » qui montrent une pensée sécurité sans qu'on l'ait demandée.

Points clés
  • Aller-retour + collisions + expiration
  • Charge à lecture dominante, latence de redirection
  • Énumération + injection de schéma
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Plonger dans le happy path raccourcir/rediriger et s'arrêter — la question est notée sur la structure et la moitié non fonctionnelle.

Copier le lien

Qu'est-ce que le test de contrat, et quand vaut-il l'investissement ?

Tests d'API & de contratsenior

Vérifier que les attentes d'un consommateur envers l'API d'un fournisseur correspondent à ce que le fournisseur sert vraiment — sous forme de contrats exécutables (façon Pact), vérifiés dans les DEUX…

Vérifier que les attentes d'un consommateur envers l'API d'un fournisseur correspondent à ce que le fournisseur sert vraiment — sous forme de contrats exécutables (façon Pact), vérifiés dans les DEUX pipelines avant le déploiement. Le consommateur enregistre ce dont il a besoin ; le fournisseur rejoue et prouve que ça tient toujours.

Ça vaut le coup quand des équipes indépendantes déploient des services qui se parlent — c'est la couche qui attrape les changements cassants sans staging partagé. Excessif pour un monolithe ou quand une équipe possède les deux côtés.

Exemple concret

L'incident qui l'a vendu ici : l'équipe orders a renommé customerId en customer_id, l'environnement d'intégration était vert (déploiement périmé), la production a cassé à 9h. Avec Pact, le build du fournisseur aurait échoué à l'instant où le changement contredisait le contrat du consommateur orders — trois jours avant le déploiement, dans leur propre CI.

Points clés
  • Attentes du consommateur, vérifiées par le fournisseur
  • S'exécute avant déploiement, dans les deux pipelines
  • Pour des équipes/services indépendants
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« La validation de schéma » comme définition — les contrats portent sur les attentes d'un consommateur spécifique, ce qui explique qu'ils attrapent ce que les schémas génériques ratent.

Copier le lien

Que testeriez-vous dans une API, et comment prioriseriez-vous ?

Tests d'API & de contratmidsenior

La checklist complète : codes de statut, corps et schéma de réponse, erreurs avec messages utiles, authz (l'ID d'un autre utilisateur → 403), effets de bord persistés, idempotence, headers, latence.

La checklist complète : codes de statut, corps et schéma de réponse, erreurs avec messages utiles, authz (l'ID d'un autre utilisateur → 403), effets de bord persistés, idempotence, headers, latence.

Priorisé : 1) le contrat happy-path par endpoint — le smoke ; 2) auth/authz partout — les bugs catastrophiques les moins chers ; 3) les chemins d'erreur dont dépendent les consommateurs ; 4) données limites et idempotence ; 5) baselines de performance. L'argent et les permissions avant l'exhaustivité.

Exemple concret

La priorité 2 méritant son rang : GET /orders/{id} avec le token du mauvais utilisateur renvoyait la commande — un IDOR fuyant l'historique d'achats, trouvé dans la première heure de test authz-first. Des réponses parfaites partout ailleurs ; l'ordre de la checklist existe à cause exactement de cette classe de bug.

Points clés
  • Corps+schéma, authz, effets de bord, idempotence
  • Vérifs d'auth sur CHAQUE endpoint
  • Argent + permissions d'abord
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Une liste plate non priorisée — la question contient « priorisez » parce que le jugement de triage est ce qu'on embauche.

Copier le lien

Comment testez-vous l'authentification JWT ou OAuth2 ?

Tests d'API & de contratmidsenior

JWT : token expiré → 401, payload/signature falsifié → rejeté, attaque alg:none rejetée, bons claims imposés (rôles, audience, émetteur), expiration réellement honorée côté serveur.

JWT : token expiré → 401, payload/signature falsifié → rejeté, attaque alg:none rejetée, bons claims imposés (rôles, audience, émetteur), expiration réellement honorée côté serveur.

OAuth2 : le flow de grant complet, rotation du refresh, imposition des scopes (un token à scope read ne peut pas écrire), la révocation révoque vraiment, redirect_uri strictement validé (le trou classique), paramètre state imposé (CSRF).

Le thème : ne testez pas que le login marche — testez que tout le RESTE est rejeté.

Exemple concret

Les trouvailles qui reviennent : décoder le JWT sur jwt.io, passer role:user à role:admin, renvoyer sans re-signer — rejeté correctement. Mais le « logout » ne vidait que le cookie : l'ancien token continuait de marcher pendant tout son TTL de 24h contre l'API directement. La révocation de session était du théâtre côté client. C'est une vraie vulnérabilité issue d'un test de dix minutes.

Points clés
  • Falsifié/expiré/none-alg → rejeter
  • Scopes, audience, révocation réels
  • Validation de redirect_uri + state
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Je teste login valide et invalide » — le test d'auth porte sur forgé, expiré, rejoué et sur-scopé, pas sur les mauvais mots de passe.

Copier le lien

Qu'est-ce que l'idempotence, et pourquoi importe-t-elle pour le test ?

Tests d'API & de contratmidsenior

Une opération est idempotente si la faire deux fois a le même effet qu'une fois — GET/PUT/DELETE par conception, POST seulement si c'est ingénieré (clés d'idempotence).

Une opération est idempotente si la faire deux fois a le même effet qu'une fois — GET/PUT/DELETE par conception, POST seulement si c'est ingénieré (clés d'idempotence).

Pourquoi les testeurs s'en soucient : les retries sont partout — les réseaux échouent, les utilisateurs double-cliquent, les queues redélivrent. Chaque retry contre une opération non idempotente est un potentiel double-débit, double-e-mail, commande en double. Le test : la même requête deux fois (puis en concurrence), affirmer exactement un effet.

Exemple concret

Le double-clic qui a coûté de l'argent réel : POST de paiement, réseau lent, l'utilisateur clique deux fois, deux débits — pas de clé d'idempotence sur l'endpoint. Le correctif (clé générée côté client, dédup côté serveur) est venu avec un test qui tire la même clé en concurrence et affirme un seul débit. Ce test a échoué deux fois depuis — les deux fois avant la production.

Points clés
  • Deux fois = une fois, côté effet
  • Retries/double-clics sont du trafic normal
  • Test : doublon + doublon concurrent
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

La définir sans l'histoire du retry — « les réseaux réessaient, donc les écritures non idempotentes sont des double-débits latents » EST la réponse.

Copier le lien

Expliquez la différence entre un mock, un stub, un spy et un fake.

Mocking & doublures de testmidsenior

Tous des doublures de test, des jobs différents. Stub : renvoie des réponses toutes faites — vous affirmez sur l'état de votre système.

Tous des doublures de test, des jobs différents. Stub : renvoie des réponses toutes faites — vous affirmez sur l'état de votre système. Mock : préprogrammé avec des attentes — l'assertion EST l'interaction (« charge() a-t-il été appelé une fois avec 50 $ »). Spy : la vraie chose (ou un stub) qui enregistre les appels pour inspection ultérieure. Fake : implémentation légère fonctionnelle — base en mémoire, passerelle de paiement factice.

Règle générale : stubbez les requêtes, mockez les commandes, fakez l'infrastructure.

Exemple concret

Un seul test de checkout, les quatre : stub du service de taxe (8 % tout fait), mock de l'envoyeur d'e-mail (affirmer exactement un reçu envoyé), spy sur le client de métriques (enregistrer ce qui a été émis, affirmer plus tard), fake de la base (repo en mémoire pour que le test tourne en 50 ms). Nommer lequel et pourquoi est la version senior de la réponse.

Points clés
  • Stub répond, mock attend
  • Spy enregistre, fake implémente
  • Stub les requêtes, mock les commandes
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Utiliser « mock » pour les quatre — cette question existe précisément pour attraper ça.

Copier le lien

Quand faut-il mocker une dépendance, et quand utiliser la vraie ?

Mocking & doublures de testsenior

Mockez ce que vous ne contrôlez pas ou ne pouvez pas vous permettre : API tierces, externes lents/instables, conditions d'erreur que vous ne pouvez pas déclencher à la demande, tout ce qui facture à…

Mockez ce que vous ne contrôlez pas ou ne pouvez pas vous permettre : API tierces, externes lents/instables, conditions d'erreur que vous ne pouvez pas déclencher à la demande, tout ce qui facture à l'appel. Utilisez la vraie chose pour ce que le test existe à vérifier : votre logique, vos requêtes, vos coutures d'intégration — avec les conteneurs rendant « réel mais jetable » bon marché.

Chaque mock est un petit mensonge sur le monde ; gardez quelque part une vérification d'intégration qui dit la vérité.

Exemple concret

On mockait le fournisseur de paiement partout — propre, rapide, vert. Sa sandbox a pendant ce temps changé un code de refus, et la production l'a mal géré : nos mocks testaient à l'unanimité la réalité d'hier. Le correctif n'était pas de démocker — c'était une vérification de contrat planifiée contre la sandbox dont le job est d'attraper la dérive.

Points clés
  • Mock : non contrôlé, lent, coûteux, chemins d'erreur
  • Réel : votre logique et vos coutures
  • Les mocks dérivent — épinglez avec des vérifs de contrat
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Mockez tout pour la vitesse » — des tests rapides qui vérifient un spectacle de marionnettes pendant que les bugs d'intégration passent la porte.

Copier le lien

Qu'est-ce que la virtualisation de service et en quoi diffère-t-elle du mocking ?

Mocking & doublures de testsenior

Un service simulé en cours d'exécution — WireMock/Mountebank/Hoverfly servant l'API d'une dépendance sur le réseau : avec état si besoin, latence injectable, partagé par n'importe quel consommateur…

Un service simulé en cours d'exécution — WireMock/Mountebank/Hoverfly servant l'API d'une dépendance sur le réseau : avec état si besoin, latence injectable, partagé par n'importe quel consommateur quel que soit le langage. Le mocking vit dans votre processus de test et meurt avec lui.

Virtualisez quand : plusieurs équipes ont besoin de la même dépendance simulée, vous testez des applis déployées (pas juste du code), ou vous avez besoin d'injection de faute/latence au niveau du fil.

Exemple concret

Le mainframe dont notre appli dépendait avait deux semaines d'attente pour des créneaux de test. Une doublure virtuelle WireMock — enregistrée depuis du trafic réel, câblée dans chaque environnement bas — a permis à douze équipes de tester quotidiennement contre « le mainframe », y compris son mode timeout documenté de 30 s, que personne n'avait jamais osé déclencher sur le vrai.

Points clés
  • Tourne sur le réseau, avec état, partagé
  • Mocks : en-processus, par-test
  • Injection latence/faute au niveau du fil
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

La traiter comme du « gros mocking » — la frontière réseau, l'état et l'usage partagé sont les vraies différences.

Copier le lien

Expliquez les tests de charge, de stress, d'endurance (soak) et de pic (spike).

Tests de performancemidsenior

Charge : trafic attendu — tient-il les SLA en normal et en pic ? Stress : au-delà de la capacité — où casse-t-il, et casse-t-il gracieusement ?

Charge : trafic attendu — tient-il les SLA en normal et en pic ? Stress : au-delà de la capacité — où casse-t-il, et casse-t-il gracieusement ? Endurance (soak) : charge normale pendant des heures/jours — fuites, épuisement des connexions, pourrissement lent. Pic (spike) : surtension soudaine — vente flash, notification push — et la récupération après.

Chacun répond à une question métier différente ; nommer laquelle est la partie senior.

Exemple concret

Même système, quatre verdicts : la charge OK à 2× le normal ; le stress a trouvé le pool de la DB s'épuisant à 5× avec des timeouts en cascade (pas gracieux) ; l'endurance a trouvé une fuite de 40 Mo/heure qui OOM-killait le service tous les ~3 jours — expliquant les redémarrages « aléatoires » du week-end ; le pic a montré 90 s d'erreurs après une notification push pendant que l'autoscaling se réveillait.

Points clés
  • Charge=SLA, stress=point de rupture
  • Endurance=fuites dans le temps
  • Pic=surtension + récupération
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Des définitions sans la question métier à laquelle chacun répond — « l'endurance trouve les fuites » bat « l'endurance est un test de longue durée ».

Copier le lien

Pourquoi le temps de réponse moyen est-il une métrique trompeuse ? Qu'utiliser à la place ?

Tests de performancemidsenior

Les moyennes cachent la souffrance : mille requêtes à 100 ms plus dix à 10 secondes font une moyenne de ~200 ms — ça semble bien, dix utilisateurs ont passé un sale moment.

Les moyennes cachent la souffrance : mille requêtes à 100 ms plus dix à 10 secondes font une moyenne de ~200 ms — ça semble bien, dix utilisateurs ont passé un sale moment. La latence est asymétrique, donc la moyenne suit la majorité chanceuse.

Utilisez les percentiles : p50 (typique), p95/p99 (la queue — vos vrais utilisateurs les plus malchanceux), plus le taux d'erreur et le débit ensemble. Les SLO sont écrits en percentiles pour exactement cette raison.

Exemple concret

Le tableau de bord disait moy. 180 ms, le support disait « le checkout est lent ». Le p99 disait la vérité : 8 secondes — environ une requête sur 100 tombait sur un chemin de cache froid. Le corriger a à peine bougé la moyenne et a tué les plaintes entièrement. La moyenne mesurait la foule heureuse ; la queue était là où vivaient les utilisateurs.

Points clés
  • Les moyennes cachent la queue
  • p95/p99 = vraie douleur utilisateur
  • Percentiles + taux d'erreur ensemble
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Savoir « utilisez les percentiles » sans l'histoire arithmétique du POURQUOI la moyenne ment — l'exemple est la réponse.

Copier le lien

Un test de charge montre des temps de réponse qui se dégradent. Comment trouvez-vous le goulot ?

Tests de performancesenior

Suivez la requête à travers les couches, en mesurant à chacune : load balancer → appli (CPU ? threads ?

Suivez la requête à travers les couches, en mesurant à chacune : load balancer → appli (CPU ? threads ? GC ?) → pools de connexions (épuisés ?) → base (requêtes lentes, locks, index manquants) → appels externes → infrastructure (réseau, disque).

Corrélez QUAND la dégradation commence avec CE QUI sature à ce moment — les tableaux de bord ou les traces APM en font des minutes. Le goulot, c'est ce qui atteint son plafond en premier ; corrigez-le et relancez, parce qu'il y en a toujours un suivant.

Exemple concret

Dégradation à ~300 utilisateurs : CPU appli 40 %, CPU DB 30 % — rien d'évidemment chaud. Le graphe du pool de connexions l'a dit : maxé à 50, des requêtes en file d'attente pour une connexion. Pool augmenté, relancé — maintenant la DB était le mur à 700 utilisateurs via une requête non indexée que le profiler a nommée. Deux goulots, un après-midi, zéro devinette.

Points clés
  • Couche par couche, avec des chiffres
  • Corréler le début avec la saturation
  • Corriger, relancer — le plafond suivant apparaît
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Vérifiez la base » par réflexe — parfois juste, mais la méthode est la mesure par couches, pas un suspect favori.

Copier le lien

Pourquoi conteneuriseriez-vous votre environnement de test ?

Conteneurs & infrastructuremidsenior

Déterminisme et jetabilité : la même image épinglée tourne sur chaque laptop et worker CI — le « ça marche sur ma machine » meurt ; les environnements s'allument par run et disparaissent, donc pas de…

Déterminisme et jetabilité : la même image épinglée tourne sur chaque laptop et worker CI — le « ça marche sur ma machine » meurt ; les environnements s'allument par run et disparaissent, donc pas de dérive, pas de pourrissement d'état partagé, et le parallélisme obtient une stack propre par worker.

Testcontainers est le pattern arrivé à maturité : de vrais Postgres/Kafka/Redis démarrés par le test lui-même, à la demande.

Exemple concret

Avant : un serveur « DB de test » partagé, en permanence à moitié cassé par le dernier qui l'a lancé, plus une page wiki d'étapes de setup pour les nouveaux. Après compose + Testcontainers : git clone, une commande, stack identique en 90 secondes — et le canal Slack pour « la DB de staging est down pour d'autres ? » est discrètement devenu inutile.

Points clés
  • Même image partout = pas de dérive
  • Par-run, jetable, parallel-safe
  • Testcontainers : vraies deps à la demande
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Le hand-waving « Docker veut dire cohérence » — nommez le mécanisme : images épinglées, stacks par-run, mort de l'environnement mutable partagé.

Copier le lien

Concevez un pipeline CI/CD pour une équipe qui livre chaque jour. Qu'est-ce qui tourne où ?

Pipelines CI/CDsenior

Étagé par vitesse de feedback. Sur PR (bloquant, <10 min) : lint, unitaires, tests de service avec deps conteneurisées, vérifs de contrat, le smoke pack E2E.

Étagé par vitesse de feedback. Sur PR (bloquant, <10 min) : lint, unitaires, tests de service avec deps conteneurisées, vérifs de contrat, le smoke pack E2E. Au merge → déploiement staging : intégration plus complète + parcours critiques, puis auto-promotion. Déploiement production : canary avec vérifs santé/SLO automatisées, auto-rollback. De nuit : régression complète, baseline de performance, scans de sécurité.

Principe : tout ce qui bloque doit être rapide ET digne de confiance — un seul flake dans la porte et les développeurs la contournent.

Exemple concret

La décision de conception qui a rendu la livraison quotidienne réelle ici : le pack E2E sur les PR fait douze tests, pas deux cents — choisis par « bloquerait-on un déploiement si celui-ci échouait ? ». La profondeur est passée de nuit. Porte PR : 8 minutes, digne de confiance, jamais contournée ; la porte précédente de 40 minutes avait une culture --no-verify en un mois.

Points clés
  • PR : porte bloquante rapide <10min
  • Merge : staging + parcours ; canary vers prod
  • Profondeur de nuit ; confiance ou contournement
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Un seul pipeline géant qui lance tout à chaque commit — la conception qui garantit soit la lenteur, soit le contournement.

Copier le lien

Comment rendre une suite de tests sûre à exécuter en parallèle ?

Exécution parallèlemidsenior

Tuez toute chose mutable partagée : données uniques par test (UUID/run-id, factories), pas de comptes partagés, pas de ports/fichiers/globals fixes, pas de dépendances d'ordre, état externe isolé ou…

Tuez toute chose mutable partagée : données uniques par test (UUID/run-id, factories), pas de comptes partagés, pas de ports/fichiers/globals fixes, pas de dépendances d'ordre, état externe isolé ou namespacé par worker.

Puis prouvez-le : lancez en ordre mélangé et en parallèle en CI comme norme — les échecs qui apparaissent sont votre carte de couplage. La sûreté parallèle est une propriété qu'on impose, pas une option qu'on bascule.

Exemple concret

Basculer pytest -n 8 sur une suite « indépendante » a produit 23 échecs — le recensement du couplage : un login admin partagé (session invalidée entre workers), un /tmp/report.pdf en dur, des tests lisant un compteur qu'un autre test incrémentait. Deux semaines de corrections ordonnées par fréquence ; le parallèle est le défaut depuis, et est resté vert.

Points clés
  • Données uniques, pas de comptes partagés
  • Pas de ports/fichiers/ordre fixes
  • Mélange+parallèle en CI le prouve
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Utilisez pytest-xdist » — le flag est trivial ; l'ingénierie est l'isolation qui rend le flag sûr.

Copier le lien

Comment shardriez-vous efficacement une grande suite de tests sur des workers ?

Exécution parallèlesenior

Équilibrez par durée enregistrée, pas par nombre de tests : faites du bin-packing pour que chaque shard finisse ensemble — le temps mural de la suite est son shard le plus lent.

Équilibrez par durée enregistrée, pas par nombre de tests : faites du bin-packing pour que chaque shard finisse ensemble — le temps mural de la suite est son shard le plus lent. Alimentez avec les données de timing des runs précédents, rééquilibrez continuellement, et gardez les shards assez déterministes pour déboguer.

Raffinements : mettez les instables hors du signal de timing, séparez les longs FICHIERS de test si le runner sharde par fichier, et surveillez la variance de fin-de-shard comme métrique de santé.

Exemple concret

Découpage par nombre de 2 000 tests sur 20 workers : 19 ont fini en ~6 minutes, un a traîné 14 — il avait tiré les monstres E2E. Bin-packing par durée depuis les timings du dernier run : tous les shards à 30 secondes les uns des autres, temps mural en baisse de 40 % avec zéro nouveau matériel.

Points clés
  • Bin-pack par historique de durée
  • Temps mural = shard le plus lent
  • Rééquilibrer continuellement
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Découper par nombre ou par alphabet — le seul shard lent EST le temps d'exécution de la suite, et ça se voit à la première question retour.

Copier le lien

Étant donné un tableau d'entiers, trouvez si une valeur apparaît plus d'une fois. Quelle est votre approche et sa complexité ?

Code & structures de donnéesjuniormid

Parcourez le tableau une fois, en gardant un set des valeurs vues ; si la valeur courante est déjà dans le set, il y a un doublon.

Parcourez le tableau une fois, en gardant un set des valeurs vues ; si la valeur courante est déjà dans le set, il y a un doublon. O(n) en temps, O(n) en espace — chaque élément vérifié une fois, opérations de set en O(1).

Énoncez les alternatives pour montrer l'éventail : trier d'abord → O(n log n) en temps mais O(1) d'espace supplémentaire (si en place) — le compromis qui vaut la peine d'être dit à voix haute. La force brute par paires est en O(n²) — nommez-la seulement pour la rejeter.

Exemple concret

def has_duplicate(nums):
    seen = set()
    for n in nums:
        if n in seen:
            return True
        seen.add(n)
    return False

Coup d'entretien : énoncez temps/espace AVANT qu'on vous le demande, puis proposez « si la mémoire est serrée, trier-puis-parcourir échange du temps contre de l'espace » — cette phrase est la différence entre résoudre et faire de l'ingénierie.

Points clés
  • Set de vus → O(n)/O(n)
  • Variante tri : O(n log n)/O(1)
  • Énoncer la complexité sans qu'on demande
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Sauter au code sans énoncer la complexité — dans les loops SDET l'analyse est notée aussi lourdement que la boucle.

Copier le lien

De combien de connaissances en structures de données et algorithmes un SDET a-t-il vraiment besoin ?

Code & structures de donnéesmidsenior

Solide sur l'ensemble de travail : tableaux, chaînes, hash maps/sets, listes, arbres de base ; deux pointeurs, fenêtre glissante, BFS/DFS au niveau facile-à-moyen ; et une aisance en big-O — parce…

Solide sur l'ensemble de travail : tableaux, chaînes, hash maps/sets, listes, arbres de base ; deux pointeurs, fenêtre glissante, BFS/DFS au niveau facile-à-moyen ; et une aisance en big-O — parce que le code de framework a de vrais choix de performance dedans.

Pas nécessaire : le golf de programmation dynamique, les internes des arbres rouge-noir, les astuces de compétition. Le cadrage honnête : assez de DSA pour passer un screen développeur mid, appliqué surtout à des problèmes d'infra de test — parsing de logs, génération de données, diffing de résultats.

Exemple concret

Là où la DSA est apparue dans mon vrai code de test : dédupliquer 40k empreintes d'échec (hash map), matcher attendu-vs-réel indépendamment de l'ordre (sets), parcourir un arbre de schéma JSON pour des diffs de contrat (DFS), et une fenêtre glissante sur les temps de réponse pour un détecteur de rafales d'instabilité. Zéro LeetCode-hard ; des hash maps tous les jours.

Points clés
  • Maps/sets/chaînes + patterns faciles-moyens
  • Big-O pour les choix de framework
  • Appliqué à l'infra, pas aux casse-têtes
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

L'un ou l'autre extrême — « aucune nécessaire » rate le screen ; « bûcher les LeetCode-hard » gaspille des mois qu'un SDET devrait passer sur des compétences d'infra.

Copier le lien

Décrivez comment vous aborderiez un problème de code jamais vu en entretien.

Code & structures de donnéesjuniormidsenior

Une méthode visible : reformulez le problème et confirmez ; clarifiez entrées, cas limites, contraintes (trié ? vide ?

Une méthode visible : reformulez le problème et confirmez ; clarifiez entrées, cas limites, contraintes (trié ? vide ? taille ?) ; travaillez un petit exemple à la main ; énoncez la force brute et sa complexité, puis améliorez ; codez en narrant ; puis testez vous-même — cas normal, limite, vide — avant de déclarer terminé.

Ce dernier pas, sans qu'on le demande, est la signature QA, et les examinateurs le remarquent.

Exemple concret

Le pas d'auto-test en action : fini un problème de chaîne, puis dit « laissez-moi essayer chaîne vide, un seul caractère, tout en doublons » — le cas tout-en-doublons a exposé un off-by-one que j'ai corrigé sur-le-champ. Le retour de l'examinateur plus tard : ce moment de test spontané a porté le round plus que la solution elle-même.

Points clés
  • Reformuler → clarifier → exemple
  • Force brute + complexité, puis améliorer
  • Testez votre propre code, sans qu'on demande
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Plonger dans le code en pleine énonciation de la question — la méthode EST ce qu'on interviewe ; le problème n'est que la scène.

Copier le lien

Quels design patterns sont vraiment utiles en automatisation de tests ?

Design patternsmidsenior

L'ensemble de travail : Page Object/Component (structure UI), Builder/Factory (données de test : aUser().withExpiredCard().build()), Facade (une API propre au-dessus d'un setup en désordre), Strategy…

L'ensemble de travail : Page Object/Component (structure UI), Builder/Factory (données de test : aUser().withExpiredCard().build()), Facade (une API propre au-dessus d'un setup en désordre), Strategy (échanger les implémentations navigateur/env), Singleton — avec parcimonie (config ; dangereux pour les drivers en parallèle), Observer (listeners pour les artefacts à l'échec).

Les patterns résolvent la duplication et le coût du changement ; nommer quel problème chacun résout dans VOTRE framework est la réponse.

Exemple concret

Le builder qui a gagné sa place : les tests de commande avaient besoin d'utilisateurs dans une douzaine d'états — anonyme, VIP-avec-carte-expirée, en plein essai. aUser().vip().withExpiredCard().build() a rendu l'intention des données de chaque test lisible en une ligne, et quand l'API utilisateur a changé, un seul builder a changé au lieu de quatre-vingt-dix tests.

Points clés
  • POM, Builder, Factory, Facade, Strategy
  • Singleton : config oui, driver prudence
  • Pattern = solution nommée à un coût
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Lister des noms de GoF sans un usage en code de test pour chacun — « Observer » ne veut rien dire ; « listener de capture à l'échec » veut dire que vous en avez bâti un.

Copier le lien

Comment les principes SOLID s'appliquent-ils au code de test ?

Design patternssenior

Directement, avec des sens à forme de test. S : un page object fait la structure UI OU le setup de données, jamais les deux ; un test vérifie un comportement.

Directement, avec des sens à forme de test. S : un page object fait la structure UI OU le setup de données, jamais les deux ; un test vérifie un comportement. O : ajoutez un nouveau navigateur/env sans éditer chaque classe — factories et config. L : toute implémentation de votre interface client doit être interchangeable (réel vs fake). I : de petites fixtures ciblées plutôt que des god-helpers. D : les tests dépendent d'abstractions — une interface ApiClient — pas d'un câblage concret.

Le bénéfice est le même que dans le code de prod : les coûts de changement restent locaux.

Exemple concret

Le D en pratique : les tests parlaient à PaymentClient, une interface. Vraie implémentation pour les runs d'intégration, fake pour les runs locaux rapides — échangée par fixture, zéro édition de test. Quand le SDK du fournisseur a changé, une seule classe d'adaptateur a changé. La suite qui codait le SDK en dur partout a passé un sprint sur la même migration.

Points clés
  • S : un job par classe/test
  • O/D : échanger via config, pas éditions
  • Petites fixtures plutôt que god-helpers
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Réciter les définitions de SOLID sans une seule traduction en code de test — la question est la traduction.

Copier le lien

Que cherchez-vous en relisant du code de production en tant que SDET ?

Revue de codesenior

Le prisme testabilité-et-risque que les développeurs survolent : chemins d'erreur (que se passe-t-il quand l'appel échoue — est-ce géré, loggé, remonté ?), entrées limites (null/vide/borne),…

Le prisme testabilité-et-risque que les développeurs survolent : chemins d'erreur (que se passe-t-il quand l'appel échoue — est-ce géré, loggé, remonté ?), entrées limites (null/vide/borne), observabilité (verra-t-on ça échouer en prod ?), testabilité (dépendances injectables, ou singletons câblés en dur ?), test-ids sur la nouvelle UI, et « quels tests existants ce changement invalide-t-il ? ».

La revue SDET n'est pas une police du style — c'est poser, plus tôt, les questions que la revue d'incident poserait.

Exemple concret

Le commentaire de revue qui a payé le siège : une nouvelle boucle de retry de paiement n'avait pas de plafond — sur une panne du fournisseur elle martèlerait à l'infini. « Qu'est-ce qui arrête ça à la tentative 10 000 ? » est devenu un max-retries + backoff avant le merge. C'est le prisme SDET : pas « est-ce que ça marche » mais « comment ça échoue ».

Points clés
  • Chemins d'erreur et entrées limites
  • Observabilité + testabilité
  • Demander comment ça ÉCHOUE
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Relire comme un linter — nommage et formatage — pendant que la boucle de retry sans plafond passe tranquillement.

Copier le lien

Qui devrait écrire les tests unitaires — les développeurs ou la QA ?

Rôle & périmètremidsenior

Les développeurs — ils connaissent l'intention du code, les tests tournent avec leur build, et le feedback à la TDD ne marche qu'au moment de l'écriture.

Les développeurs — ils connaissent l'intention du code, les tests tournent avec leur build, et le feedback à la TDD ne marche qu'au moment de l'écriture. Des tests unitaires écrits par quelqu'un d'autre arrivent tard et testent des suppositions.

Le rôle du SDET : rendre ces tests BONS — les relire, pousser la couverture là où vit le risque, bâtir les harnais et les patterns, et tenir la ligne dans le pipeline. La propriété de la qualité est partagée ; la propriété des tests unitaires est celle de l'auteur.

Exemple concret

L'anti-pattern dans lequel on m'a embauché une fois : une politique « la QA écrit tous les tests », avec des tests unitaires écrits des semaines après le code par des gens qui rétro-ingénieraient l'intention. La couverture était de 80 % ; les assertions étaient des suppositions. Inverser la propriété — les devs écrivent, le SDET relit et coache — a divisé le nombre par deux et attrapé plus de bugs en un trimestre.

Points clés
  • Les devs écrivent — intention + timing
  • Le SDET relit, coache, garde la porte
  • Les tests unitaires tardifs testent des suppositions
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« La QA les écrit pour que les devs se concentrent » — la réponse qui garantit des tests unitaires tardifs et aveugles à l'intention.

Copier le lien

Quelle est la différence entre couverture de lignes, de branches et de mutation ?

Couverture & qualitésenior

Ligne : cette ligne s'est-elle exécutée ? Branche : les DEUX côtés de chaque if ont-ils tourné ? — plus strict, attrape le else non testé.

Ligne : cette ligne s'est-elle exécutée ? Branche : les DEUX côtés de chaque if ont-ils tourné ? — plus strict, attrape le else non testé. Mutation : modifiez le code (inverser une comparaison, supprimer un appel) et voyez si un test échoue — mesurant si les tests ATTRAPERAIENT vraiment des bugs, pas si le code a tourné.

L'échelle de l'honnêteté : la ligne dit que le code s'est exécuté, la branche dit que les chemins se sont exécutés, la mutation dit que les tests peuvent détecter un changement. Seule la dernière mesure la QUALITÉ des tests.

Exemple concret

Un module de paiements : 95 % de couverture de lignes, applaudissements. Run de mutation : 40 % des mutants ont survécu — dont passer >= à > dans le seuil de remise avec chaque test toujours vert. Les tests exécutaient le code et n'affirmaient presque rien à son sujet. Cet écart entre 95 et 40 est toute l'histoire du théâtre de la couverture.

Points clés
  • Ligne : exécutée ; branche : les deux chemins
  • Mutation : les tests ATTRAPERAIENT-ils un bug ?
  • Lignes élevées + mutants survivants = théâtre
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Expliquer ligne vs branche et faire du hand-waving sur la mutation — la mutation est celle qui mesure la chose que tout le monde suppose que la couverture mesure.

Copier le lien

Votre manager veut 100 % de couverture de code comme KPI. Comment répondez-vous ?

Couverture & qualitésenior

Réorientez, ne refusez pas : la couverture comme KPI invite au jeu — des tests sans assertions atteignent n'importe quel chiffre — et les derniers 15 % (getters, glue, config) coûtent le plus tout en…

Réorientez, ne refusez pas : la couverture comme KPI invite au jeu — des tests sans assertions atteignent n'importe quel chiffre — et les derniers 15 % (getters, glue, config) coûtent le plus tout en attrapant le moins.

Contre-proposez quelque chose de mesurable et d'honnête : couverture élevée sur les lignes changées par PR, spot-checks de mutation sur les modules critiques, tendance des défauts échappés, taux d'instabilité. Dites oui à l'objectif (la confiance), non au proxy (un seul pourcentage).

Exemple concret

Vu la version KPI se dérouler : l'équipe a atteint 100 % en un trimestre — en générant des tests qui appelaient tout et n'affirmaient rien. Couverture 100 %, défauts échappés inchangés, et maintenant mille tests dénués de sens à maintenir. Le chiffre est arrivé ; la confiance qu'il était censé représenter n'est jamais venue.

Points clés
  • Les cibles se font jouer — Goodhart
  • Lignes-changées + mutation à la place
  • Oui à la confiance, non au proxy
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Soit saluer le KPI, soit faire un cours sur la loi de Goodhart sans alternative — le job est la contre-proposition.

Copier le lien

Qu'est-ce que le test de mutation, et l'utiliseriez-vous vraiment ?

Couverture & qualitésenior

Des outils (PIT, Stryker, mutmut) sèment de petits changements de code — comparaisons inversées, appels supprimés, constantes modifiées — et lancent vos tests : un mutant que votre suite tue est bon…

Des outils (PIT, Stryker, mutmut) sèment de petits changements de code — comparaisons inversées, appels supprimés, constantes modifiées — et lancent vos tests : un mutant que votre suite tue est bon ; un mutant survivant est une forme de bug que vos tests rateraient.

L'utiliserais-je ? Oui, chirurgicalement : modules critiques (argent, auth, tarification) selon un planning ou au changement — pas sur toute la suite en CI, parce que c'est lourd en calcul. C'est un outil d'audit, pas une porte.

Exemple concret

Premier run mutmut sur notre module de tarification : 61 mutants, 19 survivants — l'un était « supprimer l'appel d'arrondi » avec tous les tests verts, ce qui expliquait un vrai bug de dérive de centimes du trimestre précédent. Quatre heures à renforcer les assertions ont tué 17 des 19. Les tests de ce module ont attrapé deux régressions depuis.

Points clés
  • Semer des bugs, voir si les tests remarquent
  • Survivants = angles morts, listés
  • Usage chirurgical sur modules critiques
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Ça a l'air académique » — c'est le seul outil courant qui mesure si vos tests testent ; le rejeter se lit comme ne l'avoir jamais lancé.

Copier le lien

Quelles portes qualité mettriez-vous dans un pipeline, et qu'est-ce qui devrait vraiment bloquer un merge ?

Pipelines CI/CDsenior

Bloquant sur PR : build, vérifs lint/type, tests unitaires + de service, vérification de contrat, scan de sécurité sur les dépendances (échec sur CVE critiques connues), le smoke pack E2E, fil-piège…

Bloquant sur PR : build, vérifs lint/type, tests unitaires + de service, vérification de contrat, scan de sécurité sur les dépendances (échec sur CVE critiques connues), le smoke pack E2E, fil-piège de couverture-sur-lignes-changées. Observant, pas bloquant : régression complète, baselines de performance, scores de mutation — rapportés, tracés, actionnés, mais pas dressés entre un dev et un merge.

La discipline : une porte bloquante doit être rapide et digne de confiance ; chaque flake dedans dévalue la monnaie de tout le pipeline.

Exemple concret

On a déplacé les vérifs de performance de bloquantes à observées après deux semaines de fausses alertes — le bruit du runner CI faisait crier au loup les portes de latence, et les gens se sont mis à tamponner les overrides. En tendance de nuit avec alerting, les mêmes vérifs ont attrapé une vraie régression de 30 % un mois plus tard — et ont été crues, parce qu'elles avaient cessé de mentir.

Points clés
  • Bloquer : rapide, déterministe, digne de confiance
  • Observer : lent/bruyant mais précieux
  • Porte instable = monnaie dévaluée
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Tout bloquer « par sécurité » — le pipeline qui prend 90 minutes et se fait contourner est moins sûr que celui de 10 minutes qu'on respecte.

Copier le lien

Comment testeriez-vous une migration de base de données ?

Données & messageriesenior

Au-delà de « ça a tourné » : justesse — comptes de lignes, checksums/agrégats et spot-diffs entre ancienne et nouvelle formes ; intégrité — contraintes, clés étrangères, rien d'orphelin ; le rollback…

Au-delà de « ça a tourné » : justesse — comptes de lignes, checksums/agrégats et spot-diffs entre ancienne et nouvelle formes ; intégrité — contraintes, clés étrangères, rien d'orphelin ; le rollback — exécutez-le vraiment, ne faites pas que faire confiance à l'existence du script ; performance à l'échelle de production — une migration instantanée sur 10k lignes de staging peut verrouiller une table de 50M de lignes une heure ; et l'appli pendant la migration — ancien code contre nouveau schéma (ou le pattern expand/contract) pour des déploiements sans coupure.

Exemple concret

Le presque-accident qui a écrit cette checklist : une migration de type de colonne testait bien sur les 8k lignes de staging. Contre une copie de taille production ça a pris 47 minutes en tenant un lock de table — le checkout aurait été à terre tout ce temps. Réécrite en backfill en ligne, par lots ; la répétition à l'échelle est désormais non négociable pour toute migration touchant des tables chaudes.

Points clés
  • Comptes + checksums + intégrité
  • Exécuter le rollback, à l'échelle
  • Ancienne appli vs nouveau schéma (expand/contract)
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Lancez-la en staging et vérifiez que ça a marché » — la taille des données de staging en fait la répétition de rien.

Copier le lien

Comment testez-vous un système événementiel utilisant une file de messages comme Kafka ?

Données & messageriesenior

Testez les garanties, pas juste la plomberie : les producteurs émettent les bons événements (schéma + contenu — consommez et affirmez) ; les consommateurs sont idempotents (redélivrez le même…

Testez les garanties, pas juste la plomberie : les producteurs émettent les bons événements (schéma + contenu — consommez et affirmez) ; les consommateurs sont idempotents (redélivrez le même événement — exactement un effet) ; les hypothèses d'ordre tiennent au sein des partitions ; les échecs routent vers retries/DLQ plutôt que de disparaître ; et le lag sous charge reste sain.

L'asynchrone a besoin d'assertions asynchrones : poll-jusqu'à-cohérent avec timeouts, jamais sleep-et-espère. Testcontainers Kafka rend tout ça exécutable par-build.

Exemple concret

Le bug que cette approche attrape à chaque fois : order-service a redélivré un événement payment-completed après un redémarrage de consommateur, et le service de fidélité a accordé les points deux fois. Le test qui le garde maintenant fait trois lignes d'intention : publier l'événement, le publier encore, affirmer points == une fois. Chaque consommateur reçoit ce test comme template.

Points clés
  • Idempotence du consommateur : test de redélivraison
  • Schéma/contrat sur les événements
  • Chemins DLQ + assertions par polling
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Ne tester que le happy path publier-consommer — les systèmes événementiels gagnent leur complexité dans la redélivraison, l'ordre et l'échec, là où les tests appartiennent.

Copier le lien

Quel test de sécurité devrait faire partie d'un processus QA normal ?

Tests de sécuritémidsenior

La couche sous le pentesting est le job de la QA : authz sur chaque endpoint (l'ID d'un autre utilisateur → 403 — chasse à l'IDOR), gestion des entrées (payloads d'injection dans l'ensemble de test…

La couche sous le pentesting est le job de la QA : authz sur chaque endpoint (l'ID d'un autre utilisateur → 403 — chasse à l'IDOR), gestion des entrées (payloads d'injection dans l'ensemble de test standard), coutures d'authentification (expiration, révocation, rate limits), hygiène des secrets (rien dans les logs, les URL ou le stockage client), scan de dépendances en CI, et headers de sécurité/flags de cookies comme vérifs automatisées.

Cadré comme conception de test : des cas d'abus à côté des cas d'usage, à chaque fonctionnalité.

Exemple concret

Balayage authz de routine sur un nouvel endpoint d'export : changez l'ID de compte dans la requête — le CSV complet des clients d'une autre entreprise. Aucun pentest prévu avant des mois ; la vérif qui l'a attrapé était un pattern de test permanent de deux lignes appliqué à chaque nouvel endpoint. C'est la sécurité de la couche QA : sans gloire, attrapant constamment des vrais.

Points clés
  • Balayage IDOR sur chaque endpoint
  • Ensemble d'injection + coutures d'auth
  • Secrets/logs + CVE de dépendances en CI
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« La sécurité est le job de l'équipe sécurité » — la réponse qui livre l'IDOR que votre test de deux lignes aurait attrapé.

Copier le lien

Qu'est-ce que l'observabilité, et comment change-t-elle votre façon de tester ?

Observabilitésenior

La capacité du système à s'expliquer depuis ses sorties — logs, métriques, traces — pour poser de nouvelles questions à la production sans redéployer.

La capacité du système à s'expliquer depuis ses sorties — logs, métriques, traces — pour poser de nouvelles questions à la production sans redéployer. Le monitoring surveille les modes de défaillance connus ; l'observabilité laisse déboguer les inconnus.

Elle change le test de trois façons : c'est une exigence testable (cette fonctionnalité émet-elle les événements/métriques dont on aurait besoin en incident ?), elle étend le test en production (canaries, portes de release basées SLO), et c'est un outil de débogage pour le système de test lui-même.

Exemple concret

Question de revue d'incident qui a changé notre checklist : « aurait-on pu VOIR ça avant que les utilisateurs le signalent ? ». La réponse était non — le flux en échec ne loggait rien de distinct. Maintenant les stories portent un critère d'acceptation d'observabilité, et la QA vérifie l'émission : cassez le flux en staging, confirmez que l'alerte se déclenche. On teste le détecteur de fumée, pas juste la cuisinière.

Points clés
  • Logs + métriques + traces = tout demander
  • L'observabilité est une exigence à TESTER
  • Cassez-la en staging ; attendez l'alerte
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

La traiter comme du vocabulaire ops — la version SDET est « l'observabilité est une fonctionnalité que je teste et un outil que j'utilise », avec un exemple de chaque.

Copier le lien

Comment les feature flags changent-ils votre stratégie de test ?

Pipelines CI/CDsenior

Ils séparent le déploiement de la release — ce qui déplace du test APRÈS le déploiement, derrière le flag : tester en production sans risque (flag activé pour les comptes de test), déployer…

Ils séparent le déploiement de la release — ce qui déplace du test APRÈS le déploiement, derrière le flag : tester en production sans risque (flag activé pour les comptes de test), déployer progressivement en surveillant les métriques.

Nouvelles obligations : tester les deux états des flags conséquents (off doit rester sûr — c'est le rollback), guetter les interactions entre flags, garder un process d'hygiène des flags (les flags expirés sont des bugs latents), et savoir que le kill-switch marche — basculez-le vraiment.

Exemple concret

Le bug de flag qui enseigne la règle des « deux états » : nouveau checkout derrière un flag, testé à fond ON. Le jour du rollback est venu, flag OFF — et l'ancien chemin a cassé, parce qu'un composant partagé avait dérivé en supposant le nouveau flux. Le rollback ÉTAIT l'incident. Les tests d'état-off sur les flags d'argent sont non négociables depuis.

Points clés
  • Déploiement ≠ release ; tester-en-prod sans risque
  • Les deux états — off est le rollback
  • Hygiène des flags + exercices de kill-switch
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Seulement l'histoire heureuse — les flags comme pure activation. Le bug de rollback en état-off est la moitié que les examinateurs vérifient que vous avez rencontrée.

Copier le lien

Qu'est-ce qu'un déploiement canary ou blue-green, et comment testez-vous avec ?

Pipelines CI/CDsenior

Blue-green : deux environnements identiques ; déployez sur l'inactif, vérifiez, basculez le trafic — le rollback c'est rebasculer.

Blue-green : deux environnements identiques ; déployez sur l'inactif, vérifiez, basculez le trafic — le rollback c'est rebasculer. Canary : nouvelle version sur une petite tranche (1–5 %), surveillez taux d'erreur/latence/métriques métier contre baseline, élargissez ou rollback.

Le rôle du test : définir les vérifs de santé qui gardent la promotion (automatisées, pas au feeling), smoker l'inactif/le canary avant le trafic, et vérifier le chemin de rollback lui-même — les rollbacks non répétés échouent quand on en a le plus besoin.

Exemple concret

Prise du canary depuis l'ensemble de métriques : déploiement à 2 %, métriques techniques propres — mais commandes/min sur la tranche canary tournaient 8 % sous la baseline. Une régression UI avait rendu le champ coupon invisible sur un navigateur ; aucun test ne l'avait, la métrique métier si. L'auto-rollback s'est déclenché avant le troisième café. C'est du test étendu en production.

Points clés
  • Blue-green : bascule ; canary : tranche + élargir
  • Portes de promotion automatisées, incl. métriques métier
  • Répétez le rollback
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Décrire la mécanique du trafic sans le rôle du test — les portes, le smoke avant-trafic, et l'exercice de rollback sont le contenu SDET.

Copier le lien

En quoi tester une API GraphQL diffère-t-il de tester du REST ?

Tests d'API & de contratsenior

Un seul endpoint, des requêtes infinies — donc le test passe de « par endpoint » à par opération et par resolver : authz au niveau du champ (ce rôle peut-il voir CE champ — la fuite classique),…

Un seul endpoint, des requêtes infinies — donc le test passe de « par endpoint » à par opération et par resolver : authz au niveau du champ (ce rôle peut-il voir CE champ — la fuite classique), limites de profondeur/complexité de requête (DoS par requête imbriquée), performance N+1 des resolvers, forme des erreurs (200 OK avec un tableau errors — vos assertions doivent lire le corps), et évolution de schéma (dépréciations au lieu de versioning).

Le changement mental : le schéma est une énorme surface ; les clients choisissent leur propre tranche.

Exemple concret

La trouvaille spécifique à GraphQL : la requête utilisateur permettait de sélectionner internalNotes — un champ que l'API REST n'exposait jamais. L'authz était vérifiée par-requête, pas par-champ, donc tout utilisateur authentifié pouvait le demander par son nom. Les tests d'autorisation au niveau du champ sur les types sensibles sont devenus un pattern permanent ce jour-là.

Points clés
  • Authz au niveau du champ, pas juste l'endpoint
  • Limites de profondeur/complexité vs DoS
  • Les erreurs arrivent en 200 + errors[]
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Pareil que REST, un seul endpoint » — l'authz de champ, les attaques de complexité et la forme 200-avec-erreurs sont exactement là où GraphQL mord le playbook REST.

Copier le lien

Qu'est-ce que le chaos engineering, et l'utiliseriez-vous ?

System design pour le testsenior

Injecter délibérément de la panne — instances tuées, latence, dépendances coupées — pour vérifier que les promesses de résilience du système tiennent : les retries réessaient, les failovers…

Injecter délibérément de la panne — instances tuées, latence, dépendances coupées — pour vérifier que les promesses de résilience du système tiennent : les retries réessaient, les failovers basculent, les alertes alertent. Piloté par hypothèse et à rayon d'impact limité, pas du vandalisme.

L'utiliserais-je ? Oui, mis à l'échelle du contexte : injection de faute en staging pour chaque fonctionnalité de résilience (c'est juste du test), et des expériences de production contrôlées seulement une fois l'observabilité et le rollback matures. C'est la suite de tests des « -ilités » que tout le monde revendique et que personne ne vérifie.

Exemple concret

Du chaos d'entrée de gamme qui a trouvé de l'or : tuer le service de recommandations en staging — la page produit était censée se dégrader gracieusement. Elle a pendu 30 s à la place : le timeout était configuré mais une boucle de retry se tenait devant. Chaque promesse « on gère cette panne » reçoit désormais le même traitement : prouvez-la en la causant.

Points clés
  • Injecter la panne, vérifier la promesse
  • Hypothèse + rayon d'impact limité
  • Staging d'abord ; la prod demande de la maturité
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Le folklore « Netflix casse la prod au hasard » — la discipline est hypothèse, rayon d'impact et mesure, et ça commence en staging.

Copier le lien

Comment décidez-vous si un bug vaut la peine d'être corrigé avant la release ?

Rôle & périmètresenior

Cadrez-le en risque contre risque — le coût du bug (impact × portée × contournement) contre le coût du correctif SI près de la release (risque de changement, périmètre de re-test, délai).

Cadrez-le en risque contre risque — le coût du bug (impact × portée × contournement) contre le coût du correctif SI près de la release (risque de changement, périmètre de re-test, délai). Ajoutez la réversibilité : peut-on le désactiver par flag, hotfixer demain, ou est-ce gravé dans une release mobile pour des semaines ?

Puis mon vrai job : rendre ce compromis visible au responsable en chiffres clairs, recommander, et enregistrer la décision. La QA possède rarement la décision ; la QA possède toujours son honnêteté.

Exemple concret

Deux bugs, même veille de release : un crash rare dans un rapport legacy (contournement existe, le correctif touche du code partagé — reporté, flaggé, ticketé) et une erreur d'arrondi d'un centime par commande (invisible aux utilisateurs, mais de l'argent et irréversible au volume — release décalée d'un jour). Même étiquette de sévérité sur le papier ; décisions opposées, toutes deux défendables à voix haute.

Points clés
  • Risque du bug vs risque de corriger-maintenant
  • La réversibilité change tout
  • Rendez-le visible ; enregistrez la décision
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Une réponse en tableau de sévérité — la question porte sur le jugement sous pression de release, et « ça dépend » avec des facteurs nommés EST la réponse forte.

Copier le lien

Un test échoue par intermittence en CI. Décrivez votre processus de débogage.

Débogagemidsenior

Les preuves avant les théories : tirez les artefacts CI (trace, capture, vidéo, logs) de plusieurs échecs et comparez-les — même étape à chaque fois, ou dispersé ?

Les preuves avant les théories : tirez les artefacts CI (trace, capture, vidéo, logs) de plusieurs échecs et comparez-les — même étape à chaque fois, ou dispersé ? Puis reproduisez délibérément : lancez-le en boucle dans des conditions proches de la CI (headless, parallèle, mêmes ressources).

Pattern → hypothèse → correctif ciblé : même étape = course de timing là ; seulement-en-parallèle = état partagé ; étapes aléatoires = environnement/ressources. Mettez en quarantaine en attendant pour que l'équipe garde confiance au rouge — et vérifiez si c'est le PRODUIT qui court, pas le test.

Exemple concret

Cinq traces d'échec, un pattern : toujours l'assertion après « save », et toujours à haut parallélisme. L'API de save renvoyait avant que la réplique de lecture rattrape — une vraie course produit, pas un bug de test. Le « test instable » est devenu un ticket de bug de cohérence avec cinq traces attachées. L'ordre du diagnostic compte précisément parce que cette issue est courante.

Points clés
  • Artefacts de plusieurs échecs d'abord
  • Reproduire en boucle en conditions CI
  • Le pattern nomme la classe de cause
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Ajoutez un retry / augmentez le timeout » en première étape — c'est de la suppression ; la question est une question de diagnostic.

Copier le lien

Comment réduiriez-vous une suite de tests de 3 heures à moins de 30 minutes ?

Architecture de testsenior

Mesurez d'abord — rapport de timing, trouvez où vivent les heures. Puis par ordre de rendement : parallélisez (généralement le plus gros pas — nécessite un travail d'isolation) ; descendez les tests…

Mesurez d'abord — rapport de timing, trouvez où vivent les heures. Puis par ordre de rendement : parallélisez (généralement le plus gros pas — nécessite un travail d'isolation) ; descendez les tests d'une couche (des vérifs UI qui sont vraiment des vérifs API/unitaires — souvent un tiers du temps d'exécution) ; tuez le setup dupliqué (login API vs 200 logins UI, fixtures partagées par worker) ; supprimez/fusionnez les tests redondants après un audit de couverture ; séparez par but (smoke bloquant vs profondeur de nuit) pour que la cible de 30 minutes s'applique à ce qui garde les merges.

Exemple concret

Vrais chiffres en faisant exactement ça : 3h04 → mesuré : 40 % étaient des tests UI re-vérifiant des règles métier (déplacés à la couche API : −70 min), login UI par test (storageState : −25 min), puis parallèle 8-way sur le reste (−60 min). Final : 27 minutes bloquant, avec la longue traîne séparée en un run de nuit. Aucun test de valeur perdu — c'est la contrainte qui en fait de l'ingénierie.

Points clés
  • Profiler avant de toucher quoi que ce soit
  • Parallèle + descente de couche = les gros gains
  • Séparer bloquant vs nuit
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Parallélisez-la » comme réponse entière — le parallélisme est un levier, et inutile sur une suite dont les tests ne peuvent tourner indépendamment.

Copier le lien

Comment introduiriez-vous l'automatisation dans une équipe qui n'en a aucune ?

Rôle & périmètresenior

Commencez là où la douleur est la plus forte et le gain le plus rapide : un smoke pack sur le chemin critique, en CI, semaine un — dix tests qui tournent à chaque build et attrapent visiblement des…

Commencez là où la douleur est la plus forte et le gain le plus rapide : un smoke pack sur le chemin critique, en CI, semaine un — dix tests qui tournent à chaque build et attrapent visiblement des choses. Pas une odyssée de framework.

Puis grandissez par valeur démontrée : régression sur les zones qui mordent, couche API à mesure qu'elle se stabilise, enseignez en construisant (pairing, templates) pour que ce soit la capacité de l'équipe, pas votre fief — et rapportez les gains dans le langage de l'équipe : « attrapé avant le merge », « le test de release est passé de 3 jours à 1 ».

Exemple concret

Équipe de testeurs manuels, zéro automatisation, sceptique : la semaine un a été dix tests smoke Playwright câblés en CI — pas encore de page objects, délibérément. La semaine trois, le smoke a attrapé un login cassé avant une démo, et les sceptiques ont demandé comment ajouter des tests. ENSUITE est venue la structure du framework, bâtie avec eux. La séquence l'a vendu ; un mois framework-first aurait produit de l'architecture et zéro croyant.

Points clés
  • Smoke en CI, semaine un
  • La valeur avant l'architecture
  • Enseigner en construisant — pas de fiefs
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Commencer par une matrice de sélection de framework — l'équipe a besoin d'un bug attrapé, pas d'un tableur de comparaison.

Copier le lien

Comment testez-vous une fonctionnalité de machine learning ou propulsée par l'IA ?

System design pour le testsenior

Séparez le déterministe du probabiliste. Déterministe (test normal) : le pipeline, l'extraction de features, les contrats d'API, les replis quand le modèle échoue ou expire.

Séparez le déterministe du probabiliste. Déterministe (test normal) : le pipeline, l'extraction de features, les contrats d'API, les replis quand le modèle échoue ou expire. Probabiliste (nouvelle discipline) : des jeux de données de référence (golden) avec sorties attendues, des métriques de qualité avec seuils au lieu d'asserts exacts (précision ≥ X sur le jeu d'éval), des vérifs de régression entre versions de modèle, une évaluation par tranche biais/limite, et du monitoring en production pour la dérive.

Le changement d'état d'esprit : de « la réponse est-elle correcte » à « la distribution de qualité est-elle acceptable — et stable ».

Exemple concret

Un classifieur de tickets de support : au lieu d'affirmer ticket #123 → « facturation », le job d'éval note chaque version de modèle sur un golden set de 2 000 tickets — précision globale plus par-catégorie, avec une porte dure sur le rappel « remboursement » (le manque coûteux). La version 12 a monté la précision globale mais baissé le rappel remboursement de 9 % — exactement le compromis pour lequel la porte existait. Livraison annulée ; c'est le test ML faisant son job.

Points clés
  • Parties déterministes : tests normaux
  • Golden sets + métriques à seuil
  • Portes par-tranche ; surveiller la dérive
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Affirmer des sorties exactes — le premier flake vous apprend pourquoi ; la discipline est des seuils sur des distributions, pas l'égalité sur des réponses.

Copier le lien

Que feriez-vous dans vos 90 premiers jours comme SDET dans une nouvelle équipe ?

Rôle & périmètresenior

Jours 1–30, apprendre avant de toucher : livrez quelque chose de petit mais réel (un flake corrigé, un test smoke manquant) tout en cartographiant les chemins d'argent du produit, la vraie douleur de…

Jours 1–30, apprendre avant de toucher : livrez quelque chose de petit mais réel (un flake corrigé, un test smoke manquant) tout en cartographiant les chemins d'argent du produit, la vraie douleur de l'équipe (demandez à tous « qu'est-ce qui casse le plus ? »), et le parc de tests existant honnêtement.

31–60, gains ciblés : attaquez la douleur principale — d'habitude instabilité, temps d'exécution, ou un trou de couverture — avec un avant/après mesurable. 61–90, structure : le plan d'amélioration avec les empreintes de l'équipe dessus, des standards convenus en revue, et une métrique en tendance publique (taux d'instabilité, temps de porte PR).

Exemple concret

La question du premier mois qui a tout façonné : « qu'est-ce qui casse le plus ? » — chaque réponse disait la suite de nuit, rouge 4 matins sur 5, ignorée de tous. Corriger ÇA d'abord (quarantaine + top-dix des flakes) a acheté plus de crédibilité que n'importe quel framework ; au jour 90 la suite gardait de nouveau les releases et l'équipe a demandé les standards, plutôt que de les recevoir.

Points clés
  • Apprendre + petit gain réel d'abord
  • Attaquer la douleur la plus forte, la mesurer
  • Structurer avec l'équipe, pas contre elle
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Arriver avec un plan de réécriture de framework sur 90 jours — la question filtre pour l'humilité-avant-le-changement, pas pour l'ambition.

Copier le lien

Comment savez-vous que votre suite de tests est vraiment bonne ?

Couverture & qualitésenior

Par les résultats, pas la taille : défauts échappés en baisse (l'étoile polaire — les bugs que la production trouve et que la suite aurait dû attraper), ratio de détection de défauts (quelle part des…

Par les résultats, pas la taille : défauts échappés en baisse (l'étoile polaire — les bugs que la production trouve et que la suite aurait dû attraper), ratio de détection de défauts (quelle part des vrais bugs la suite attrape en premier), taux d'instabilité proche de zéro (le rouge est cru), vitesse qui garde sans être contournée, et des spot-checks de mutation prouvant que les tests peuvent vraiment échouer.

Le résumé inconfortable : la qualité d'une suite se mesure à ce qui passe à travers, et la plupart des équipes ne regardent jamais.

Exemple concret

L'audit qui a recadré la nôtre : six mois de bugs de production, chacun taggé « la suite aurait-elle dû attraper ça ? » — 60 % oui, et 80 % de CEUX-LÀ regroupés dans deux modules à couverture élevée et assertions faibles. Le nombre de tests disait sain ; la revue des défauts échappés disait exactement où il mentait. Cette revue est désormais trimestrielle.

Points clés
  • Défauts échappés = l'étoile polaire
  • Rouge cru + vitesse non contournée
  • Auditer ce qui est passé à travers
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Répondre par des comptes et de la couverture — la question est « comment SAVEZ-vous », et seules les métriques de résultat savent.

Copier le lien

Racontez une fois où votre test a raté quelque chose d'important. Que s'est-il passé ?

Rôle & périmètremidsenior

Amenez-en une vraie, structurée : ce qui a échappé, le manque spécifique qui l'a permis (pas « pression de temps » — le vrai trou dans la conception du test), le rayon d'impact et le nettoyage, et le…

Amenez-en une vraie, structurée : ce qui a échappé, le manque spécifique qui l'a permis (pas « pression de temps » — le vrai trou dans la conception du test), le rayon d'impact et le nettoyage, et le correctif systémique — ce qui a changé pour que la CLASSE de bug soit couverte, pas juste l'instance.

Notée presque entièrement sur l'appropriation : une phrase d'honnêteté sans blâme sur le manque, trois sur le jugement qui a suivi.

Exemple concret

La mienne : un bug d'arrondi de devise — des commandes en JPY (sans décimales) facturées 100× l'intention pendant un jour. Mon manque : chaque test de paiement utilisait l'USD ; la devise était une constante de fixture que personne ne variait. Correctif au-delà du bug : la devise est devenue une dimension de test de premier ordre (JPY, les trois décimales du KWD, EUR), plus une alerte de réconciliation en production sur l'écart débit-vs-panier. L'alerte a depuis attrapé un bug sans rapport — le correctif systémique a survécu à l'incident.

Points clés
  • Nommer le vrai manque de conception
  • Corriger la classe, pas l'instance
  • Le ton d'appropriation porte la réponse
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Choisir une histoire où vous n'étiez pas vraiment fautif — la question existe pour vous regarder posséder quelque chose, et les esquives sont transparentes.

Copier le lien

Où voyez-vous le rôle QA aller, et comment vous préparez-vous ?

Rôle & périmètremidsenior

Consolidation vers le haut : l'exécution de routine et l'écriture d'artefacts se font automatiser (dernièrement accéléré par l'IA), tandis que le cœur durable grandit — stratégie de test et jugement…

Consolidation vers le haut : l'exécution de routine et l'écriture d'artefacts se font automatiser (dernièrement accéléré par l'IA), tandis que le cœur durable grandit — stratégie de test et jugement du risque, ingénierie qualité à travers le pipeline, tester les nouvelles choses difficiles (fonctionnalités ML, systèmes événementiels), et être la personne qui sait REVOIR des tests générés par machine plutôt que tout écrire à la main.

Préparation, concrètement : profondeur d'ingénierie (le chemin SDET lui-même), aisance en production/observabilité, et utiliser l'IA comme outil de brouillon tout en possédant la couche de jugement qu'elle ne peut pas faire.

Exemple concret

Comment le virage IA atterrit en pratique : je m'en sers pour brouillonner des cas de test et du boilerplate — vitesse de premier jet à peu près doublée — mais la valeur a bougé vers la revue : savoir quels cas générés sont redondants, quel cas limite il a raté (il ne varie jamais la devise…), et quoi NE PAS automatiser. L'outil a rendu le jugement plus précieux, pas moins. C'est le pari que je fais avec mon propre temps d'apprentissage.

Points clés
  • L'exécution s'automatise ; le jugement s'apprécie
  • Ingénierie qualité à travers le pipeline
  • L'IA comme brouillonneur, l'humain comme relecteur
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Soit le catastrophisme (« la QA meurt ») soit le déni (« rien ne change ») — la réponse embauchable est le virage vers lequel vous patinez, avec la preuve que vous avez commencé.

Copier le lien

Pourquoi les équipes de test utilisent-elles Docker, au fond ?

Conteneurs & infrastructuremidsenior

Ça tue le « ça marche sur ma machine ». Docker empaquette l'environnement de test — version du navigateur, drivers, dépendances, config — dans une image qui tourne à l'identique sur votre laptop,…

Ça tue le « ça marche sur ma machine ». Docker empaquette l'environnement de test — version du navigateur, drivers, dépendances, config — dans une image qui tourne à l'identique sur votre laptop, celui d'un collègue, et en CI. Même image, même résultat.

Avant lui, une suite passait en local et échouait en CI à cause d'une version de Chrome ou d'une bibliothèque manquante, et vous y perdiez une journée. Avec Docker, le runner et votre machine exécutent l'environnement identique au bit près, donc une différence d'environnement cesse d'être un suspect.

Exemple concret

Une suite échouait seulement en CI parce que le runner avait Chrome 120 et le dev Chrome 124. Épingler une image Docker Selenium avec une version de navigateur fixe a rendu les deux environnements identiques et l'échec a disparu.

Points clés
  • Empaquette tout l'environnement de test en une image reproductible
  • La même image tourne à l'identique en local et en CI
  • Élimine la dérive d'environnement « ça marche sur ma machine »
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment lancez-vous des tests de navigateur à l'intérieur de Docker ?

Conteneurs & infrastructuremidsenior

Utilisez une image préconstruite qui a déjà le navigateur et le driver — les images officielles Selenium (selenium/standalone-chrome) ou Playwright — pour ne pas installer un navigateur à la main.

Utilisez une image préconstruite qui a déjà le navigateur et le driver — les images officielles Selenium (selenium/standalone-chrome) ou Playwright — pour ne pas installer un navigateur à la main. Lancez en headless, et montez un volume pour extraire captures, vidéos et traces après le run.

Le piège que tout le monde rencontre : Chrome crashe dans un conteneur parce que le /dev/shm par défaut est trop petit. Soit vous l'augmentez (--shm-size=2g), soit vous lancez avec --disable-dev-shm-usage. Ne pas connaître celui-là est le signe de quelqu'un qui n'a jamais vraiment conteneurisé une suite de navigateur.

Points clés
  • Les images préconstruites Selenium/Playwright livrent le navigateur + le driver
  • Headless, avec un volume pour captures/vidéos/traces
  • Augmentez --shm-size ou --disable-dev-shm-usage — le crash Chrome classique
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Ne pas connaître le crash /dev/shm vous trahit — c'est le premier mur que rencontre quiconque lance Chrome dans Docker, donc les examinateurs s'en servent pour vérifier l'expérience réelle.

Copier le lien

Qu'est-ce que Docker Compose vous apporte pour les environnements de test ?

Conteneurs & infrastructuresenior

Compose démarre tout un environnement multi-services depuis un seul fichier — l'appli sous test, sa base, une file de messages, un nœud Selenium — tous mis en réseau ensemble, en une commande.

Compose démarre tout un environnement multi-services depuis un seul fichier — l'appli sous test, sa base, une file de messages, un nœud Selenium — tous mis en réseau ensemble, en une commande. Vos tests obtiennent une vraie stack isolée au lieu de mocks ou d'un staging partagé pour lequel tout le monde se bat.

Le bénéfice est une ardoise propre à chaque run : montez-la, seedez les données, testez, démontez-la. Pas d'état résiduel, pas de « quelqu'un a changé le staging », et la même stack en CI qu'en local. C'est comme ça qu'on rend les tests d'intégration reproductibles.

Points clés
  • Un fichier monte appli + base + deps, en réseau
  • Une vraie stack isolée par run, pas un staging partagé
  • Monter → seeder → tester → démonter ; ardoise propre à chaque fois
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Selenium Grid ou une grid cloud — quand utiliseriez-vous chacune ?

Conteneurs & infrastructuresenior

Selenium Grid (souvent lancé en conteneurs Docker) est votre propre hub avec des nœuds de navigateur — vous le contrôlez, c'est bon marché à l'échelle, et c'est privé.

Selenium Grid (souvent lancé en conteneurs Docker) est votre propre hub avec des nœuds de navigateur — vous le contrôlez, c'est bon marché à l'échelle, et c'est privé. Une grid cloud (BrowserStack, Sauce Labs) loue des navigateurs et de vrais appareils à la demande — pas d'infrastructure à maintenir, une énorme matrice navigateur/OS, mais un coût à la minute.

Règle empirique : Grid auto-hébergée pour des runs parallèles lourds et réguliers où vous voulez le contrôle et un coût bas ; grid cloud quand il vous faut de vrais appareils, des combinaisons navigateur/OS obscures, ou que vous ne voulez pas gérer d'infrastructure. Beaucoup d'équipes utilisent les deux — Grid pour le gros, cloud pour la longue traîne de compatibilité.

Points clés
  • Grid : auto-hébergée, contrôlée, bon marché à l'échelle, privée
  • Grid cloud : vrais appareils à la demande + matrice large, coût à la minute
  • Grid pour le gros régulier ; cloud pour vrais appareils / combinaisons rares
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment Docker rend-il les runs de test en CI reproductibles ?

Conteneurs & infrastructuremidsenior

Le job CI lance vos tests à l'intérieur de la même image épinglée que vous utilisez en local, donc le navigateur, les drivers, le runtime du langage et les bibliothèques sont identiques au bit près…

Le job CI lance vos tests à l'intérieur de la même image épinglée que vous utilisez en local, donc le navigateur, les drivers, le runtime du langage et les bibliothèques sont identiques au bit près partout. Un run vert aujourd'hui se reproduit le mois prochain parce que l'environnement est gelé dans l'image, pas assemblé à neuf à chaque fois.

C'est la différence entre un pipeline instable et un digne de confiance : sans ça, la CI installe la « dernière » version de tout et un bump amont silencieux vous casse du jour au lendemain. Épinglez le tag de l'image (pas :latest) et l'environnement cesse d'être une variable.

Points clés
  • La CI lance les tests dans la même image épinglée qu'en local
  • Environnement gelé dans l'image — reproductible dans le temps
  • Épinglez le tag, jamais :latest, ou un bump amont vous casse
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Un conteneur passe les tests mais le même code échoue sur une VM — où regardez-vous ?

Conteneurs & infrastructuresenior

Les environnements diffèrent quelque part où le conteneur le cache. Vérifiez les écarts évidents : versions navigateur/driver gravées dans l'image vs installées sur la VM, headless vs headed, mémoire…

Les environnements diffèrent quelque part où le conteneur le cache. Vérifiez les écarts évidents : versions navigateur/driver gravées dans l'image vs installées sur la VM, headless vs headed, mémoire disponible et /dev/shm, fuseau horaire et locale, et différences de système de fichiers/permissions.

La méthode est de réduire l'écart : lancez la version exacte du navigateur de la VM en headless en local, ou mieux, lancez les tests dans le même conteneur sur la VM. Reproduire l'écart bat théoriser — la plupart des bugs « seulement sur la VM » sont une version ou une limite de ressource que le conteneur avait discrètement standardisée.

Points clés
  • Comparez les environnements : versions, headless, mémoire/shm, locale
  • Reproduisez en lançant le conteneur SUR la VM
  • La plupart des bugs « seulement ici » sont une version ou une ressource que l'image a standardisée
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Dans un pipeline CI, qu'est-ce qui tourne à quelle étape — par-PR, de nuit, à la release ?

Pipelines CI/CDsenior

Rapide et ciblé à chaque PR : tests unitaires, une suite smoke, linting — des minutes, parce que ça garde le merge et que les gens attendent.

Rapide et ciblé à chaque PR : tests unitaires, une suite smoke, linting — des minutes, parce que ça garde le merge et que les gens attendent. La régression complète et la matrice multi-navigateurs tournent de nuit ou au merge sur main, où un temps d'exécution plus long est acceptable. Les vérifs plus lourdes et lentes — E2E complet, performance, scans de sécurité — vont sur un planning ou avant release.

Le principe est une vitesse de feedback adaptée au rayon d'impact : ce qui bloque un développeur doit être rapide ; ce qui peut prendre une heure tourne là où personne n'attend. Mettre la suite de deux heures à chaque push est comment les équipes apprennent à ignorer la CI.

Points clés
  • Par-PR : unitaires + smoke + lint, des minutes, garde le merge
  • De nuit / au merge : régression complète + multi-navigateurs
  • Planifié / avant-release : E2E, performance, sécurité
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

La suite devient lente en CI. Comment la gardez-vous rapide ?

Pipelines CI/CDsenior

Parallélisez d'abord — répartissez les tests sur des runners ou des threads ; une suite qui tourne en série en 40 minutes peut finir en 5 sur 8 workers.

Parallélisez d'abord — répartissez les tests sur des runners ou des threads ; une suite qui tourne en série en 40 minutes peut finir en 5 sur 8 workers. Puis descendez le travail dans la pyramide : si un test API ou unitaire peut le couvrir, ne dépensez pas un test UI dessus. Séparez les vérifs rapides (par-PR) des lentes (de nuit). Cachez les dépendances et les couches Docker pour ne pas reconstruire le setup à chaque run.

Et corrigez les tests instables plutôt que de les réessayer — les reruns cachent la lenteur et doublent le coût. Le but est que la porte qu'un développeur attend reste sous quelques minutes à mesure que la suite grandit.

Points clés
  • Paralléliser sur runners/threads — le plus gros levier
  • Descendre la couverture dans la pyramide ; cacher deps et couches d'image
  • Séparer les vérifs rapides par-PR des lentes de nuit ; corriger les flakes, pas les réessayer
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Un test est instable en CI. Que faites-vous vraiment à ce sujet ?

Pipelines CI/CDmidsenior

Mesurez-le, puis mettez-le en quarantaine avec une trace écrite — ne réessayez pas en bloc. D'abord lancez-le assez pour obtenir un vrai taux d'échec, pour que « instable » soit un chiffre, pas un…

Mesurez-le, puis mettez-le en quarantaine avec une trace écrite — ne réessayez pas en bloc. D'abord lancez-le assez pour obtenir un vrai taux d'échec, pour que « instable » soit un chiffre, pas un ressenti. Puis marquez-le (un tag de quarantaine qui le sort de la porte de merge), ticketez-le, et donnez-lui un propriétaire, le jour même.

L'anti-pattern est de réessayer automatiquement chaque échec. Les retries cachent le flake, coûtent du temps d'exécution, et apprennent à l'équipe que le rouge veut dire « relance-le » — donc une vraie régression se fait ignorer avec le reste. La quarantaine garde la porte honnête pendant que le correctif est en file ; elle ne supprime pas la couverture en silence.

Points clés
  • Mesurer le vrai taux d'échec avant de le dire instable
  • Quarantaine (tag hors de la porte) + ticket + propriétaire, le jour même
  • Ne pas réessayer en bloc — ça cache les flakes et érode la confiance au rouge
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

« Ajoutez un retry » comme réponse entière. Réessayer est du triage au mieux et une habitude qui aveugle sur la couverture au pire — la réponse senior mesure et met en quarantaine avec un ticket.

Copier le lien

Comment gérez-vous les données de test et les environnements en CI ?

Pipelines CI/CDsenior

Chaque run reçoit des données propres et isolées qu'il possède — seedées via l'API ou une fixture au début, démontées après — jamais une dépendance à un enregistrement partagé maintenu à la main.

Chaque run reçoit des données propres et isolées qu'il possède — seedées via l'API ou une fixture au début, démontées après — jamais une dépendance à un enregistrement partagé maintenu à la main. Les environnements sont provisionnés de façon reproductible (une stack Compose ou un namespace éphémère), pas un seul staging pour lequel chaque pipeline se bat.

Les secrets — clés d'API, identifiants de DB — viennent du magasin de secrets de la CI injectés au moment du run, jamais committés. Tout l'intérêt est que deux runs, ou deux jobs parallèles, ne peuvent pas corrompre l'état l'un de l'autre ni fuiter des identifiants.

Points clés
  • Données isolées par run : seeder au setup, démonter après
  • Environnements reproductibles, pas un seul staging partagé
  • Secrets depuis le magasin CI au moment du run, jamais committés
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Qu'est-ce qui fait un bon rapport de test CI ?

Pipelines CI/CDmidsenior

Il répond à « qu'est-ce qui a cassé et pourquoi » sans ouvrir un terminal. Comptes de réussite/échec et durée en haut, puis chaque échec avec son assertion, et les artefacts qui permettent de le…

Il répond à « qu'est-ce qui a cassé et pourquoi » sans ouvrir un terminal. Comptes de réussite/échec et durée en haut, puis chaque échec avec son assertion, et les artefacts qui permettent de le déboguer — capture, vidéo ou trace, et logs — attachés, pas décrits. Des tendances dans le temps signalent un test qui devient lentement plus instable.

Le test est de savoir si un coéquipier peut trier un build rouge depuis le seul rapport. S'il doit relancer en local pour comprendre un échec, le rapport a échoué. Publiez-le là où l'équipe regarde déjà — la PR, le tableau de bord CI — pas un fichier que personne n'ouvre.

Points clés
  • Comptes + durée + l'assertion de chaque échec, en un coup d'œil
  • Artefacts de debug attachés : capture, vidéo/trace, logs
  • Trier depuis le seul rapport ; publier là où l'équipe regarde
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment concevriez-vous un framework d'automatisation de tests de zéro ?

Architecture de testsenior

En couches, chacune avec un job. Une couche core/util (setup du driver, attentes, config). Une couche page/service qui enveloppe l'appli (Page Objects pour l'UI, une couche client pour l'API) pour…

En couches, chacune avec un job. Une couche core/util (setup du driver, attentes, config). Une couche page/service qui enveloppe l'appli (Page Objects pour l'UI, une couche client pour l'API) pour que les sélecteurs et les endpoints vivent en un seul endroit. Une couche de test qui se lit comme une intention et affirme. Les données gérées par fixtures/factories, la config depuis l'environnement, les résultats dans un rapport, le tout lancé en CI.

Le test que j'appliquerais : un changement d'UI touche une seule classe de page, un nouvel endpoint est une seule méthode de client, et un test énonce ce qu'il vérifie, pas comment. Si un changement de sélecteur ondule dans cinquante tests, le découpage en couches est mauvais.

Points clés
  • Couches : core/util · page-ou-service · tests · données · config · reporting
  • Sélecteurs/endpoints définis une fois, derrière une API au niveau intention
  • Un changement touche une couche ; les tests expriment le quoi, pas le comment
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment structurez-vous les données de test — fixtures, factories, ou seeding ?

Architecture de testsenior

Utilisez les trois pour ce à quoi chacun est bon. Les fixtures donnent à un test son cycle de vie setup/teardown (une session connectée, un fichier temporaire).

Utilisez les trois pour ce à quoi chacun est bon. Les fixtures donnent à un test son cycle de vie setup/teardown (une session connectée, un fichier temporaire). Les factories construisent des objets avec des valeurs par défaut sensées et seuls les champs qui importent au test surchargés — makeUser(role="admin") — pour que les tests ne soient pas enfouis sous du boilerplate. Le seeding met les données dans le système en amont, via l'API ou la DB, pour qu'un test ait de quoi agir.

La règle à travers les trois est l'isolation : un test crée ce dont il a besoin et nettoie, pour que rien ne dépende d'un enregistrement partagé. C'est ce qui garde la suite parallel-safe et répétable.

Points clés
  • Fixtures pour le cycle de vie, factories pour objets-avec-défauts, seeding pour données de départ
  • Surcharger seulement les champs qui importent au test
  • Chaque test possède et nettoie ses données — la règle d'isolation
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment gérez-vous la configuration et les secrets à travers les environnements ?

Architecture de testmidsenior

La config (URL de base, timeouts, quel environnement) vient de l'extérieur du code — variables d'environnement ou fichiers de config par-environnement que le run sélectionne — jamais codée en dur,…

La config (URL de base, timeouts, quel environnement) vient de l'extérieur du code — variables d'environnement ou fichiers de config par-environnement que le run sélectionne — jamais codée en dur, pour que la même suite tourne contre dev, staging ou un conteneur en changeant une seule entrée. Les secrets (clés d'API, identifiants) viennent d'un magasin de secrets ou de variables d'env injectées par la CI au moment du run, et ne touchent jamais le repo.

Le test : passer de local à CI à un nouvel environnement est un changement de config, pas un changement de code. Et un grep du repo pour un vrai identifiant ne renvoie rien.

Points clés
  • Config depuis variables d'env / fichiers par-env, sélectionnée au run
  • Secrets depuis un magasin ou la CI, injectés au run — jamais committés
  • Nouvel environnement = changement de config, pas de code
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Un identifiant committé — même dans de la « simple config de test » — est un drapeau rouge instantané. Les secrets appartiennent au magasin de la CI, injectés au run, jamais dans le repo.

Copier le lien

Quels sont les compromis du Page Object Model face à une approche screenplay/composant ?

Architecture de testsenior

Le Page Object Model associe une classe à chaque page/composant, tenant ses sélecteurs et ses actions — simple, universellement compris, et le bon défaut.

Le Page Object Model associe une classe à chaque page/composant, tenant ses sélecteurs et ses actions — simple, universellement compris, et le bon défaut. Sa faiblesse se voit à l'échelle : les classes de page enflent, et les interactions réutilisables se dupliquent entre les pages.

Le screenplay (des acteurs accomplissant des tâches) et les modèles à base de composants composent de petites interactions réutilisables au lieu de classes à taille de page — plus flexibles pour de grandes suites, mais plus de concepts à apprendre et plus faciles à sur-ingénierer. Réponse honnête : le POM pour la plupart des équipes ; ne saisissez les alternatives que quand le POM peine visiblement sous la duplication et les classes de page géantes.

Points clés
  • POM : classe par page, simple, universel — le bon défaut
  • Screenplay/composant : tâches composables, meilleur à l'échelle, plus de complexité
  • Commencez par POM ; ne changez que quand la duplication/l'enflure le force
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Quels sont les principaux types de test de performance ?

Tests de performancemid

Charge — trafic attendu, tient-il le coup. Stress — au-delà de la limite, où et comment casse-t-il. Pic (spike) — une surtension soudaine, survit-il et récupère-t-il.

Charge — trafic attendu, tient-il le coup. Stress — au-delà de la limite, où et comment casse-t-il. Pic (spike) — une surtension soudaine, survit-il et récupère-t-il. Endurance (soak) — charge soutenue sur des heures, fuit-il de la mémoire ou se dégrade-t-il.

Chacun répond à une question différente : la charge prouve le jour normal, le stress trouve le plafond, le pic teste un lancement ou une vente, l'endurance attrape la fuite lente qui n'apparaît qu'après quatre heures. Nommer lequel un scénario réclame est le signe que vous l'avez fait, pas juste lu.

Points clés
  • Charge : trafic attendu · Stress : au-delà de la limite
  • Pic : surtension soudaine + récupération · Endurance : soutenue, trouve les fuites
  • Choisir le type par la question — plafond, lancement, ou fuite lente
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Quelles métriques de performance comptent, et pourquoi pas juste le temps de réponse moyen ?

Tests de performancesenior

Le débit (requêtes/sec), le taux d'erreur sous charge, l'usage des ressources (CPU, mémoire), et les percentiles de latence — p95 et p99, pas la moyenne.

Le débit (requêtes/sec), le taux d'erreur sous charge, l'usage des ressources (CPU, mémoire), et les percentiles de latence — p95 et p99, pas la moyenne. Les moyennes cachent la douleur : une moyenne de 200 ms peut vouloir dire que 5 % des utilisateurs attendent 4 secondes, et ce sont souvent vos sessions de plus grande valeur.

Dire « temps de réponse moyen » comme métrique phare vous marque comme junior. Le p99 est l'expérience de vos utilisateurs réels les plus mal servis, et c'est là que vivent les SLA et les clients perdus.

Points clés
  • Débit, taux d'erreur, usage des ressources, percentiles de latence
  • p95/p99 plutôt que la moyenne — les moyennes cachent la queue lente
  • « Temps de réponse moyen » en tête est un signe de junior
Ils demanderont ensuite · touchez-en un pour la réponse
Le piège

Mener avec le « temps de réponse moyen » signale l'inexpérience. Les percentiles (p95/p99) sont comment la performance est vraiment jugée — la queue est l'histoire.

Copier le lien

Comment structurez-vous un plan de test JMeter ?

Tests de performancemid

Un Thread Group définit les utilisateurs virtuels et la montée en charge (ramp-up). À l'intérieur, les Samplers font les requêtes (HTTP), les Config Elements tiennent les données partagées (URL de…

Un Thread Group définit les utilisateurs virtuels et la montée en charge (ramp-up). À l'intérieur, les Samplers font les requêtes (HTTP), les Config Elements tiennent les données partagées (URL de base, un CSV de données de test), les Assertions vérifient que les réponses restent correctes sous charge, et les Listeners collectent les résultats. Les Timers ajoutent un temps de réflexion réaliste entre les requêtes.

La structure imite une vraie session d'utilisateur : montez les utilisateurs progressivement (pas tous d'un coup), donnez à chacun des données uniques pour qu'ils ne martèlent pas un seul enregistrement, affirmez que les réponses sont encore valides — un 500 rapide n'est pas un succès — et enregistrez les percentiles, pas juste les moyennes.

Points clés
  • Thread Group (utilisateurs + ramp) → Samplers → Assertions → Listeners
  • Config elements pour les données partagées ; timers pour le temps de réflexion réaliste
  • Monter progressivement, donner des données uniques, affirmer la justesse sous charge
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Comment décidez-vous des niveaux de charge à tester ?

Tests de performancesenior

À partir de données réelles, pas d'une devinette. Tirez le trafic de production — pic d'utilisateurs simultanés, requêtes par seconde, l'heure la plus chargée — et modelez le test dessus, puis…

À partir de données réelles, pas d'une devinette. Tirez le trafic de production — pic d'utilisateurs simultanés, requêtes par seconde, l'heure la plus chargée — et modelez le test dessus, puis ajoutez de la marge (testez à 1,5–2× le pic) pour prouver qu'il y a du mou. Pour un lancement sans historique, estimez depuis les chiffres attendus du marketing et testez au-dessus.

Un test de charge à un « 1000 utilisateurs » arbitraire ne prouve rien si votre vrai pic est 80 ou 8000. Le chiffre doit remonter à la réalité, et le rapport devrait énoncer quel scénario réel il représente.

Points clés
  • Dériver les niveaux des pics de production, pas d'un chiffre rond
  • Tester au-dessus du pic (1,5–2×) pour prouver la marge
  • Chaque chiffre de charge devrait remonter à un scénario réel
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien

Vous avez lancé un test de charge et les temps de réponse sont terribles. Comment trouvez-vous le goulot ?

Tests de performancesenior

D'abord, écartez le test lui-même — un générateur de charge sous-dimensionné ou un réseau lent sur la machine JMeter ressemble exactement à un serveur lent.

D'abord, écartez le test lui-même — un générateur de charge sous-dimensionné ou un réseau lent sur la machine JMeter ressemble exactement à un serveur lent. Puis corrélez : surveillez CPU, mémoire, DB et thread pools du serveur pendant que la charge tourne, et voyez lequel sature en premier. Celui qui atteint 100 % pendant que les autres sont inactifs est votre goulot.

Coupables courants : la base de données (requêtes lentes, index manquant, pool de connexions épuisé), puis le CPU, puis la mémoire/GC. L'observabilité pendant le run bat la devinette — la métrique qui plafonne à son plafond nomme la couche à corriger.

Points clés
  • Écarter d'abord le générateur de charge/le réseau — il imite un serveur lent
  • Corréler CPU/mémoire/DB/pools pendant le run ; trouver ce qui sature
  • Le suspect habituel est la DB — requêtes lentes, index manquant, limites de pool
Ils demanderont ensuite · touchez-en un pour la réponse
Copier le lien
Ils demanderont ensuite