Test Metrics.

Python Code Coverage

Python este unul dintre cele mai populare limbaje de programare disponibile în prezent. Datorită caracterului său generalist, Python își găsește aplicații în diverse cazuri de utilizare în dezvoltarea de software, de la simple scripturi la servere web și până la cadre precum Django.

Cu toate acestea, ca și în cazul altor limbaje de programare, testarea rămâne unul dintre cele mai importante aspecte ale dezvoltării de software în Python.

În această postare, vom vedea câteva instrumente pentru a măsura și scrie acoperirea cazurilor de testare pentru codul Python.

Unittest

Biblioteca standard Python este preintegrată cu un modul numit unittest. Inspirat de JUnit și de alte cadre de testare unitară din principalele limbaje de programare, unittest este un cadru de testare care vă permite să automatizați testele, să configurați coduri de configurare și închidere partajate pentru teste și multe altele.

Una dintre caracteristicile importante ale lui unittest este dispozitivul de testare, adică configurația necesară pentru a rula unul sau mai multe teste, precum și orice acțiuni de curățare asociate. Cu text fixture, activitățile, cum ar fi crearea de baze de date temporare sau proxy, directoare sau pornirea unui proces de server, pot fi rezolvate într-o singură locație.

Să luăm câteva exemple de cazuri de testare și să vedem cum sunt implementate folosind unittest:

import unittest

class TestStringMethods(unittest.TestCase):

def test_upper(self):
self.assertEqual(‘foo’.upper(), ‘FOO’)

def test_isupper(self):
self.assertTrue(‘FOO’.isupper())
self.assertFalse(‘Foo’.isupper())

def test_split(self):
s = ‘hello world’
self.assertEqual(s.split(), )
# verifică dacă s.split eșuează atunci când separatorul nu este un șir de caractere
with self.assertRaises(TypeError):
s.split(2)

if __name__ == ‘__main__’:
unittest.main()

Crearea unui caz de test prin subclasarea unittest.TestCase. Apoi puteți defini teste individuale cu metode. Rețineți că numele cazurilor de test trebuie să înceapă cu cuvântul test. Această convenție de denumire informează executantul de teste despre ce metode reprezintă testele.

Executorul de teste este componenta care orchestrează executarea testelor și furnizează rezultatul utilizatorului. Implementarea sa variază și poate utiliza o interfață grafică, o interfață textuală sau poate returna o valoare specială pentru a indica rezultatele executării testelor.

Pytest

Pytest este un cadru de testare Python terță parte. Acesta își propune să ofere un cadru pentru a vă scrie testele în mod eficient, eliminând toate cheltuielile generale pentru crearea testelor. Pytest este suportat de Python 2.7, 3.4, 3.4, 3.5, 3.6, Jython, PyPy-2.3 pe Unix/Posix și Windows.

Să aruncăm o privire la cum să începem cu Pytest.În primul rând, descărcați cea mai recentă versiune și instalați-o prin pip:

pip install -U pytest

Puteți verifica versiunea instalată prin:

pytest -version

Acum, haideți să luăm un exemplu de funcție și cazul de test aferent.

# conținutul test_sample.py
def func(x):
returnează x + 1def test_răspuns():
assert func(3) == 5

Funcția func ia o intrare x și returnează o valoare x + 1. În cazul de test, afirmăm dacă funcția func ia la intrare 3 și returnează 5. Se așteaptă ca acest caz de test să eșueze. Pentru a rula testul, este suficient să tastați pytest în directorul care conține fișierul test_sample.py.

$ pytest
=========================== începe sesiunea de testare ============================
platformă linux – Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
rootdir: $REGENDOC_TMPDIR, inifile:
colectat 1 itemtest_sample.py F ================================= EȘECURI =================================
_______________________________ test_răspuns ________________________________

def test_răspuns():
> assert func(3) == 5
E assert 4 == 5
E + unde 4 = func(3)

test_sample.py:5: AssertionError
========================= 1 a eșuat în 0.12 secunde =========================

Coverage.py

Coverage.py este unul dintre cele mai populare instrumente de acoperire a codului pentru Python. Acesta utilizează instrumente de analiză a codului și cârlige de urmărire furnizate în biblioteca standard Python pentru a măsura acoperirea. Funcționează pe versiunile majore ale CPython, PyPy, Jython și IronPython. Puteți utiliza Coverage.py atât cu unittest, cât și cu Pytest.

Puteți fie să descărcați cea mai recentă versiune de Coverage și să o instalați manual, fie să o instalați cu pip as:

$ pip install coverage

Acum rulați programul dvs. cu coverage as

$ coverage run my_program.py arg1 arg2

În continuare, pentru a obține datele de acoperire, executați

$ coverage report -m

Iată o mostră de ieșire a datelor de acoperire

$ coverage report -m
Name Stmts Miss Missing Cover Missing
——————-
my_program.py 20 4 80% 33-35, 39
my_other_module.py 56 6 89% 17-23
——————-
TOTAL 76 10 87%

Generați raportul în fișier html:

$ coverage html

Aceasta este o mostră de raport HTML așa cum a fost generat de Coverage.py. Acesta include Module, statements, missing, excluded, branches, partial și coverage.

Pytest-cov

Pytest-cov este un plugin Python pentru a genera rapoarte de acoperire. În plus față de funcționalitățile suportate de comanda coverage, acesta suportă, de asemenea, testarea centralizată și distribuită. De asemenea, suportă și acoperirea subproceselor.

După ce ați scris cazurile de testare așa cum este necesar cu Pytest, puteți folosi Pytest-cov pentru a rula toate testele și a raporta acoperirea.

Pentru a începe, instalați Pytest-cov ca:

$ pip install pytest-cov

Testare centralizată

Testarea centralizată raportează acoperirea combinată a procesului principal și a tuturor subproceselor sale. Puteți rula testarea centralizată folosind,

$ py.test -cov= tests/

Testare distribuită

Instalați Pytest-xdist, pentru suportul sistemului distribuit:

$ pip install pytest-xdist

Testarea distribuită se poate face în două moduri, dist setat la load și each. Atunci când este setat la load, se raportează acoperirea combinată a tuturor sclavilor în timpul testării distribuite. Sclavii pot fi repartizați pe orice număr de gazde și fiecare sclav poate fi localizat oriunde pe sistemul de fișiere. Fiecare sclav va avea subprocesele sale măsurate.

Pentru testarea distribuită în fiecare mod, pytest-cov raportează, de asemenea, acoperirea combinată a tuturor sclavilor. Deoarece fiecare sclav rulează toate testele, acest lucru permite generarea unui raport de acoperire combinat pentru mai multe medii

Rezumat

În această postare, am învățat despre diferite cadre Python de testare unitară și de acoperire a codului. Deși aceste cadre facilitează procesul de testare, tot trebuie să scrieți testele. Iată câteva bune practici de care trebuie să țineți cont atunci când scrieți testele unitare.

  • Utilizați nume lungi și descriptive. Acest lucru evită adesea nevoia de doctrine în metodele de testare.
  • Testele ar trebui să fie izolate. Nu interacționați cu o bază de date sau o rețea reală. Folosiți o bază de date de testare separată care se descompune sau folosește obiecte simulate.
  • Concentrați-vă pe o mică parte a funcționalității.
  • Ar trebui să fie rapid, dar un test lent este mai bun decât niciun test.
  • De multe ori are sens să aveți o clasă de cazuri de testare pentru o singură clasă sau model.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.