Testarea unității

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În inginerie software , unitate de testare (unitate de testare sau de unitate de testare [1] ) se referă la testarea [2] Activitatea (testare, testare) de individuale software de unități. Prin unitate înțelegem de obicei cea mai mică componentă a unui program cu funcționare autonomă; în funcție de paradigma de programare sau de limbajul de programare , aceasta poate corespunde, de exemplu, unei singure funcții în programarea procedurală , sau unei singure clase sau unei singure metode în programarea orientată obiect .

Testarea unității este în mod normal efectuată de dezvoltatori și poate fi ocazional o cutie de sticlă , adică se bazează în mod explicit pe cunoașterea arhitecturii și funcționării interne a unei componente, precum și pe funcționalitatea sa expusă extern. [1] La fel ca alte forme de testare, testarea unitară poate varia de la complet „manual” laautomat . În special în cazul testării unitare automate, dezvoltarea cazurilor de testare (adică proceduri individuale de testare) poate fi considerată o parte integrantă a activității de dezvoltare (de exemplu, în cazul dezvoltării bazate pe teste ).

Beneficii

Scopul testării unitare [3] este de a verifica funcționarea corectă a părților programului, permițând astfel o detectare timpurie a erorilor . Testarea detaliată a unității vă poate oferi dovezi ferme că o bucată de cod funcționează corect, cu avantaje importante:

Simplificați modificările

Testarea unității facilitează schimbarea codului modulului ulterior ( refactorizare ) cu încrederea că modulul va continua să funcționeze corect. Procesul este de a scrie cazuri de testare pentru toate funcțiile și metodele, astfel încât, dacă o modificare are ca rezultat un eșec al testului, schimbarea responsabilă poate fi identificată cu ușurință.

Testele unitare pre-construite facilitează viața programatorului pentru a verifica dacă o bucată de cod funcționează corect. Testarea unitară bună produce cazuri de testare care acoperă toate căile de cod ale unității, cu o atenție deosebită la condițiile din bucle (teste dacă , în timp ce , pentru ).

În sistemele cu testare continuă a unității, aceste teste sunt capabile să garanteze automat integritatea codului la fiecare modificare.

Simplificați integrarea

Testarea unității simplifică integrarea diferitelor module, deoarece limitează defecțiunile la problemele de interacțiune dintre module și nu în module în sine, facilitând testele de integrare .

Un subiect mult dezbătut este cel al ne-necesității testelor de integrare manuală, dacă a fost organizată o procedură de testare unitară suficient de completă. În realitate, un sistem elaborat de testare unitară oferă adesea o falsă securitate, iar un test de integrare gestionat de om este de obicei la fel de necesar. Probabil necesitatea reală a factorului uman în procedura de testare depinde de caracteristicile sistemului în care este dezvoltat și mai ales de disponibilitatea resurselor.

Documentație de asistență

Testarea unității oferă documentație „live” a codului, deoarece este în mod inerent un exemplu de utilizare a API-ului modulului.

Testele includ elemente esențiale pentru succesul unei unități de cod. Aceste caracteristici indică utilizarea corectă a unității și comportamentele eronate care trebuie identificate în funcționarea sa. Prin urmare, testarea unitară documentează aceste caracteristici, deși în multe medii este posibil să nu fie singura documentare necesară. Pe de altă parte, documentația tradițională devine adesea învechită din cauza modificărilor ulterioare ale codului nedocumentat.

Limite

În general, testarea nu reușește să identifice toate erorile dintr-un program și același lucru se aplică testării unitare care, analizând prin definiție unitățile individuale, nu poate identifica erori de integrare, probleme de performanță și alte probleme legate de sistem. Testarea unității este cea mai eficientă atunci când este utilizată împreună cu alte tehnici de testare software.

La fel ca orice formă de testare, chiar și testarea unitară nu poate certifica absența erorilor, ci poate evidenția doar prezența lor.

Testarea software-ului este o problemă matematică combinatorie. De exemplu, fiecare test boolean necesită cel puțin două teste, unul pentru condiția „adevărată” și unul pentru condiția „falsă”. Se poate arăta că sunt necesare 3 până la 5 linii de cod pentru test pentru fiecare linie de cod funcțional. Prin urmare, este nerealist să testați toate combinațiile posibile de intrare ale oricărui cod netivial fără un instrument dedicat de generare a cazurilor de testare.

Pentru a obține beneficiile așteptate ale testării unitare, este necesar un sentiment riguros de disciplină pe tot parcursul procesului de dezvoltare. Este esențial să țineți evidența nu numai a testelor care au fost dezvoltate și efectuate, ci și a tuturor modificărilor aduse codului funcțional al unității examinate și a tuturor celorlalte. Utilizarea unui sistem de control al versiunilor este esențială. Dacă o versiune ulterioară a unei unități nu reușește un test pe care l-a trecut anterior, sistemul de control al versiunii vă permite să evidențiați orice modificări de cod care au avut loc între timp.

Separarea interfeței de implementare

Deoarece unele clase se pot referi la altele, testul unei clase se propagă adesea celorlalte. Un exemplu este o clasă care interacționează cu o bază de date : testarea clasei implică adesea scrierea unui cod care interacționează cu baza de date. Aceasta este o problemă, deoarece testul unitar nu ar trebui să depășească niciodată granițele clasei. Consecința este că programatorul, în proiectarea testării unitare, învață să izoleze clasa de analizat, identificând interfața cu baza de date și implementând-o cu un obiect simulat , o simulare a obiectului real care poate fi realizat în condiții controlate. Efectul este testarea mai profundă și, prin urmare, testarea unității de calitate superioară.

Aplicații

Programare extremă

Testarea unității este partea fundamentală a programării extreme (XP), care se bazează pe un cadru de testare unitară , care poate fi furnizat de terți sau creat în cadrul echipei de dezvoltare.

Programarea extremă utilizează crearea de teste unitare pentru Test Driven Development (TDD). Dezvoltatorul scrie un test unitar care evidențiază o funcționalitate cerută de specificație sau un posibil defect. Testul poate eșua deoarece funcționalitatea nu a fost încă implementată sau pentru că defectul căutat a apărut efectiv. Apoi dezvoltatorul scrie cel mai simplu cod funcțional posibil pentru ca testul să ruleze cu succes.

Toate clasele sunt testate în acest fel, iar dezvoltatorul lansează codul de test împreună cu codul funcțional testat. XP, cu teste unitare aprofundate, are toate avantajele descrise mai sus, iar testele sunt utilizate ulterior ca test de regresie.

Evident, această tehnică este aplicabilă doar unităților deterministe ale codului, în timp ce toate codurile de integrare sau nedeterministe, de exemplu codul care se bazează pe interacțiunile utilizatorilor, bazele de date, interacțiunea cu sistemul de operare sau periferice, rețeaua de conexiuni, nu poate să fie testat în acest mod. În unele cazuri, interfețele simulate (mock) sunt utilizate pentru a emula interacțiunea cu elemente nedeterministe (de exemplu prin simularea unei posibile baze de date sau a comportamentului unui utilizator), dar din motive evidente acest tip de testare nu este nici complet, nici total realist.

Tehnici

Testarea unității este de obicei automatizată, dar se poate face și manual. Nu există nicio recomandare IEEE pentru acest lucru. Abordarea manuală poate necesita documentarea pașilor necesari pentru efectuarea testului de unitate. În orice caz, scopul testului unitar este izolarea unui modul și certificarea corectitudinii acestuia. Automatizarea, spre deosebire de testarea manuală, este o modalitate eficientă de a atinge aceste obiective și de a aduce beneficiile descrise.

Cu abordarea automată, pentru a realiza izolarea completă a modulului de testat, codul funcțional este testat în afara mediului său natural, într-un cadru specific. Această abordare are avantajul de a evidenția dependențele nesolicitate ale modulului luat în considerare de către celelalte.

Într-un cadru automat, dezvoltatorul codifică cazurile care trebuie testate astfel încât să verifice corectitudinea modulului și în timpul executării este raportată posibila eroare a fiecărui test. În unele cazuri de eșecuri critice ale testului, întreaga procedură de testare este oprită.

Consecința testării unitare este o abordare a programării care favorizează scrierea codului în module independente și interoperabile, care la rândul său contribuie, împreună cu modelele de proiectare și alte practici comune la realizarea celui mai bun cod posibil.

Cadrul de testare unitară

Există cadre dezvoltate pentru testarea unitară a unei nenumărate limbi. În general, este posibil să se efectueze teste unitare fără sprijinul unui cadru specific scriind cod care testează modulul și implementează mecanisme precum afirmații, excepții sau ieșiri timpurii pentru a raporta eșecuri. Această abordare este valoroasă, deoarece simplifică adoptarea testelor unitare, dar este limitată și de absența multor caracteristici avansate ale cadrelor disponibile.

Notă

  1. ^ a b Glosar de testare software
  2. ^ În terminologia engleză, răspândită și în literatura italiană, dar nu întotdeauna adoptată în mod consecvent, cuvântul testare indică activitatea de testare în ansamblu; un singur test se numește test .
  3. ^ (EN) Unit Testing vs Functional Testing: A Comparație detaliată cu informații despre cele mai recente tehnologii - Simform Blog, 16 martie 2019. Accesat pe 28 iunie 2021.

Elemente conexe

linkuri externe