Ce este un test unitar
Un test unitar este un mic program care verifică o singură bucată din codul tău — de obicei o funcție. Rulezi testele după fiecare modificare; dacă o modificare strică ceva, un test îți spune imediat, înaintea utilizatorilor tăi.
Instrumentul standard în lumea Python este pytest. Se instalează o singură dată cu pip install pytest și nu are nevoie de cod de rutină: un test este o funcție obișnuită, iar o verificare este instrucțiunea obișnuită assert.
Testele fac și modificările sigure: cu teste bune poți rescrie o funcție și afli în câteva secunde dacă se comportă la fel ca înainte.
Fișiere de test și funcții de test
Două reguli de denumire fac dintr-un test un test:
1. Numele fișierului începe cu test_ — pentru calc.py scrii test_calc.py. pytest caută în folder fișierele denumite astfel (merg și numele care se termină în _test.py) și le rulează doar pe acestea.
2. Numele funcției începe cu test_ și funcția nu primește argumente — def test_add():. Funcțiile fără acest prefix nu sunt colectate, așa că funcțiile ajutătoare pot sta în același fișier.
În interiorul testului apelezi funcția, compari ce ai obținut cu ce vrei și lași assert să raporteze diferența. Un assert care eșuează ridică o eroare care marchează testul ca eșuat; dacă nu se ridică nicio eroare, testul trece.
Un prim test care trece
test_add apelează add(2, 3) și compară rezultatul cu 5 într-un singur assert. Valorile coincid, deci nu se ridică nimic și testul trece: linia afișează PASSED, iar rularea se încheie cu 1 passed.
Ieșire: program Python complet
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5
Un test care eșuează
Această funcție add are o eroare — înmulțește. Testul o prinde: pytest reafișează linia assert care a eșuat, arată valorile din ambele părți — assert 6 == 5 — iar rularea se încheie cu 1 failed.
Ieșire: program Python complet
# add are o eroare: înmulțește în loc să adune.
def add(a, b):
return a * b
def test_add():
got = add(2, 3)
assert got == 5
Rularea testelor
python3 -m pytest rulează toate fișierele de test din folderul curent (când pytest se află în PATH, simplul pytest face același lucru). Ieșirea implicită este scurtă: câte un punct pentru fiecare test care trece și o linie de rezumat.
pytest -v (verbose, detaliat) afișează fiecare test după nume, urmat de PASSED sau FAILED. Folosește-l ca să vezi ce s-a rulat de fapt. Dacă îi dai un nume de fișier, pytest test_calc.py rulează doar acel fișier.
Două teste, ieșire detaliată
Fișierul are două funcții de test, câte una pentru fiecare funcție testată. Cu -v, fiecare apare pe propria linie — vezi că ambele au rulat și ambele au trecut, iar rezumatul spune 2 passed.
Ieșire: program Python complet
def double(n):
return n * 2
def half(n):
return n // 2
def test_double():
assert double(4) == 8
def test_half():
assert half(8) == 4