Sunteți pe pagina 1din 20

Unit testing with Python

Dinu Diana Doina


Ilie Constantin Andrei
Neacsu Alexandra
Partu Ana-Maria

Grupa 452

Cuprins
BlackBox vs WhiteBox ……………………………………………………..3
Unit testing …………………………………………..………………………4
Unit testing in Python ……………………………………..………………..6
Mock in Unit Testing ………………………………………………………..13
Branch Testing …………………………………………………………….15
Mutation Testing …………………………………………………………….16

Black Box vs. White Box Testing

2
În testarea de tip black box, utilizatorul nu are informații despre funcționarea internă a
sistemului software. Este considerată testare la nivel ridicat care se concentrează pe
comportamentul software-ului. Implică testarea dintr-o perspectivă externă sau a
utilizatorului final. Testarea black box poate fi aplicată la aproape toate nivelurile de
testare software: unit, integration, system, application.

Testarea de tip white box este o tehnică de testare care verifică funcționarea internă a
sistemului. În această metodă, testarea se bazează pe acoperirea declarațiilor de cod,
ramuri, căi sau condiții. Este considerată testare la nivel scăzut. Se mai numește cutie
de sticlă, cutie transparentă, cutie limpede sau testare de bază a codului. Metoda de
testare white box presupune că este cunoscută calea logicii într-o unitate sau program.

Diferente cheie

1. În Black Box, testarea se face fără cunoașterea structurii interne a programului


sau a aplicației, în timp ce în White Box, testarea se face cu cunoașterea
structurii interne a programului.
2. Testul Black Box nu necesită cunoștințe de programare, în timp ce testul White
Box necesită cunoștințe de programare.
3. Testarea Black Box are ca principal obiectiv testarea comportamentului software-
ului, în timp ce testarea White Box are ca principal obiectiv testarea funcționării
interne a sistemului.
4. Testarea Black Box este axată pe perspectiva externă sau a utilizatorului final, în
timp ce testarea White Box este axată pe structura codului, condiții, căi și ramuri.

3
Unit testing

Unit testing-ul este un tip de testare software în care sunt testate unități individuale
sau componente ale unui software. Scopul este de a valida dacă fiecare unitate a
codului software funcționează așa cum este de așteptat. Testarea unității se face în
timpul dezvoltării (faza de codare) a unei aplicații de către dezvoltatori. Testele unității
izolează o secțiune de cod și verifică corectitudinea acestuia. O unitate poate fi o
funcție, metodă, procedură, modul sau obiect individual.

Unit testing-ul este primul nivel de testare efectuat înainte de testarea integrării. Unit
testing-ul este o tehnică de testare WhiteBox care este de obicei realizată de
dezvoltator. Deși, într-o lume practică datorată creșterii timpului sau reticenței
dezvoltatorilor la teste, inginerii de la QA fac și testarea unității.

De ce sa folosim unit testing?

4
Uneori, dezvoltatorii de software încearcă să economisească timp prin testarea unității
minime. Acesta este un mit, deoarece sărirea la testarea unității duce la costuri mai
mari de fixare a defectelor în timpul testării sistemului, testării integrării și chiar testării
beta după terminarea aplicației. Testarea corectă a unității, efectuată în timpul
dezvoltării, economisește timp și bani în final. Iată motivele cheie pentru efectuarea unit
testing-ului.

1.Unit testing ajută la remedierea erorilor la începutul ciclului de dezvoltare și la


economisirea costurilor.
2.Îi ajută pe dezvoltatori să înțeleagă baza de cod și le permite să facă schimbări rapid
3.Unit testing-urile bune servesc drept documentație de proiect
4.Unit testing-urile ajută la reutilizarea codului. Migrează atât codul tău cât și testele tale
către noul tău proiect.

Unit testing in Python

Ce este Python Testing?


5
Testarea automată este un context bine cunoscut în lumea testării. Este locul în care se
execută planurile de testare folosind scriptul în locul unui om.
Python vine cu instrumentele și bibliotecile care acceptă testarea automată pentru
sistemul dvs.
Cazurile de Python test sunt relativ ușor de scris. Odată cu utilizarea crescută a Python,
cadrele de automatizare a testelor bazate pe Python devin de asemenea populare.
Mai jos vom prezenta câteva Python Testing frameworks :

Mai departe am ales sa prezentam Unittest.

Unittest unit testing framework a fost inițial inspirat de JUnit și are un caracter similar cu
marile cadre de testare a unităților în alte limbi. Sprijină automatizarea testelor,
distribuirea codului de configurare și oprire pentru teste, agregarea testelor în colecții și
independența testelor de cadrul de raportare.

6
Cazuri de testare:

class unittest.TestCase (methodName = 'runTest')


Instanțele clasei TestCase reprezintă unitățile de test logice din universul unittest.
Această clasă este destinată a fi utilizată ca clasă de bază, testele specifice fiind
implementate de subclase de beton. Această clasă implementează interfața necesară
de alergătorul de testare pentru a-i permite să conducă testele și metodele pe care le
poate folosi codul de testare pentru a verifica și raporta diferite tipuri de defecțiuni.

Clasa TestCase oferă mai multe metode de afirmare pentru a verifica și raporta
eșecurile. Următorul tabel prezintă cele mai utilizate metode:

Pentru crearea testelor am creat 2 fișiere :

● In fisierul calc.py am definit functiile :

7
8
● In fisierul test_calc.py am scris testele si am folosit următoarele metode :

9
-> assertTupleEqual() - Testeaza daca 2 tupluri sunt egale. Dacă nu, se creează un
mesaj de eroare care arată doar diferențele dintre cele două. O eroare este de
asemenea ridicată dacă oricare dintre parametrii sunt de tip greșit.
-> assertListEqual() - Testează dacă 2 liste sunt egale. Dacă nu, se creează un mesaj
de eroare care arată doar diferențele dintre cele două. O eroare este de asemenea
ridicată dacă oricare dintre parametrii sunt de tip greșit.
-> assertEqual() - Testează dacă primul și al doilea sunt egali. Dacă valorile nu sunt
egale, testul va eșua.
-> assertTrue()/assertFalse() - Verifica dacă valoarea returnată de funcție este True sau
False

Mai jos vom atasa cateva exemple :

10
-> Sortare :

-> Mod :

-> Div :

Întotdeauna metodele trebuie sa fie definite corect. Dacă funcția nu este definită cum
trebuie automat testul va pica.

11
-> Aici avem definită funcția :

-> Testul pentru funcția respectivă :

-> Cand vom rula, vom observa ca testul va pica deoarece funcția nu este definită bine :

Mock Testing
Mock testing este o abordare a unit testing-ului care ne permite sa facem afirmații
despre cum interacționează codul testat cu alte module de sistem. Dependențele sunt
înlocuite cu obiecte care simulează comportamentul celor reale. Scopul mock testing-

12
ului este să izoleze și să se concentreze pe codul testat, ci nu pe comportamentul sau
starea dependențelor externe.

Exemplu de utilizare mock testing: Un serviciu de notificare care declanșează un


serviciu e-mail. Nu dorim să trimitem e-mailuri de fiecare dată când efectuăm un test de
notificare. Cu toate acestea, dorim să verificăm dacă este apelat serviciul de trimitere a
mail-urilor. Un astfel de serviciu poate fi înlocuit cu un obiect de tip mock.

Exemplu pe o funcție simpla de adaugare a unei valori la aruncarea unui zar. Folosită
pentru jocurile de tip DnD. Se arunca un zar apoi se adaugă un modifier la valoarea
zarului. Din moment ce nu putem ști ce valoare va avea zarul avem nevoie de un mock
pentru a testa funcția.

Facem un mock în care randint din fișierul diceroll va avea valoare 5 pentru a putea
testa și adăugăm autospec = True pentru a ne asigura că folosește numărul corect de
argumente.

Putem observa în cazul în care modificăm testul, acesta va eșua.

13
Branch Testing

În mod ideal, am dori să avem o acoperire de 100%, dar orice creștere este una bună.
S-ar putea să existe un cod specific platformei care pur și simplu nu va executa pentru
dvs., erori la ieșire, etc. La măsurarea ramurilor, cover.py colectează perechi de numere
de linie, o sursă și o destinație pentru fiecare tranziție de la o linie la alta. Analiza statică
a sursei oferă o listă de tranziții posibile. Compararea măsurată cu cea posibilă indică
ramuri lipsă.

In codul pentru mutation testing, observam ca pe masura ce adaugam cazuri,


acoperirea va creste. Acoperirea de 100 % nu este întotdeauna posibilă. Cel mai mare
coverage pe care am reusit sa il atingem a fost de 83%. Pentru a atinge 100% ar fi
trebuit sa scriem teste si pentru cazul in care n era negativ.

14
Mutation Testing (Testarea Mutanților)

Testarea mutanților evaluează calitatea testelor software existente. Testarea mutanților


presupune modificarea codului sursă al unui program.

O mutație reprezintă o mica modificare la nivelul codului (de exemplu schimbarea unui
operator).

În funcție de rezultatul testului, mutantul poate să fie:

· Supraviețuitor – dacă toate testele au trecut

· Omorât – dacă cel puțin un test a eșuat

· Time-out – în acest caz, se considera ca mutantul a fost omorât

· Incompetent – în acest caz, este vorba despre o eroare care nu poate fi


detectata înainte de execuția mutantului

15
Pentru a instala tool-ul mutpy folosim următoarea comanda

$ pip install mutpy

Pentru a rula tool-ul folosim următoarea comanda

$ mut.py --target fibonacci --unit-test test_fibonacci.py


--runner pytest -m

Unde parametrul fibonacci reprezinta fisierul in care este definita functia

Si parametru test_fibonacci reprezinta fisierul unde este scris testul

Testul a generat urmatorul output:

16
Concluzie: Testul a generat 13 mutanti dintre care:

● Omorati: 6 mutanti (M4, M5, M6, M7, M8, M13)


● Supravietuitori: 7 mutanti (M1, M2, M3, M9, M10, M11, M12)

În continuare vom adăuga încă un caz testului nostru

17
Testul a generat urmatorul output:

18
Concluzie: Testul a generat 13 mutanti dintre care:

● Omorati: 8 mutanti (M4, M5, M6, M7, M8, M9, M12, M13)
● Supravietuitori: 5 mutanti (M1, M2, M3, M10, M11)

Pentru a omora toti mutantii am scris un test pentru un termen mai mare

Testul a generat urmatorul output:

După cum se poate observa, toți mutantii au fost omorati

19
Următorul caz prezintă un test eșuat

Modificăm testul astfel incat termenul 5 din șirul lui Fibonacci să fie 4

Outputul generat este următorul

Testul a eșuat deoarece termenul 5 din șirul lui Fibonacci este 5, nu 4 (cum am scris în
test)

20

S-ar putea să vă placă și