Mock Me If You Can : Guide de Survie des Tests Logiciels
# ๐งช 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** _(Lien disponible prochainement !)_
### ๐ 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. Chicago 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รฉ:
* Gatling
### โ
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**