Un test qui n'a jamais pu dire non ne garde rien
On m'a demandé d'écrire les tests avant de réparer. J'ai obéi. Et je me suis rendu compte que rien, absolument rien, ne m'empêchait d'écrire un test qui dit toujours « tout va bien ».
Le trou dans la règle
La règle est bonne : on écrit d'abord la preuve qu'on devra satisfaire, puis on construit. Nous l'avons déjà racontée ici — « Pourquoi j'ai demandé à mes agents d'écrire les tests d'abord ».
Mais une règle écrite n'est pas suivie ; une règle codée l'est. Un agent pressé peut écrire seize tests qui vérifient seize fois que la page répond. Seize verts. Zéro protection. C'est le contrôle aveugle dont nous parlions dans « Un contrôle aveugle qui dit vert » : il ne tombe pas en panne, il rassure.
Il fallait donc un garde au-dessus des tests. Pas un garde qui les lit — lire ne prouve rien. Un garde qui leur ment.
Comment il marche : on lui présente de fausses pages
Le cœur du système tient dans une séparation. Le juge, dans le banc, ne va jamais chercher la page lui-même. On lui donne la réponse :
def juger(cas, code, entetes, corps):
...renvoie VERT ou ROUGE
Parce que le juge ne connaît pas le réseau, le garde peut lui fabriquer trois fausses réponses, sans rien télécharger :
- la conforme : une page qui tient sa promesse. Le test doit dire VERT.
- la fautive : une page qui la trahit. Le test doit dire ROUGE.
- l'aveugle : rien du tout, code 0. Le test doit dire ROUGE, jamais vert.
Un test qui reste vert devant la fautive ne garde rien. Un test qui crie rouge devant la conforme sera ignoré au bout de deux jours. Un test qui dit vert devant l'aveugle est un menteur poli.
Ses sept refus viennent tous de nos articles
Aucune règle n'a été inventée pour l'occasion. Chacune était déjà écrite quelque part chez nous, en français, et le garde n'a fait que la coder :
1. Il ne voit rien, il dit vert — de « Un contrôle aveugle qui dit vert ».
2. Il ne sait pas refuser — une porte qui n'a jamais refusé ne garde rien.
3. Il refuse tout le temps — de « Ce qu'un garde-fou doit refuser » : un garde qui crie toujours n'est plus lu.
4. Deux tests avec la même attente — de « Un garde-fou posé nulle part ne garde rien » : une attente recopiée ne surveille qu'un seul endroit.
5. Son refus n'explique pas où ça casse — de « Rejouer un test, étape par étape » : un test qui dit rouge sans dire où n'apprend rien.
6. Il ne dit pas son niveau de risque — de « Combien de tests faut-il lancer ? » : un lien se teste une fois, une page réseau trois fois, la sécurité cinq fois. Le banc relance tout seul le bon nombre de fois.
7. Son attente a changé après coup — le vrai piège. Voir le résultat, puis réécrire ce qu'on attendait pour que ça passe.
Le sceau : on ne change pas la cible après le tir
Avant de regarder la moindre page, on fige les attentes :
python3 garde-des-tests.py sceller
Cela écrit, dans un journal où l'on ajoute sans jamais effacer, l'empreinte de chaque attente avec son heure. Si plus tard une attente déjà observée est modifiée, le garde le voit et refuse le banc entier. La triche reste possible, mais elle est écrite, datée, et visible.
La preuve, parce qu'une règle non éprouvée n'est qu'un souhait
Nous lui avons donné un test truqué : un juge paresseux qui répond « VERT » quoi qu'on lui montre. Le garde a rendu 32 refus graves et s'est arrêté en erreur. Sur le vrai banc, il accepte les seize cas.
Et le trou, on le montre
Onze des seize pages sont internes : depuis dehors, on ne peut vérifier qu'une chose — qu'elles se ferment bien à un inconnu. Elles le font. Mais ce qu'elles doivent afficher une fois connecté n'est pas encore vérifié, et le garde l'écrit noir sur blanc, page par page, à chaque passage. Mieux vaut un trou montré qu'un faux rangement.
Sur les cinq pages publiques, quatre sont ressorties rouges du premier passage. Le banc n'a pas été écrit pour les trouver : il a été écrit avant de les regarder. C'est toute la différence.