Treci la conținutul principal

Funcții care ridică excepții

O funcție Python care primește date de intrare greșite trebuie să semnaleze acest lucru ridicând o excepție: la succes returnează rezultatul, la eșec ridică o eroare — de exemplu ValueError — care explică ce nu a mers.

Un test pentru o astfel de funcție trebuie să verifice ambele căi: datele corecte returnează valoarea potrivită și nu ridică nimic, iar datele greșite chiar ridică o excepție — o funcție care acceptă în tăcere date greșite este tot o eroare.

pytest.raises este instrumentul pentru calea greșită: un bloc with care face testul să eșueze dacă din el nu iese excepția așteptată.


Calea corectă

Pentru date de intrare valide nu trebuie scris nimic în plus. Apelează funcția, apoi compară valoarea. Dacă apelul ridică totuși o excepție, excepția încheie singură testul și raportul o arată — nu trebuie să o verifici mai întâi.

Date valide, fără excepție

safe_divide(10, 2) trebuie să returneze 5 și să nu ridice nicio excepție. Apelul vine primul; o excepție neașteptată ar încheia testul chiar acolo. Abia apoi se compară valoarea.

Prompt
Scrie un fișier de test Python cu o funcție safe_divide care ridică ValueError la împărțirea la zero și, în rest, returnează câtul. Scrie un test pentru calea corectă: safe_divide(10, 2) trebuie să returneze 5 — mai întâi apelează, apoi verifică valoarea cu assert; o excepție neașteptată ar face testul să eșueze de la sine. Arată ieșirea pytest -v.
Ieșire: program Python complet
Valid input, no exception

Calea greșită

Cealaltă jumătate a contractului: datele greșite trebuie să ridice o excepție. Apelul se pune într-un bloc with pytest.raises(ValueError) — dacă funcția returnează un număr în loc să ridice excepția, testul eșuează.

Contează să numești clasa excepției: blocul acceptă doar un ValueError, așa că o altă eroare, neașteptată, face în continuare testul să eșueze.

Datele greșite trebuie să ridice o excepție

Împărțirea la zero trebuie să eșueze. pytest.raises(ValueError) învelește apelul safe_divide(10, 0). Funcția ridică excepția promisă, așa că testul trece.

Prompt
Scrie un test Python pentru calea greșită a funcției safe_divide: apelul cu împărțitorul 0 trebuie să ridice ValueError. Pune apelul într-un bloc with pytest.raises(ValueError). Arată ieșirea pytest -v.
Ieșire: program Python complet
Bad input must raise

Un tabel cu want_error

Ambele căi încap într-un singur test parametrizat: dă fiecărui caz un indicator want_error care spune dacă se așteaptă o excepție. Valoarea want este None pentru acel caz, pentru că un caz care ridică o excepție nu are nicio valoare de comparat.

Testul se uită mai întâi la want_error. Eșecul așteptat se verifică cu pytest.raises și testul se oprește acolo; celelalte cazuri compară valoarea ca de obicei.

Cazuri corecte și greșite într-un singur tabel

Patru cazuri: trei împărțiri obișnuite și o împărțire la zero cu want_error=True. Un singur test parametrizat acoperă întregul contract al funcției, iar toate cele patru cazuri trec.

Prompt
Scrie un test Python parametrizat pentru safe_divide în care fiecare caz are un id, cele două intrări, valoarea așteptată și un indicator want_error. Folosește pytest.raises(ValueError) pentru cazul cu eroare și compară valoarea pentru celelalte. Include trei cazuri normale și o împărțire la zero. Arată ieșirea pytest -v.
Ieșire: program Python complet
Good and bad cases in one table