Testarea de regresie este procesul de verificare repetată a aplicației după efectuarea modificărilor pentru a detecta defecte în funcționalitatea care funcționa anterior. Fiecare modificare de cod — funcționalitate nouă, remediere de eroare sau refactorizare — poate strica din neatenție capacitățile existente ale aplicației. Testele de regresie automatizează verificarea că funcționalitatea veche a rămas operațională. Conform studiului IBM, 2023, testarea de regresie acoperă între 30 și 70% din toate testele executate în echipele de produs comerciale, subliniind rolul său ca principală barieră împotriva incidentelor de producție.
Principalele puncte
Testarea de regresie este un tip de testare menit să confirme că modificările din cod nu au afectat funcționalitatea existentă. Termenul „regresie” înseamnă revenirea la o stare mai proastă — atunci când o funcție care funcționa în versiunea anterioară încetează să mai funcționeze în cea nouă. Testele de regresie se execută de mai multe ori în fiecare ciclu de dezvoltare, ceea ce le diferențiază de testele funcționalităților noi, care sunt scrise o singură dată.
Necesitatea testării de regresie decurge din efectul modificărilor în cascadă: remedierea unei erori într-un modul poate rezolva problema, dar poate strica funcționalitatea adiacentă care depindea de acesta. De exemplu, modificarea unei interogări SQL în depozitul de utilizatori poate accelera autentificarea, dar poate strica exportul de date care folosea aceeași interogare. Un test de regresie pentru exportul de date va detecta această încălcare înainte de lansare.
Conform raportului CISQ 2023, costul remedierii unui defect de regresie detectat în producție este de 15 ori mai mare decât în etapa de rulare automatizată de regresie. Companiile care investesc în testarea automatizată de regresie reduc ponderea defectelor de regresie în lansări de la 25% la 5% în decurs de un an de la implementare, conform Capgemini World Quality Report.
Există mai multe abordări ale testării de regresie, care diferă prin volum și criterii de selecție a testelor. Alegerea abordării depinde de dimensiunea proiectului, frecvența modificărilor și timpul disponibil în pipeline-ul CI. Mai jos sunt prezentate principalele tipuri de testare de regresie cu caracteristicile lor.
Rularea completă de regresie execută toate testele automatizate ale proiectului fără excepție. Această abordare oferă încredere maximă, dar necesită resurse de calcul și timp semnificative. Rularea completă se efectuează înaintea lansărilor majore — o dată la 2–4 săptămâni. Pentru o aplicație cu 5000 de teste, o rulare completă durează între 2 și 6 ore, în funcție de infrastructură.
Abordarea selectivă lansează doar testele legate de modulele modificate. Pentru determinarea conexiunilor se utilizează analiza dependențelor la nivel de cod: dacă clasa UserRepository a fost modificată, se lansează testele care depind de UserRepository direct sau tranzitiv. Instrumentele Jacoco, Android Test Coverage și Xcode Code Coverage oferă hărți de acoperire pentru selecție precisă. Rularea selectivă se efectuează la fiecare pull request și durează 5–15 minute.
Regresia bazată pe risc clasifică testele după criticitatea funcționalității și probabilitatea de defecțiune. Funcțiile critice — plată, autorizare, sincronizare — sunt testate la fiecare modificare de cod. Funcțiile auxiliare — ecranul „Despre aplicație”, animații — sunt testate doar înainte de lansare. Clasificarea este revizuită trimestrial pe baza datelor despre incidentele de producție.
Adesea conceptele de testare de regresie și retestare sunt confundate, deși sunt procese diferite. Retestarea este rularea repetată a unui test specific care a eșuat anterior, după remedierea defectului. Scopul retestării este de a se asigura că remedierea funcționează: eroarea nu se mai reproduce. Retestarea se efectuează o singură dată, imediat după remediere și confirmarea remedierii de către dezvoltator.
Testarea de regresie este rularea testelor asupra funcționalității existente care NU a fost modificată. Scopul este de a se asigura că remedierea unui defect nu a creat un nou defect în altă parte. Testele de regresie se execută de mai multe ori în fiecare ciclu de dezvoltare, indiferent de ce erori specifice au fost remediate. Diferența principală: retestarea verifică remedierea în sine, regresia verifică consecințele remedierii.
În pipeline-ul CI/CD, ambele procese se execută secvențial. După îmbinarea pull request-ului, se lansează retestarea erorii specifice, apoi rularea completă sau selectivă de regresie. Potrivit SmartBear (2022), separarea acestor procese reduce timpul de diagnosticare a rulărilor CI eșuate cu 30%, deoarece echipa vede imediat ce parte a defectelor este legată de regresie și ce parte de remedieri nefuncționale.
Automatizarea testării de regresie este un factor critic de succes pentru proiectele mobile moderne. Testarea manuală de regresie nu se scalează: pentru un set de 200 de teste, o singură rulare necesită 2–3 zile lucrătoare ale unui inginer QA, ceea ce face imposibile rulările zilnice. Testele de regresie automatizate se execută în 10–60 de minute fără intervenție umană, permițând lansarea lor la fiecare commit sau pull request.
Pentru menținerea setului de regresie în stare actualizată se utilizează analitica testelor: instrumente precum Allure, ReportPortal și Xray urmăresc procentele de promovare, durata și stabilitatea fiecărui test. Testele a căror stabilitate scade sub 90% (se strică frecvent din cauza modificărilor în cerințe) sunt marcate ca legacy și trimise spre revizuire proprietarului.
Să analizăm configurarea unui test de regresie automatizat pe Android utilizând biblioteca JUnit 5 și Espresso. Exemplul demonstrează regresia selectivă — testul verifică că după refactorizarea depozitului de utilizatori, ecranul de profil nu s-a stricat. Pentru iOS se utilizează XCTest cu o logică similară — un test repetat asupra scenariului cheie.
Testul utilizează MockWebServer pentru emularea serverului și verifică calea completă: încărcarea datelor utilizatorului, afișarea pe ecranul de profil și gestionarea erorii atunci când serverul este indisponibil. Astfel de teste sunt incluse în setul de regresie și se execută la fiecare modificare în module-profile.
@RunWith(AndroidJUnit4::class)
class ProfileRegressionTest {
@get:Rule
val composeRule = createComposeRule()
@Test
fun profileScreen_rendersCorrectly() {
val user = User(id = 1, name = "Alice", email = "alice@test.com")
composeRule.setContent {
ProfileScreen(user)
}
composeRule.onNodeWithText("Alice").assertIsDisplayed()
composeRule.onNodeWithText("alice@test.com").assertIsDisplayed()
}
@Test
fun profileScreen_handlesNetworkError() {
setNetworkError()
composeRule.onNodeWithText("Eroare de încărcare").assertIsDisplayed()
}
}
Pentru iOS, testul de regresie utilizează XCTestExpectation pentru verificarea asincronă a actualizării UI după primirea datelor de la API. Testul emulează răspunsul rețelei și verifică că elementele UI s-au actualizat corect.
class ProfileRegressionTests: XCTestCase {
func testProfileScreen_rendersCorrectly() {
let viewModel = ProfileViewModel(userId: 1)
let view = ProfileView(viewModel: viewModel)
viewModel.loadProfile()
let expectation = expectation(description: "profile loaded")
viewModel.onProfileLoaded = {
XCTAssertEqual(viewModel.userName, "Alice")
XCTAssertEqual(viewModel.userEmail, "alice@test.com")
expectation.fulfill()
}
waitForExpectations(timeout: 3.0)
}
}
Construirea unui set de regresie eficient este un proces iterativ bazat pe date despre defecte și modificări de cod. Strategia primară constă în includerea tuturor testelor existente în setul de regresie și rularea completă înainte de fiecare lansare. Pe măsură ce baza de teste crește (peste 2000 de teste), rularea completă devine prea lungă și este necesară o abordare selectivă.
A doua fază — implementarea instrumentelor de analiză a dependențelor: Jacoco pentru Android, Xcode Test Plan pentru iOS. Aceste instrumente construiesc o hartă „test — clasă — metodă” și permit determinarea testelor afectate de o anumită modificare. Rularea selectivă bazată pe analiza acoperirii reduce timpul de execuție cu 60–80%, păstrând 95% din eficacitatea detectării regresiilor, conform Spotify Engineering (2022).
A treia fază — monitorizare continuă și optimizare. Testele care nu au eșuat timp de 6 luni sunt mutate într-un set cu prioritate scăzută. Testele care eșuează mai des de o dată pe lună sunt candidate pentru revizuire: fie detectează probleme reale (necesită remediere), fie sunt prea fragile (necesită stabilizare). Revizuirea trimestrială a setului de regresie este o practică standard pentru menținerea eficacității și vitezei sale de execuție.
Întrebări frecvente
Rularea selectivă de regresie — la fiecare pull request. Rularea completă de regresie — înainte de fiecare lansare și săptămânal (nightly build). Regula cheie: cu cât rularea este mai frecventă, cu atât regresiile sunt detectate mai repede și costul remedierii lor este mai mic. Pentru proiecte critice, este posibilă regresia completă la fiecare îmbinare.
Toate testele unitare (regresia de bază), testele de integrare asupra componentelor cheie și testele UI asupra scenariilor critice de utilizator. Nu includeți testele funcționalităților experimentale, testele cu flakiness peste 10% și testele care necesită mediu manual.
Eliminați testele funcționalităților șterse, actualizați testele la modificarea cerințelor, efectuați un audit trimestrial al setului. Analitica CI — Allure, ReportPortal — ajută la identificarea testelor care și-au pierdut actualitatea: dacă un test nu s-a modificat și nu a eșuat timp de 3 luni, este candidat pentru eliminarea din rularea zilnică.
Utilizați rularea paralelă a testelor pe mai multe dispozitive, implementați regresia selectivă bazată pe analiza acoperirii codului modificat, dezactivați capturile de ecran pentru ecranele irelevante. Timpul țintă pentru rularea selectivă — 5–10 minute, pentru cea completă — cel mult 2 ore.
Nu, testarea de regresie include și verificări manuale: testarea exploratorie după lansare, regresia UX și verificarea accesibilității după modificarea interfeței. Automatizarea acoperă 70–80% din verificările de regresie; restul de 20–30% sunt teste manuale, concentrate pe scenarii care nu pot fi sau sunt prea costisitoare de automatizat.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și