Modulul unittest testa programele lor, Python 3 pentru începători și începători

Imaginați-vă că ați scris un program, și doriți să verificați dacă funcționează corect. Ce ai face pentru asta? Cel mai probabil, vă va rula de mai multe ori cu diferite date de intrare, și pentru a asigura răspunsul corect emis.

Acum ai schimba ceva și doriți să re-verifica corectitudinea programului. Rulați câteva ori mai mult? Dar, apoi, din nou, dacă ceva se va schimba? Este posibil pentru a automatiza cumva acest lucru?

Se pare că poți. În Python este construit unittest modul. care susține automatizare de testare, utilizarea unui cod comun pentru configurarea și finalizarea testului, testele de asociere în grupuri, și permite testarea separată a cadrului pentru afișarea informațiilor.

Pentru a automatiza testul, unittest susține câteva concepte importante:

  • banc de încercare (test de prindere) - sunt pregătite, necesare pentru a efectua testele și toate acțiunile necesare pentru a curăța după test. Aceasta poate include, de exemplu, crearea bazei de date temporare sau de a lansa un proces de server.
  • caz test (caz test) - unitatea minimă de testare. Acesta verifică răspunsurile pentru diferite seturi de date. unittest modul oferă o testcase clasă de bază, care poate fi folosit pentru a crea noi cazuri de testare.
  • Setul de teste (suita de teste) - un număr de cazuri de testare, kituri de testare, sau ambele. Este folosit pentru testele de asociere, care trebuie să fie efectuate împreună.
  • test de Artist (testul Runner) - o componentă care controlează executarea de teste și oferă utilizatorului cu rezultatul. Contractantul poate utiliza o interfață grafică sau text, sau returna o valoare deosebită, care raportează rezultatele test de executie.

unittest modul oferă un set bogat de instrumente pentru scrierea și rularea testelor. Cu toate acestea, destul de puține dintre ele pentru a satisface nevoile de majoritatea utilizatorilor.

Aici este un scurt script pentru a testa trei metode de linii:

Cazul de testare este creat de la unittest.TestCase moștenind. 3 teste separate sunt definite prin metode al căror nume începe cu testul. Acordul spune executorul testelor pe ce metode sunt teste.

Esența fiecărui test - provocare assertEqual () pentru a verifica rezultatul așteptat; assertTrue () sau assertFalse () pentru a verifica condițiile; assertRaises () pentru a verifica că metoda aruncă o excepție. Aceste tehnici sunt utilizate în locul assert de obicei pentru a testa alergător a fost în măsură să ia toate rezultatele și să emită un raport.

SetUp () și teardown () (care, în acest caz, pur și simplu nu este necesar), se lasă să se stabilească instrucțiuni executate înainte și după fiecare test, respectiv.

Ultimele două linii arată test de a rula un mod simplu. unittest.main () oferă o interfață linie de comandă pentru programul de testare. Când executați din linia de comandă, script-ul afișează un raport, ca aceasta:

Interfață linie de comandă

unittest pot fi utilizate din linia de comandă pentru a rula teste module, clase, sau chiar metode distincte:

Puteți specifica, de asemenea, calea către fișierul:

Cu -v pavilion poate obține mai detaliată:

un raport detaliat va fi atât de exemplul nostru:

-b (--buffer) - program de ieșire în cazul în care testul de eșec va fi afișat, și nu ascunse, ca de obicei.

-c (--catch) - Ctrl + C în timpul testului așteaptă terminarea testului curent și apoi raportează rezultatele până în prezent. Un al doilea apăsați Ctrl + C este de obicei excepție KeyboardInterrupt.

-f (--failfast) - randamentul după primul test eșec.

--localnici (din Python 3.5) - arată variabilele locale pentru un test eșuat.

teste de detectare

Testele de detectare realizate în TestLoader.discover (), dar pot fi utilizate din linia de comandă:

-v (--verbose) - Ieșire verbose.

-s (--start-director) DIRECTORY_NAME - director care începe testul de detectare (curent implicit).

-p (--pattern) model - numele fișierului șablon cu testele (pentru testul * implicit PY).

-t (--top-nivel-director) DIRECTORY_NAME - director de proiect de nivel superior (implicit este start-director).

Organizarea codului de testare

Testarea Unitatea de bază este cazurile de testare - cazuri simple, care ar trebui să fie verificate pentru corectitudine.

Cazul de testare este creat de la unittest.TestCase moștenind.

Codul de testare trebuie să fie independentă, adică nu depinde de alte teste.

Cea mai simplă subclasa testcase poate pune în aplicare pur și simplu o metodă de testare (metoda de testare începând cu). Un exemplu fictiv:

Rețineți că, în scopul de a testa ceva, vom folosi una dintre metodele () assert \ *.

Testele pot fi multe, iar unele cod de configurare poate fi repetată. Din fericire, putem defini setările de cod prin implementarea metodei de configurare (), care se va desfășura înainte de fiecare test:

Putem determina, de asemenea, metoda teardown (), care se va executa după fiecare încercare:

Puteți plasa toate testele în același fișier ca și programul în sine (cum ar fi widgets.py), dar aranjamentul de testare într-un fișier separat (cum ar fi test_widget.py) are multe avantaje:

  • Modulul de test poate fi rulat în mod independent, din linia de comandă.
  • Codul de testare pot fi ușor separate de program.
  • Mai puțin tentația de a schimba codul de test pentru a se conforma programului pentru nici un motiv aparent.
  • Codul de testare ar trebui să fie modificate mult mai puțin frecvent decât în ​​program.
  • Codul de testat poate fi ușor de reciclat.
  • Teste pentru modulele de pe C trebuie să fie în module separate, așa că de ce să nu fie consecvente?
  • În cazul în care strategia de testare se schimbă, nu este nevoie de a schimba codul.

Sar peste teste și erori estimate

unittest sprijină sărind peste teste individuale și clase de test. În plus, marca este menținută ca un test „nu funcționează, dar așa să fie.“

testul Omiterea se realizează cu ajutorul decorator skip () sau una dintre variantele sale condiționate.

Clasele pot fi, de asemenea, omise:

Așteptat utilizare eroare decorator expectedFailure ():

Foarte ușor de a face decorator dumneavoastră. De exemplu, următorul decorator trece testul dacă obiectul trecut are atributul specificat:

Decoratori, sărind peste teste sau vorbind despre eroarea de așteptat:

@ Unittest.skip (motiv) - sări peste testul. motiv explică de ce trec.

@ Unittest.skipIf (condiție, motiv) - sări peste testul în cazul în care condiția este adevărată.

@ Unittest.skipUnless (condiție, motiv) - sări peste test, în cazul în care condiția este falsă.

@ Unittest.expectedFailure - marchează testul ca eroare de așteptat.

nu alerga SetUp () și teardown () pentru un test ratat. Pentru clasele pierdute nu începe setUpClass () și tearDownClass (). Pentru modulele care lipsesc nu sunt conduse setUpModule () și tearDownModule ().

iterații de testare folosind Distinguishing subtests

Atunci când unele teste au doar diferențe minore, de exemplu unii parametri, unittest permite pentru a le distinge în aceeași metodă de testare, folosind un subtestului manager de context ().

De exemplu, următorul test:

dă următorul raport:

Fără utilizarea subteste, executarea se va opri după prima eroare, iar eroarea va fi mai dificil de diagnosticat, deoarece valoarea lui i nu vor fi afișate:

Verificați pe succesul

Modulul unittest oferă un set de funcții pentru o varietate de teste:

assertTrue (x) - bool (x) este True

assertFalse (x) - bool (x) este False

assertIsNot (a, b) - a nu b

assertIsNone (x) - x este Niciuna

assertIsNotNone (x) - x nu este nici unul

assertNotIn (a, b) - a nu b

assertIsInstance (a, b) - isinstance (a, b)

assertNotIsInstance (a, b) - nu isinstance (a, b)

assertRaises (EXC, distracție, * ARGS, ** kwds) - distracție (* ARGS, ** kwds) aruncă o excepție exc

assertRaisesRegex (EXC, r, distracție, * ARGS, ** kwds) - distracție (* ARGS, ** kwds) aruncă o EXC excepție și un mesaj se potrivește cu expresia regulată r

assertWarns (avertizează, distracție, * args, ** kwds) - distracție (* ARGS, ** kwds) generează un avertisment

assertWarnsRegex (avertizează, r, distracție, * args, ** kwds) - distracție (* ARGS, ** kwds) generează un avertisment și un mesaj se potrivește cu expresia regulată r

assertAlmostEqual (a, b) - rotund (a-b, 7) == 0

assertNotAlmostEqual (a, b) - rotund (a-b, 7) = 0

assertGreater (a, b) - a> b

assertGreaterEqual (a, b) - a> = b

assertLessEqual (a, b) - o <= b

assertNotRegex (s, r) - nu r.search (s)

assertCountEqual (a, b) - a și b conține aceleași componente în aceleași cantități, dar ordinea nu este importantă