Nu tratați excepțiile atunci când testați

Evitați utilizarea Try Catch Blocks în codul de testare cu exemple Python

Excepții

Excepțiile sunt erorile care apar în timpul execuției.

Cred că există 2 motive principale pentru a gestiona excepțiile într-un program.

  1. Pentru a evita blocarea programului.
  2. Pentru a lua anumite măsuri ca rezultat al unei erori.

Crashing earlyeste o strategie legitimă de fiabilitate discutată în cartea The Pragmatic Programmer de David Thomas și Andrew Hunt.

Dar nu toate erorile trebuie să fie fatale.

Testare

Când testați software-ul, urmăriți să exercitați (rulați) software-ul și să verificați dacă acesta funcționează în raport cu un set de așteptări (cerințe). Există multe tehnici și metode și diferite tipuri de testare. Dar asta este esenta.

Când executați teste funcționale sau unitare automate, scrieți din punct de vedere tehnic un program pentru a verifica un alt program. Din această cauză, puteți presupune în mod rezonabil că, pentru a face testarea dvs. fiabilă, ar trebui să vă asigurați că programul dvs. de testare nu se blochează în timpul testării și, prin urmare, adăugați o mulțime de coduri de gestionare a erorilor.

Cu toate acestea, este foarte important să înțelegeți că software-ul de rulare de testare are deja încorporat gestionarea excepțiilor! Adică, dacă o metodă de testare generează o excepție neprinsă, întregul program nu se blochează. Metoda pur și simplu contează ca un test eșuat. Toate celelalte metode încă rulează și își raportează rezultatele.

În general, singurul moment în care ar trebui să gestionați excepțiile în timpul testării este atunci când testați în mod specific scenariile de eroare și doriți să verificați din nou dacă programul dumneavoastră va reacționa într-un mod așteptat.

Exemple

Exemplele folosesc testul unitar Python, dar acesta este un sfat general.

Creez un modul care definește o funcție care returnează doar rezultatul împărțirii a 2 argumente de intrare.

Acesta este un exemplu foarte simplu cu care să vă gândiți, dar trebuie să vă imaginați că acesta ar putea fi un program foarte complex pentru care fie testați unități, fie scrieți teste funcționale automate.

Exemplu prost

FAIL: test_divide_unexpected_fail (__main__.TestDivide)
We know this will throw a Runtime Error. But imagine we didn't.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_divide_bad.py", line 24, in test_divide_unexpected_fail
    self.assertEqual(divide.divide(10, 0), 3)
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "test_divide_bad.py", line 26, in test_divide_unexpected_fail
    assert False
AssertionError
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (failures=1)

Codul de testare este detaliat și nu se obține nicio valoare suplimentară, așa cum veți vedea din exemplul următor. În acest caz, putem vedea urma erorii în scopuri de depanare, dar am văzut unde gestionarea erorilor ascunde de fapt eroarea reală în timp ce sunt în sălbăticie.

Bun exemplu

ERROR: test_divide_unexpected_fail (__main__.TestDivide)
We know this will throw a Runtime Error. But imagine we didn't.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_divide_good.py", line 17, in test_divide_unexpected_fail
    self.assertEqual(divide.divide(10, 0), 3)
  File "a/b/c/divide.py", line 2, in divide
    return a/b
ZeroDivisionError: division by zero
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (errors=1)

Dacă un test provoacă o excepție, pur și simplu eșuează cu o eroare. Acest lucru este mult mai curat, iar rezultatul de urmărire a erorilor legat de metodă arată foarte clar care problemă a apărut.

In cele din urma

Poate cel mai bun mod de a înțelege că testele au încorporat gestionarea erorilor este de a înțelege că o afirmație eșuată aduce o excepție! AssertionError.

Deci, următorul test va trece:

Sper că ați învățat ceva citind asta și ați putea să curățați un test sau două undeva.