Préparation entretien

Le test technique QA Wolf, traité de bout en bout

Modifiez un projet Playwright de démarrage pour valider que les 100 premiers articles de la page « newest » de Hacker News sont triés du plus récent au plus ancien, puis enregistrez une courte vidéo. Ça a l'air d'une heure. La page pagine à 30 — et c'est là que le vrai test commence.

Par Shahriyar · Mis à jour

Cette tâche est reproduite dans des dizaines de dépôts publics de candidats et est stable depuis des années. Ce qui suit est le raisonnement qu'un relecteur veut voir, étape par étape — et l'erreur précise qui sépare les rendus.

Étape 1 — Définir la chose que vous validez

Deux mots de l'énoncé sont indéfinis, et les deux demandent une décision que vous notez.

« 100 ». La page « newest » affiche 30 éléments. Il vous faut quatre chargements de page. Rien dans l'énoncé ne le dit — le remarquer est le premier point de contrôle.

« Triés du plus récent au plus ancien ». HN affiche des âges relatifs — « il y a 12 minutes ». Les comparer comme des chaînes est faux ; les parser comme des nombres est fragile, parce que « il y a 1 heure » et « il y a 59 minutes » peuvent tous deux être vrais du même post. Regardez le DOM à la place : l'élément d'âge porte un horodatage absolu dans son attribut title.

// le span d'âge contient le vrai horodatage
const ages = await page.locator("span.age").all();
const stamps = await Promise.all(
  ages.map(a => a.getAttribute("title"))   // "2026-08-02T14:07:11"
);

Comme contre-vérification, les ID d'éléments HN croissent de façon monotone — une liste correctement triée est aussi décroissante par ID. Deux signaux indépendants, et une erreur de parsing d'horodatage ne peut plus passer silencieusement.

Étape 2 — Trouver le bug que la tâche cache

Entre votre premier chargement de page et votre quatrième, de nouveaux posts arrivent et tout se décale vers le bas. Cliquer naïvement sur « More » trois fois et concaténer vous donne des éléments en double et d'autres silencieusement manqués — et votre vérification de tri peut quand même passer. Un test vert, qui valide les mauvais 100 articles. C'est le bug de la liste mouvante, et ne pas le remarquer est ce qui sépare les rendus.

Deux corrections défendables. Dédupliquez par ID d'élément au fur et à mesure, et continuez à paginer jusqu'à détenir 100 articles uniques. Ou parcourez le curseur de pagination plutôt que le lien « More », ce qui fixe chaque page à une position déterminée dans la liste. L'une ou l'autre convient — ce qui est noté, c'est que vous avez vu le problème et choisi délibérément.

Étape 3 — Structure

Gardez index.js comme point d'entrée qu'ils vous ont dit de lancer, et mettez la logique derrière :

index.js               // orchestration uniquement, ~20 lignes
src/hackerNews.js      // interaction de page, pagination, extraction
src/validate.js        // fonction pure : tableau d'articles -> résultat
tests/validate.spec.js // tests unitaires pour la fonction pure
README.md

Faire de la comparaison une fonction pure est le mouvement au plus fort levier de tout l'exercice. Il vous permet de tester unitairement la logique de tri contre des fixtures sans navigateur — trois fixtures suffisent : une liste triée, une paire inversée, un ID en double. Ça démontre que vous comprenez la pyramide des tests sans écrire un paragraphe prétendant que vous la comprenez.

Étape 4 — Faites des assertions sérieuses

N'affichez pas « les articles sont triés ». Levez une exception, et sortez en code non nul. En cas d'échec, rapportez la paire précise qui a rompu l'ordre :

Violation de tri à l'index 41 -> 42:
  "Show HN: ..." (2026-08-02T14:07:11)
  est plus ancien que
  "Ask HN: ..."  (2026-08-02T14:09:03)

Un relecteur qui alimente délibérément votre script avec une fixture cassée veut un message sur lequel il pourrait agir. Gérez les chemins d'échec évidents de la même façon — timeout de chargement de page, moins de 100 éléments disponibles, un horodatage manquant sur une ligne. Trois blocs try/catch avec de vrais messages battent un seul catch global.

Étape 5 — Le README et la vidéo

Six courtes sections de README : ce qu'il fait ; les commandes exactes de lancement depuis un clone propre ; comment vous avez défini « trié » et pourquoi ; les limitations connues ; ce que vous feriez avec plus de temps ; combien de temps vous avez passé. Cette dernière ligne n'est pas du théâtre d'humilité — elle dit au relecteur comment calibrer tout le reste de ce qu'il lit.

La vidéo est le même contenu, parlé : deux minutes sur vos décisions, pas votre code. Pourquoi les horodatages plutôt que les âges relatifs, le bug de la liste mouvante et votre correction, une chose que vous ajouteriez. Les candidats qui narrent leur raisonnement paraissent seniors ; ceux qui lisent leur arborescence de fichiers à voix haute, non.

Où ça se transfère

Tout exercice « validez cette liste » a le même squelette : un ordre indéfini, une source de données qui change sous vos pieds, et un relecteur qui cassera votre script exprès. Le hub des exercices à la maison couvre les cinq autres formes d'exercice et le barème du relecteur — à parcourir avant de rendre quoi que ce soit.

Questions fréquentes

Qu'est-ce que le test technique QA Wolf ?

Vous modifiez un projet Playwright de démarrage pour qu'il visite la page « newest » de Hacker News et valide que les 100 premiers articles exactement sont triés du plus récent au plus ancien, puis vous enregistrez une courte vidéo démontrant votre code. La page pagine à 30 éléments, ce qui est la difficulté cachée.

Et si de nouveaux posts arrivent pendant l'exécution de mon script ?

C'est le bug que la tâche cache. Entre les chargements de page, la liste se décale, donc une pagination naïve collecte des doublons et saute silencieusement des éléments — tandis que la vérification de tri reste au vert. Dédupliquez par ID d'élément jusqu'à détenir 100 articles uniques, ou parcourez le curseur de pagination, et dites dans le README lequel vous avez choisi et pourquoi.

La vidéo compte-t-elle ?

Oui — c'est là que vous montrez le raisonnement que le code ne peut pas. Deux minutes : pourquoi vous avez défini « trié » comme vous l'avez fait, le problème de la liste mouvante et votre correction, et une chose que vous feriez avec plus de temps. Parlez décisions, pas lignes de code.