Treci la conținutul principal

Reguli mici, diferență mare

Testele bune respectă câteva obiceiuri:

1. Nume clare — greet falls back for an empty name spune ce s-a stricat fără să deschizi fișierul.
2. Un singur comportament per test — testele mici arată direct spre problemă.
3. Tabele pentru multe cazuri — o singură buclă în loc de teste copiate.
4. Mesaje cu got și want — un eșec trebuie să se explice singur.
5. Teste separate ca să vezi tot, un singur test acolo unde nu are rost să continui.
6. Rulează testele des — după fiecare modificare mică, nu o singură dată la final.
7. Testele stau lângă cod — același folder, sufixul .test.ts.


Mesaje de eșec care ajută

Un test care eșuează este citit într-un moment de confuzie — mesajul trebuie să poarte toată povestea: ce apel, ce a venit înapoi, ce se aștepta.

O formă bună este func(input) = got; want want. Trecerea șirurilor prin JSON.stringify le pune între ghilimele, așa că un spațiu lipsă sau o virgulă lipsă se vede imediat.

Un mesaj cu toată povestea

greet întoarce salutul greșit. Mesajul nostru arată apelul, valoarea got și valoarea want, iar executorul de teste adaugă dedesubt propriile linii + actual - expected — eroarea (cuvânt greșit, virgulă și semn de exclamare lipsă) se vede doar din rezultat, fără să deschizi codul.

Prompt
Scrie un fișier de test TypeScript în care o funcție greet întoarce salutul greșit („Hi Ana” în loc de „Hello, Ana!”) și testul raportează eșecul ca apelul, valoarea got și valoarea want, folosind JSON.stringify pentru ca șirurile să fie între ghilimele. Arată rezultatul real al eșecului.
Ieșire: program TypeScript și rezultatul capturat

Un singur comportament per test

Un test care verifică cinci lucruri are cinci motive să eșueze — iar numele lui poate descrie doar unul dintre ele. Împărțirea pe comportamente păstrează fiecare test mic și numele lui cinstit. Aici contează de două ori, pentru că o aserțiune eșuată oprește testul din care face parte: cinci verificări într-un singur test înseamnă că vezi mereu doar primul eșec.

Salutul normal și varianta de rezervă pentru numele gol sunt două comportamente, așa că primesc două teste. Când unul eșuează, numele lui îți spune deja ce comportament s-a stricat.

Două comportamente, două teste

greet uses the name verifică situația normală, iar greet falls back for an empty name varianta de rezervă. Rezultatul le listează separat — un eșec ar arăta exact spre un singur comportament.

Prompt
Scrie un fișier de test TypeScript cu o funcție greet care salută pe nume și revine la „Hello, stranger!” pentru un nume gol. Scrie două teste separate și focalizate, câte unul pentru fiecare comportament, cu nume care spun ce verifică. Arată rezultatul reușit, cu ambele teste listate.
Ieșire: program TypeScript și rezultatul capturat

Cât este testat: acoperirea

node --test --experimental-test-coverage măsoară ce parte din codul tău execută testele cu adevărat. Afișează câte un rând pentru fiecare fișier, cu trei procente — linii, ramuri și funcții — plus numerele liniilor la care nu a ajuns nimic.

Numărul este o busolă, nu un scop: o valoare mică arată căi netestate. O acoperire de 100% nu dovedește că acel cod este corect, dar liniile neacoperite sunt sigur neverificate.

Măsoară acoperirea

describeTemperature are trei ramuri, iar testul parcurge una singură. Raportul arată line % 76.47 și branch % 60.00 și numește liniile neacoperite 6-7 9-10 — return-ul freezing și cel hot. Teste pentru ramura rece și pentru cea fierbinte ar ridica ambele numere.

Se măsoară tot fișierul, testele incluse, de aceea numărul pentru linii nu este mai mic: liniile de test au rulat toate.

Prompt
Scrie un fișier de test TypeScript cu o funcție describeTemperature care întoarce freezing, mild sau hot în funcție de o temperatură și un singur test care verifică doar ramura mild. Arată rezultatul rulării lui cu opțiunea experimentală de acoperire a executorului de teste, inclusiv tabelul de acoperire.
Ieșire: program TypeScript și rezultatul capturat
Measure the coverage