Reqresiya — bu nədir, niyə yaranır və necə test etməli

Müəllif: IT Sectr Dərc olunub: 2026-07-30 Oxuma vaxtı: 7 dəq

Reqresiya — koda dəyişikliklər edildikdən sonra ortaya çıxan, halbuki əvvəllər eyni funksionallıq düzgün işləyən səhvdir. Reqresiya o deməkdir ki, yeni dəyişiklik əvvəllər yazılmış və test edilmiş funksionallığı “pozdu”. Bu, inkişafda ən çox rast gəlinən və təhlükəli problemlərdən biridir: bir səhvi düzəldən proqramçı gözə görünmədən üç başqa funksiyanı poza bilər. Capers Jones Software Engineering 2023 məlumatlarına görə, reqresiya səhvlərinin orta sıxlığı hər 100 dəyişdirilmiş kod sətri üçün 1–3 təşkil edir. Reqresiyaların səbəblərini, aşkarlama metodlarını və qarşısını alma strategiyalarını nəzərdən keçiririk.

Əsas məqamlar

  • Reqresiya — əvvəllər işləyən koda dəyişiklik edildikdən sonra yaranan səhv
  • Əsas səbəb — dəyişikliklərin yan təsirləri: kod gizli asılılıqlarla bağlıdır
  • Vahid testləri və reqresiya testi — reqresiyaları aşkarlamaq üçün əsas vasitələr
  • Əl ilə reqresiya testi miqyaslanmır — avtomatlaşdırma lazımdır
  • Avtomatik testlərlə CI/CD pipeline-i reqresiyaları istehsalata çatmadan yaxalayır

İnkişafda reqresiya nədir

Reqresiya — əvvəlki versiyada işləyən funksionallığın dəyişiklik edildikdən sonra işləməməsi vəziyyətidir. Dəyişiklik hər hansı ola bilər: səhvin düzəldilməsi, yeni funksiyanın əlavə edilməsi, refaktorinq, kitabxananın yenilənməsi və ya hətta konfiqurasiyanın dəyişdirilməsi. Reqresiya sabitliyin əsas düşmənidir: hər dəyişiklik artıq yoxlanılmış və buraxılmış bir şeyi pozmaq riski daşıyır.

Termin test sahəsindən gəlir: reqresiya testi — hər dəyişiklikdən sonra mövcud testlərin təkrar icrasıdır. Əgər əvvəllər keçən test uğursuz olarsa — bu reqresiya deməkdir. Geniş mənada reqresiya təkcə testin uğursuzluğu deyil, həm də istifadəçi və ya QA tərəfindən aşkarlanan hər hansı davranış pisləşməsidir. Tricentis State of Testing 2023 məlumatlarına görə, reqresiyalar istehsalatda tapılan bütün səhvlərin 35–45%-ni təşkil edir.

Adi səhvdən reqresiya zaman konteksti ilə fərqlənir: səhv həmişə mövcud ola bilərdi, reqresiya isə həmişə dəyişikliyin nəticəsidir. Bu vacib fərqdir, çünki reqresiyanın səbəbini axtarmaq dəyişikliklərin təhlili ilə başlayır: “işləyirdi” ilə “işləməyi dayandırdı” arasında nə dəyişdirildi. Git bisect — reqresiyaya səbəb olan commit-i tapmaq üçün standart vasitə.

Reqresiya növləri və nümunələr

Yerli reqresiya — A modulundakı dəyişiklik eyni A modulunda funksionallığı pozur. Nümunə: proqramçı sıralama funksiyasını yenidən yazır və o, boş massivi düzgün emal etməyi dayandırır. Yerli reqresiya aşkarlamaq və düzəltmək üçün ən asandır, çünki səbəb və nəticə yaxındır.

Uzaq reqresiya — A modulundakı dəyişiklik birbaşa kodla bağlı olmayan, lakin məlumat və ya zamanla bağlı olan B modulunda funksionallığı pozur. Nümunə: “İstifadəçilər” modulunda verilənlər bazası sxeminin dəyişdirilməsi eyni cədvəldən istifadə edən “Analitika” modulunda hesabatı pozur. Uzaq reqresiyalar ən məkrlidir: proqramçı onun dəyişikliyinin başqa modula təsir edəcəyini güman etmir.

Yan təsir reqresiyası — yan təsirin dəyişdirilməsi (loglama, keşləmə, bildiriş göndərmə) gözlənilən davranışı pozur. Nümunə: proqramçı işi sürətləndirmək üçün keşləmə əlavə etdi, lakin köhnəlmiş keş səbəbindən istifadəçilər köhnəlmiş məlumatları görür. Yan təsir reqresiyalarını avtomatik testlərlə yaxalamaq çətindir, çünki yan təsirlər çox vaxt testlərlə əhatə olunmur.

Performans reqresiyası — kod funksional olaraq düzgün işləməyə davam edir, lakin əvvəlkindən daha yavaşdır. Nümunə: yeni şifrələmə alqoritmi eyni nəticələri verir, lakin icra müddəti 2 ms-dən 200 ms-ə yüksəldi. Performans reqresiyaları adi vahid testləri ilə aşkarlanmır — benchmark və profilinq tələb olunur.

Reqresiya növüNümunəAşkarlama üsulu
YerliPozulmuş sıralamaVahid testləri
UzaqVB sxeminin dəyişməsiİnteqrasiya testləri
Yan təsirKöhnəlmiş keşE2E testləri
PerformansCavabın yavaşlamasıBenchmarklar

Reqresiyalar niyə yaranır

Birinci səbəb — kodun bağlılığı (coupling). Modullar bir-birindən nə qədər çox asılıdırsa, birindəki dəyişikliyin digərində reqresiyaya səbəb olma ehtimalı bir o qədər yüksəkdir. Klassik anti-nümunələr: God Object (hər şeyi edən obyekt), Shotgun Surgery (birinin dəyişməsi onlarca yerdə düzəliş tələb edir), Circular Dependency. Coupling-in azaldılması — memarlığın vəzifəsidir: SOLID prinsipləri, Dependency Injection, heksagonal memarlıq.

İkinci səbəb — dəyişdirilən funksionallıq üçün testlərin olmaması. Kod testlərlə əhatə olunmayıbsa, proqramçı reqresiya haqqında yalnız QA və ya istifadəçilərdən öyrənir. Google Testing Blog məlumatlarına görə, test əhatəsi >75% olan layihələrdə reqresiyalar əhatəsi <25% olan layihələrlə müqayisədə 5 dəfə azdır. TDD (Test-Driven Development) testlərin koddan əvvəl yazılmasını təmin edir, “zaman olanda” yox.

Üçüncü səbəb — insan faktoru. Proqramçı qonşu funksionallığın mövcudluğundan xəbərsizdir, bütün asılılıqları başa düşmür və ya sadəcə tələsir. Səbəb — qeyri-kafi kod bazası bilik paylaşımı. Həll yolları: digər modulların proqramçılarının iştirakı ilə code review, pair programming, memarlıq sənədləri. Layihənin Bus faktoru sənədləşdirilmiş memarlıq qərarlarının sayı ilə tərs mütənasibdir.

Reqresiya testi və onun rolu

Reqresiya testi — köhnə funksionallığın pozulub-pozulmadığını yoxlamaq üçün hər dəyişiklikdən sonra mövcud testlərin təkrar icrası prosesidir. Bu, yeni dəyişikliyin mövcud kodun işini pozmadığına zəmanət verməyin yeganə yoludur. Reqresiya testi olmadan hər buraxılış lotereyadır: proqramçı heç nəyi pozmadığına ümid edir, lakin bunu təsdiqləyə bilməz.

Əl ilə reqresiya testi — ən bahalı və səmərəsiz yanaşmadır. Layihə böyüdükcə reqresiya test ssenarilərinin sayı xətti, onların əl ilə icra müddəti isə eksponensial olaraq artır. 2–3 illik inkişafdan sonra reqresiyanın əl ilə icrası 2–3 həftə çəkə bilər ki, bu da tez-tez buraxılışları qeyri-mümkün edir. Yeganə çıxış yolu avtomatlaşdırmadır.

Avtomatlaşdırılmış reqresiya testi test piramidasına görə səviyyələrə bölünür:

  • Vahid testləri — sürətli, təcrid olunmuş, ayrı-ayrı funksiya və metodları əhatə edir
  • İnteqrasiya testləri — modullar, VB, xarici xidmətlər arasında qarşılıqlı əlaqəni yoxlayır
  • E2E testləri — UI və ya API vasitəsilə tam istifadəçi ssenarilərini yoxlayır
  • Snapshot testləri — komponentin cari çıxışını etalonla müqayisə edir

Google Testing Blog məlumatlarına görə, optimal nisbət: 70% vahid testləri, 20% inteqrasiya, 10% E2E. Bu nisbətdən kənarlaşma reqresiya testinin effektivliyini azaldır: E2E testlərinin çoxluğu pipeline-i yavaşladır, vahid testlərinin çatışmazlığı mikro-səhvləri nəzərdən qaçırır.

Reqresiya testinin avtomatlaşdırma strategiyaları

Birinci strategiya — Full Regression. Layihənin bütün testləri işə salınır. Ən etibarlı, lakin ən yavaş yanaşma. Kiçik layihələr üçün uyğundur (10 000 testə qədər, icra müddəti <30 dəqiqə). Böyük layihələr üçün tam reqresiya saatlarla çəkə bilər ki, bu da CI/CD pipeline-ini qeyri-praktik edir.

İkinci strategiya — Selective Regression. Yalnız dəyişdirilmiş kodla əlaqəli testlər işə salınır. Əlaqələri müəyyən etmək üçün kodun asılılıq qrafından istifadə olunur. Alətlər: Bazel (Google), Nx (JavaScript), sbt (Scala). Selective regression icra müddətinin 60–80%-nə qənaət edir, lakin dəqiq asılılıq qrafının qurulmasını tələb edir — səhvlər buraxılmış reqresiyalara səbəb olur.

Üçüncü strategiya — Prioritized Regression. Bütün testlər prioritetə görə sıralanır: critical path (ən vacib istifadəçi ssenariləri), high risk (səhv tarixçəsi olan kod), changed code (dəyişiklikdən təsirlənən kod). Əvvəlcə ən prioritet testlər işə salınır — keçərsə, proqramçı sürətli rəy alır. Vaxt məhdudiyyətli icra: 10 dəqiqə ərzində kritik testlər yoxlanılır, qalanları — fonda.

Layihədə reqresiyaların qarşısını necə almaq olar

Birinci və ən vacib addım — test yazmaq mədəniyyəti. Hər dəyişiklik dəyişikliyin işlədiyini yoxlayan test və heç nəyin pozulmadığını yoxlayan test ilə müşayiət olunmalıdır. TDD (Test-Driven Development) ən yaxşı nəticələri verir: proqramçı əvvəlcə uğursuz test, sonra onu keçən kod yazır. Bu, testin koddan əvvəl mövcud olmasını təmin edir.

İkinci addım — testlərin məcburi icrası ilə CI/CD pipeline-i. Bütün testlər keçməyənə qədər Pull request birləşdirilə bilməz. Təciliyə görə testləri “atlamaq” olmaz — təcili dəyişikliklər sürətləndirilmiş, lakin məcburi test dəstindən keçir. Google DevOps Research məlumatlarına görə, məcburi CI/CD olan komandaların istehsalatda reqresiyaları 3 dəfə azdır.

Üçüncü addım — istehsalatda monitorinq. Hətta ən yaxşı testlər reqresiyalardan 100% qorunmağa zəmanət vermir. Observability alətləri (Sentry, Datadog, New Relic) hər yerləşdirmədən sonra əsas metrikaları izləməlidir: error rate, latency, throughput. Həddi aşdıqda avtomatik geri qaytarma (rollback) — reqresiya istehsalata düşərsə təhlükəsizlik yastığıdır.

Dördüncü addım — reqresiya düşüncəsi ilə code review. Rəyçi sual verməlidir: “Bu dəyişiklikdən hansı digər modullar poza bilər?”. Kodun düzgün olduğunu yoxlamaq kifayət deyil — onun qonşu funksionallığı pozmadığını yoxlamaq lazımdır. Code review üçün yoxlama siyahısı “qonşu modullarda reqresiyaların yoxlanılması” bəndini ehtiva etməlidir.

Tez-tez verilən suallar

Reqresiya adi səhvdən nə ilə fərqlənir?

Reqresiya — əvvəllər olmayan səhvdir. Adi səhv funksiyanın yaradılması anından mövcud ola bilər. Reqresiya həmişə konkret dəyişikliklə bağlıdır — bu, səbəbi tapmaq üçün git bisect istifadə etməyə imkan verir.

Reqresiyanın səbəbini necə tez tapmaq olar?

Git bisect istifadə edin: hər şeyin işlədiyi commit-i və pozulduğu commit-i göstərin. Git tarixçədə ikili axtarış aparacaq və reqresiyaya səbəb olan commit-i tapacaq. Bu, minlərlə commiti olan böyük layihələrdə belə işləyir.

Reqresiyalardan qorunmaq üçün nə qədər test lazımdır?

Dəqiq rəqəm yoxdur, lakin empirik qayda var: əsas istifadəçi axınlarının əhatəsi 100%, bütün funksiyaların əhatəsi isə ən azı 70% olmalıdır. Kəmiyyətdən çox keyfiyyət vacibdir: edge case-i yoxlayan test happy path-də on testdən daha dəyərlidir.

Reqresiya kodla deyil, infrastrukturla bağlı ola bilərmi?

Bəli və bu infrastructure regression adlanır. Əməliyyat sisteminin, verilənlər bazası versiyasının, SSL sertifikatının və ya veb-server konfiqurasiyasının yenilənməsi işləyən kodu poza bilər. IaC (Infrastructure as Code) və infrastruktur testi (Test Kitchen, Terratest) bu cür reqresiyaları yaxalamağa kömək edir.

Əgər komanda heç vaxt reqresiya testi yazmayıbsa, onları necə inandırmaq olar?

Bir kritik istifadəçi axınından başlayın. Ən vacib ssenari üçün avtomatik test yazın (giriş, sifariş vermə). Demoda testin reqresiyanı necə yaxaladığını göstərin. Komanda faydanı gördükdə — testi tədricən tətbiq edin, əhatəni genişləndirin.

Nəticə

  • Reqresiya — əvvəllər işləyən kodun dəyişdirilməsindən sonra yaranan səhv
  • Dörd reqresiya növü: yerli, uzaq, yan təsir və performans
  • Əsas səbəb — kodun bağlılığı, testlərin olmaması və insan faktoru
  • Reqresiya testi — sabitliyin qorunması üçün məcburi proses
  • Reqresiya testlərinin avtomatlaşdırılması test piramidası vasitəsilə (70/20/10)
  • Testlərin məcburi icrası ilə CI/CD reqresiyaları girişdə bloklayır
  • Git bisect — reqresiyaya səbəb olan commit-i tapmaq üçün standart vasitə

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun