Cum să configurați și să rulați primul test Python cu Pytest

Cum să configurați și să rulați primul test Python cu Pytest
Cititorii ca tine ajută la sprijinirea MUO. Când efectuați o achiziție folosind link-uri de pe site-ul nostru, este posibil să câștigăm un comision de afiliat. Citeşte mai mult.

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.





REALIZAREA VIDEOCLIPULUI ZILEI Derulați PENTRU A CONTINUA CU CONȚINUT

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 venv tests 

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:



 source tests/bin/activate 

Pentru Windows, rulați această comandă:

 tests\Scripts\activate 

Pentru a instala Pytest, puteți utiliza pip, managerul de pachete Python, cu această comandă în terminal:





cum se face o pictogramă pentru Windows 10
 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.

 def add_numbers(a, b): 
    return 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:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 5
    assert add_numbers(-1, 1) == 0
    assert 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.

ce este superfetch și am nevoie de el

De exemplu, să presupunem că ați rulat următoarea funcție de testare pentru funcția add_numbers:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 6
    assert add_numbers(-1, 1) == 0
    assert 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:

  Ieșirea unei rulări pytest care arată un singur test eșuat

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 

def test_add_numbers_with_invalid_inputs():
    with pytest.raises(TypeError):
        add_numbers(None, 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.

cea mai bună aplicație de curățare pentru Android 2016

De exemplu, în această funcție de testare, afirmați mesajul de excepție astfel:

 def test_add_numbers_with_invalid_inputs(): 
    with pytest.raises(TypeError) as exc_info:
        add_numbers(None, 2)

    assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and '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:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 6
    assert add_numbers(-1, 1) == 0
    assert 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,expected", [
    (2, 3, 5),
    (-1, 1, 0),
    (0, 0, 0)
])
def test_add_numbers(a, b, expected):
    assert add_numbers(a, b) == expected

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.

 class TestAddFunction: 
@pytest.mark.parametrize("a, b, expected", [
        (2, 3, 5),
        (-1, 1, 0),
        (0, 0, 0),
    ])
    def test_addition_with_numbers(self, a, b, expected):
        assert add_numbers(a, b) == expected

    def test_add_numbers_with_invalid_inputs(self):
        with pytest.raises(TypeError) as exc_info:
            add_numbers(None, 2)
        assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and '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.