๐งช Mock Me If You Can : Guide de Survie des Tests Logiciels
Ah, les tests. Ce mot magique qui peut transformer un commit innocent en un feu d'artifice rouge dans ton pipeline CI.
Tu pensais avoir tout compris ? Dรฉtrompe-toi, camarade dรฉveloppeur chevronnรฉ.
Voici un tour d'horizon (un peu) technique, (lรฉgรจrement) sarcastique et (probablement) pertinent des principaux types de tests logiciels :
- โ Tests unitaires (mockistes vs classicists)
- ๐ Tests d'intรฉgration
- ๐งช Tests end-to-end (E2E)
- ๐ฅ Tests de charge
La fameuse pyramide des tests : moins tu montes, mieux tu dors.
๐ฌ Bonus : Notre Talk "La Lรฉgende des Gardiens du Code"
๐ฃ๏ธ Tu prรฉfรจres regarder plutรดt que lire ? On t'a couvert !
Le 06 juin 2024, avec mon acolyte Jeremy Bernard, on a donnรฉ un talk au DevQuest sur ce sujet brรปlant : les types de tests et la CI/CD qui va avec.
๐ฅ Le Talk en Vidรฉo
๐บ Regarder "La Lรฉgende des Gardiens du Code" sur YouTube
๐ Les Slides de la Confรฉrence
๐พ Tรฉlรฉcharger le PowerPoint de la confรฉrence
Spoiler alert : On y raconte comment les tests sont les vrais gardiens de votre code... et pourquoi sans eux, c'est l'anarchie totale en production ! ๐ฅ
๐งฉ Tests Unitaires : Mockistes vs Classicists โ Le Match de Boxe
"Un bon test unitaire isole. Un test unitaire parfait n'existe pas."
โ Un dรฉveloppeur qui a perdu 3 jours ร dรฉbugger un mock
๐ฅ Camp 1 : Les Mockistes (a.k.a. London School)
Tu veux tout contrรดler ? Tu adores faire semblant ? Bienvenue chez les mockistes.
Ici, chaque dรฉpendance est simulรฉe. Tu ne veux pas tester si fetchData()
accรจde ร une vraie BDD, tu veux juste qu'il croie qu'elle existe.
โ Avantages
- Hyper rapide
- Super prรฉcis : tu sais exactement ce qui est cassรฉ
- Isolation complรจte du code testรฉ
โ Inconvรฉnients
- Fragile comme un test PCR dans une boรฎte chaude
- Teste souvent l'implรฉmentation plus que le comportement
- Maintenance รฉlevรฉe des mocks
๐งโโ๏ธ Camp 2 : Les Classicists (a.k.a. Detroit School)
Tu prรฉfรจres tester sans te casser la tรชte ร tout mocker ? Tu es classicist.
Tu laisses les vraies dรฉpendances s'exรฉcuter dans leur contexte logique.
โ Avantages
- Teste des comportements rรฉels
- Moins de maintenance liรฉe aux mocks
โ Inconvรฉnients
- Moins rapide
- Plus sujet aux tests flakies
- Risque de mauvaise sรฉparation des responsabilitรฉs
๐คฏ Le Vrai Dilemme ?
- Les mockistes valident les interactions
- Les classicists valident les rรฉsultats
๐ Choisis ton camp, mais reste cohรฉrent.
๐ Tests d'Intรฉgration : Lร oรน les Bugs naissent
"รa marche en local, mais en prod c'est l'apocalypse ? Tu fais pas de tests d'intรฉgration, hein ?"
Le test d'intรฉgration, c'est le cafรฉ serrรฉ du TDD.
Il ne teste pas chaque grain, mais la machine complรจte.
โ Avantages
- Rรฉvรจle les vrais bugs (ceux qui pรจtent en prod)
- Valide les comportements transverses : transactions, configs, etc.
โ Inconvรฉnients
- Lents, trรจs lents
- Fragiles si dรฉpendances instables
- Requiert souvent un environnement spรฉcifique ou des outils comme Testcontainers, WireMock, etc.
๐ง Schรฉma 1: Test d'Intรฉgration Multi-Couches
"Quand toutes les couches doivent jouer ensemble... sans se disputer"
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ฅ๏ธ COUCHE UI (Frontend) โ
UI rรฉpond โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โข Formulaire de commande โ
โ โข Saisie produit: "Licorne en peluche" โ
โ โข Quantitรฉ: 42 (pourquoi pas ?) โ
โ โ
โ form.submit() // Pray it works ๐ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โฌ๏ธ Test vรฉrifie la transmission
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ๏ธ COUCHE API (Backend) โ
API traite โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โข Endpoint REST /orders โ
โ โข Validation des donnรฉes โ
โ โข Calcul du prix (licornes = โฌโฌโฌ) โ
โ โ
โ POST /api/orders โ
โ status: 201 โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โฌ๏ธ Test vรฉrifie la persistance
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐๏ธ COUCHE BASE DE DONNรES โ
DB persiste โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โข Tables: products, orders, customers โ
โ โข Transaction ACID โ
โ โข Contraintes respectรฉes โ
โ โ
โ INSERT INTO orders -- Magic happens here โจ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โฌ๏ธ Test vรฉrifie l'appel externe
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ณ SERVICES EXTERNES โ
Paiement OK โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โข Service de paiement Stripe โ
โ โข Tokenisation carte โ
โ โข Dรฉbit de 1337.42โฌ โ
โ โ
โ stripe.charge() // ๐ธ Bye bye money โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ Rรฉsultat du Test d'Intรฉgration
โ Formulaire โ API : PASS
โ API โ Base de donnรฉes : PASS
โ API โ Service paiement : PASS
โ Cohรฉrence des donnรฉes : PASS
๐ค "Un test d'intรฉgration, c'est comme un chef d'orchestre :
il faut que tous les musiciens jouent la mรชme partition...
sinon รงa donne du jazz expรฉrimental !"
๐งช Tests End-to-End (E2E) : Le Grand Frisson de l'Automatisation
"Si le bouton ne clique pas, le client ne paie pas."
Les tests E2E sont lร pour simuler un vrai utilisateur.
Tu veux tester tout le flow : login, achat, logout ? C'est ici.
๐ ๏ธ Outils populaires :
- Playwright
- Cypress
- Selenium (๐ฌ)
โ Avantages
- Simule le parcours utilisateur complet
- Dรฉtecte les rรฉgressions UI ou frontend/backend
โ Inconvรฉnients
- Lents. Trรจs lents.
- Fragiles. Trรจs fragiles.
- Maintenance รฉlevรฉe (un QA engineer peut y passer sa vie)
๐ค Schรฉma 2: E2E Testing vs Human Testing
"Mรชme parcours, mรชme vรฉrifications, mais qui gagne ?"
L'Affrontement รpique
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ๏ธ VS โ๏ธ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐จโ๐ป L'HUMAIN TESTEUR โ โ ๐ค LE TEST E2E โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ โ โ
โ ๐งโ๐ผ โ โ ๐ค โ
โ โ โ โ
โ ๐ญ "Bon, on va tester โ โ ๐ญ "BEEP BOOP. Exรฉcution โ
โ cette app... encore... โ โ du scรฉnario 1337..." โ
โ pour la 47รจme fois..." โ โ โ
โ โ โ โ
โ ACTIONS: โ โ CODE: โ
โ โ โ โ
โ 1. ๐ฑ๏ธ Ouvre le navigateur โ โ cy.visit('localhost:3000') โ
โ *soupir* Firefox ou โ โ โ
โ Chrome aujourd'hui ? โ โ cy.get('[data-testid=form]')โ
โ โ โ .should('be.visible') โ
โ 2. โจ๏ธ Tape l'URL โ โ โ
โ localhost:3000... enfin โ โ cy.get('#email') โ
โ j'espรจre que c'est รงa โ โ .type('test@example.com') โ
โ โ โ โ
โ 3. โณ Attend le chargement โ โ cy.get('button[type=submit]')โ
โ Hmm... c'est long lร ... โ โ .click() โ
โ รงa marche ? โ โ โ
โ โ โ cy.contains('Success!') โ
โ 4. ๐ Regarde l'interface โ โ .should('be.visible') โ
โ "Tiens, ce bouton a โ โ โ
โ bougรฉ de 2px..." โ โ โ
โ โ โ โก Temps d'exรฉcution: 0.3s โ
โ 5. ๐ Remplit le formulaire โ โ ๐ฏ Prรฉcision: 100% โ
โ Email: test@test.com โ โ ๐ Rรฉpรฉtable: โ fois โ
โ (encore et toujours) โ โ ๐ Rapports: Automatiques โ
โ โ โ โ
โ 6. ๐ค Clique sur Submit โ โ โ
โ *croise les doigts* โ โ ๐ญ "BEEP BOOP. Test terminรฉโ
โ โ โ Prรชt pour les 999 โ
โ 7. โ
Vรฉrifie le rรฉsultat โ โ autres scรฉnarios..." โ
โ "Success!" - Ouf, รงa โ โ โ
โ marche... cette fois โ โ โ
โ โ โ โ
โ ๐ญ "Bon, maintenant il faut โ โ โ
โ que je teste avec un โ โ โ
โ autre email... et sur โ โ โ
โ mobile... et Safari๐ต" โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ Verdict du Match
Critรจre | ๐จโ๐ป Humain | ๐ค Robot | Gagnant |
---|---|---|---|
Vitesse | 3 minutes | 0.3 secondes | ๐ค >>> ๐จโ๐ป |
Prรฉcision | "Oups, cliquรฉ ร cรดtรฉ" | Chirurgicale | ๐ค > ๐จโ๐ป |
Rรฉpรฉtabilitรฉ | "Pas un lundi matin..." | 24h/24, 7j/7 | ๐ค >>> ๐จโ๐ป |
Crรฉativitรฉ | "Et si je clique lร ?" | Suit le script | ๐จโ๐ป >>> ๐ค |
Dรฉtection de bugs bizarres | "En diagonale รงa plante" | Ne sort jamais du script | ๐จโ๐ป >>> ๐ค |
๐ค La Vรฉritรฉ
L'E2E teste comme un humain trรจs disciplinรฉ qui n'aurait jamais de lundi matin...
Mais qui ne trouvera jamais le bug bizarre qui arrive seulement "quand on fait รงa en diagonale" ๐คทโโ๏ธ
๐ฅ Tests de Charge : T'as Pas Crashรฉ, Donc T'as Gagnรฉ
"Tu peux scaler ton app ร 1 million d'utilisateurs ? Moi non plus. Mais j'ai un test qui dit que peut-รชtre."
Tu veux savoir ce que devient ton API sous pression ? Tu fais des tests de charge.
๐ ๏ธ Outil testรฉ:
โ Avantages
- Identifie les goulets d'รฉtranglement
- Fournit des metrics (latence, taux d'erreur, throughput)
- Essentiel en prรฉprod sur les services critiques
โ Inconvรฉnients
- Difficiles ร calibrer et interprรฉter
- Peuvent donner un faux sentiment de sรฉcuritรฉ
- Nรฉcessitent une vraie stratรฉgie d'analyse
โ๏ธ Rรฉsumรฉ Comparatif
Type de test | Vitesse ๐ | Fiabilitรฉ ๐ก๏ธ | Portรฉe ๐ฏ | Complexitรฉ ๐ง |
---|---|---|---|---|
Unitaire (mock) | Ultra rapide | Moyenne | Petite | Moyenne |
Unitaire (classic) | Rapide | Bonne | Moyenne | Basse ร moyenne |
Intรฉgration | Moyenne | Moyenne | Moyenne ร large | Moyenne ร haute |
End-to-End (E2E) | Lente | Moyenne | Large | Haute |
Charge | Variable | Bonne (si bien fait) | Large | Haute |
๐ Conclusion : Teste intelligemment, pas aveuglรฉment
Les tests ne sont pas lร pour faire joli sur un dashboard.
Ils sont lร pour te sauver le c*l ร 2h du matin quand la prod tombe.
โ
Reste pragmatique
โ
N'overengineere pas tes tests
โ
Utilise le bon test pour le bon usage
Et surtout :
Si tu commites sans tests, assume quand tout pรจte. ๐
๐ Tu veux plus d'articles techniques ?
Suis-moi ici sur dev.to, ou viens troller (gentiment) en commentaires.
#DevOps #TDD #Testing #SoftwareCraftsmanship #TestezVosProds
Top comments (0)