Configurarea unei suite de testare pentru codul dvs. poate fi un obstacol pentru care nu sunteți pregătit, dar această bibliotecă preia multă efort.
Testarea este o parte esențială a dezvoltării software. Ajută la detectarea erorilor devreme și reduce probabilitatea erorilor pe linie.
Pytest este unul dintre cele mai populare cadre de testare pentru Python. Vă permite să scrieți teste mici și ușor de citit, care se pot scala pe măsură ce aplicația dvs. crește. Aflați cum să configurați și să utilizați Pytest cu codul dvs. Python.
Configurarea Pytest
Înainte de a instala Pytest, cel mai bine este să creați un mediu virtual pentru a izola mediul de testare, astfel încât să puteți evita conflictele cu alte pachete și dependențe.
Pentru a crea un mediu virtual, rulați următoarea comandă înainte de a instala Pytest.
python -m teste venv
Acest lucru va crea un nou mediu virtual numit teste în directorul dvs. curent. Pentru a activa mediul, rulați această comandă dacă sunteți pe Linux sau Mac:
sursă teste/bin/activare
Pentru Windows, rulați această comandă:
teste\\Scripturi\\activează
Pentru a instala Pytest, puteți utiliza pip, managerul de pachete Python, cu această comandă în terminal:
pip install pytest
Dacă nu îl aveți pe Pip, nu vă faceți griji; puteți instalați Pip pe Windows, Mac și Linux.
Rulați următoarea comandă pentru a verifica dacă ați instalat corect Pytest.
pytest --version
Aceasta ar trebui să returneze numărul versiunii instalate.
Crearea primului tău test
Luați în considerare următoarea funcție care adună două numere și returnează rezultatul.
defadd_numbers(a, b):
întoarcere a + b
Mai multe lucruri ar putea merge prost cu această funcție. De exemplu, luați în considerare ce se întâmplă dacă apelați funcția cu valori non-numerice, cum ar fi None sau o valoare de tip șir. Acestea sunt câteva dintre cazurile marginale potențiale care pot duce la eșecul funcției.
Unul dintre primele teste pe care le scrieți ar trebui să verifice dacă funcția returnează rezultatul așteptat. Pentru a face acest lucru, puteți utiliza cuvântul cheie assert pentru a compara rezultatul real al funcției cu rezultatul așteptat. În cazul funcției add_numbers, funcția de testare ar putea arăta astfel:
deftest_add_numbers():
afirma add_numbers(2, 3) == 5
afirma add_numbers(-1, 1) == 0
afirma add_numbers(0, 0) == 0
Această funcție de testare include trei instrucțiuni assert, fiecare comparând rezultatul funcției add_numbers cu o valoare așteptată. Primul test verifică că adăugarea a 2 și 3 returnează 5, al doilea test verifică că adăugarea -1 și 1 returnează 0, iar al treilea test verifică că adăugarea 0 și 0 returnează 0.
Cum să rulați teste cu Pytest
După ce ați scris testele, următorul pas este să le rulați. Pentru a face acest lucru cu Pytest, navigați la directorul care conține fișierul dvs. de testare și rulați comanda pytest:
pytest
Dacă totul funcționează conform așteptărilor, veți vedea un mesaj care indică faptul că toate testele au trecut cu succes. Cu toate acestea, dacă oricare dintre afirmații eșuează, Pytest va raporta o eroare și vă va arăta valorile de intrare care au cauzat eșecul.
De exemplu, să presupunem că ați rulat următoarea funcție de testare pentru funcția add_numbers:
deftest_add_numbers():
afirma add_numbers(2, 3) == 6
afirma add_numbers(-1, 1) == 0
afirma add_numbers(0, 0) == 0
Prima afirmație va eșua deoarece valoarea așteptată a fost 6, dar valoarea reală a fost 5 (suma 2 și 3). Pytest va returna următorul mesaj:
Acest mesaj vă arată valorile de intrare care au cauzat valoarea și, de asemenea, vă spune care ar trebui să fie valoarea reală. Acest lucru facilitează identificarea și remedierea rapidă a erorilor din codul dvs.
Utilizarea Pytest.raises pentru a afirma excepții
Acum, să scriem un test pentru a acoperi unul dintre cazurile marginale ale funcției add_numbers. Când treceți un argument non-numeric precum None la funcție, Python ar trebui să ridice o excepție TypeError.
Ar trebui să fii deja gestionarea excepțiilor în programele dvs. Python, și puteți testa că și codul dvs. le ridică corect.
Pentru a face acest lucru, copiați următoarea funcție de testare în fișierul dvs. Folosește managerul de context pytest.raises pentru a verifica dacă apelarea funcției add_number cu „None” ridică o excepție TypeError.
import pytest
deftest_add_numbers_with_invalid_inputs():
cu pytest.raises (TypeError):
add_numbers(Nici unul, 2)
Apoi rulați Pytest din linia de comandă. Dacă excepția nu este ridicată, testul va eșua.
Puteți merge mai departe și puteți verifica detaliile mesajului de excepție. Managerul de context produce un obiect ExceptionInfo cu detalii.
De exemplu, în această funcție de testare, afirmați mesajul de excepție astfel:
deftest_add_numbers_with_invalid_inputs():
cu pytest.raises(Eroare de scris) la fel de exc_info:
add_numbers(Nici unul, 2)
afirma exc_info.value.args[0] == „tip(uri) de operand neacceptat(e) pentru +: „NoneType” și „int””
Dacă mesajul nu se potrivește cu cel din test, Pytest va indica un eșec.
Cum să utilizați testarea parametrizată pentru a testa mai multe intrări simultan
În loc să apelați manual o funcție cu mai multe intrări, astfel:
deftest_add_numbers():
afirma add_numbers(2, 3) == 6
afirma add_numbers(-1, 1) == 0
afirma add_numbers(0, 0) == 0
Pytest oferă o funcție de testare parametrizată care vă permite să faceți același lucru mai ușor. Iată cum puteți rescrie funcția de testare de mai sus:
import pytest
@pytest.mark.parametrize("a, b, așteptat", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(a, b, așteptat):
afirmaadd_numbers(a, b)== asteptat
Cum să rulați mai multe teste
Până acum, ați scris doar două teste pentru funcția add_numbers. Pentru funcții mai complexe cu mai multe teste, poate doriți să le grupați într-o clasă.
De exemplu, iată cum ați crea o clasă de testare pentru funcția de adăugare.
clasăTestAddFunction:
@pytest.mark.parametrize("a, b, așteptat", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_addition_with_numbers(auto, a, b, așteptat):
afirma add_numbers (a, b) == așteptat
deftest_add_numbers_with_invalid_inputs(de sine):
cu pytest.raises (TypeError) la fel de exc_info:
add_numbers(Nici unul, 2)
afirma exc_info.value.args[0] == „tip(uri) de operand neacceptat(e) pentru +: „NoneType” și „int””
Rețineți că trebuie să prefixați numele clasei cu „Test”, astfel încât Pytest să o poată identifica ca o clasă de testare și să o poată rula.
Pytest are multe mai multe caracteristici
Folosind Pytest, puteți verifica automat că codul funcționează așa cum vă așteptați. Pytest oferă multe alte caracteristici, cum ar fi dispozitivele de fixare, care vă permit să configurați și să demontați datele și marcajele de testare pentru configurarea metadatelor pe funcțiile dvs. de testare.
În plus, puteți integra Pytest în conducta CI și puteți începe să rulați teste automat și continuu atunci când vă schimbați codul.