Unit vs İnteqrasiya testləri
1) Niyə test növlərini fərqləndirmək lazımdır
Testlərin düzgün qranulyasiyası inkişafın proqnozlaşdırıla biləcəyini göstərir: Vahid məntiq qüsurlarını tez və ucuz tutur; Integration modulları, real nəqliyyat və «yapışqan» bağlarını yoxlayır. Birlikdə reqressiyanı azaldır və buraxılışları sürətləndirir.
2) Təriflər və sərhədlər
Unit test
Təcriddə kiçik davranış vahidini (funksiya, sinif, use-case) yoxlayır.
Xarici asılılıqlar dəyişdirilir (mock/stub/fake).
Sürətli (ms-onlarca ms), determinik.
İnteqrasiya testi
Bir neçə real komponentin qarşılıqlı təsirini yoxlayır: DB, broker (Kafka/RabbitMQ), HTTP/gRPC, fayl sistemi, cache.
Minimum mokov, real protokollar.
Daha yavaş (yüzlərlə ms-saniyə), dəstək baxımından daha bahalı.
3) Test piramidası (buz buynuzu deyil)
Əsas: Unit (miqdarı 70-80%) - ucuz, tez.
Orta təbəqə: Integration/Component (15-25%) - kritik yollar və müqavilələr.
Üst: E2E/UX/Exploratory (5-10%) - minimum kifayətdir.
Yan tərəflərdə: Static Analysis/Lint/Type check və keyfiyyət gücləndiriciləri kimi Mutation testing.
4) Unit nə vermək və nə - Integration
5) Məlumatlar və fiksturlar
Unit
Inline fiksturlar/bilderlər (fabriki methods).
Sərhəd dəyərləri üçün cədvəl testləri (table-driven).
İnvariantlar üçün property-based yanaşma (məsələn, «debet məbləği = kredit məbləği»).
Integration
Hermetic mühit: Testcontainers/Docker Compose qaldırmaq 'postgres + redis + kafka + wiremock'.
BD/cache-də ilkin seed və sonra təmizləmə (əməliyyat/rollback, truncate).
Saat/zamanlayıcılar - saxta (nəzarət olunan), əks halda flaklar.
6) Alətlər və nümunələr
Mocks/Stubs/Fakes/Spies:- Stub - sabit cavab (ucuz).
- Mock - qarşılıqlı əlaqələrin/zənglərin sayının yoxlanılması.
- Fake - sadələşdirilmiş tətbiq (məsələn, In-Memory Repo).
- Contract testing (CDC): Pact/Swagger-based - müştərinin gözləntilərini qeyd edirik və provayderi yoxlayırıq.
- WireMock/MockServer - üçüncü tərəf xidmətləri üçün HTTP qapaqları.
- Testcontainers - yerli və «zoopark» olmadan CI canlı DB/broker.
7) Nümunələr
7. 1 Unit: ödəmə idempotluğu (pseudocode)
python def test_idempotent_create_payment_returns_same_id():
repo = InMemoryPayments()
service = Payments(repo)
first = service. create(amount=100, key="abc")
second = service. create(amount=100, key="abc")
assert first. id == second. id assert repo. count() == 1
7. 2 Integration: vebhuk imzası (HMAC) + təkrar
bash docker-compose: app + redis + wiremock (PSP)
docker compose -f docker-compose. test. yml up -d pytest -m "integration and webhook" -q
Test:
- WireMock 'X-Timestamp' və imza ilə bir hadisə verir.
- Tətbiq HMAC-ı yoxlayır, 'event _ id' deduplikasiya edir, 5 saniyədən sonra təkrarlama dubl yaratmır.
- Biz '200' və qeyd bir olduğunu yoxlayın.
7. 3 CDC: müştərinin provayderə müqaviləsi
Müştəri Pact yaradır (gözləmə: 'POST/v1/payout' → '201' sxemlə).
CI-də provayder öz stendində müqavilənin təsdiqini qaçırır.
8) Sürət, Paralellik, Flakes
Unit <100 ms bir test işləməlidir; paketi - saniyələr.
Integration - konteynerlərdə/limanlarda paralel; başlanğıcda miqrasiyadan istifadə edin.
- nəzarət olunan vaxt (fake clock),
- «açıq hadisə» deyil, «sleep» gözləntiləri,
- sabit astanalar (determinized test jitter ilə retras).
9) Keyfiyyət metrikası
Coverage (sətirlər/qollar): trend müşahidə üçün faydalıdır, lakin hədəf deyil.
Mutation testing (PIT/Mutmut): saxta dəyişikliklər test «öldürür» göstərir - assurens real gücü.
Test duration və flaky rate: böyümə zamanı alert.
Defect containment: istehsaldan əvvəl ələ keçirilən baqların payı.
10) CI/CD daxil
Cobs: unit → integration → e2e (xidmətlər üzrə fan-out).
Asılılıq cache, DB/dillər/versiyalar üzrə paralel matrislər.
Hesabatlar: JUnit/Allure + konteyner log artefaktları (düşdükdə).
Gate: «yaşıl unit + kritik integration» - merj şərti; e2e - nightly.
yaml strategy:
matrix:
db: [postgres14, postgres16]
steps:
- run: docker run -d --name db -e POSTGRES_PASSWORD=pw postgres:${{ matrix. db }}
- run: pytest -m "unit" -q
- run: pytest -m "integration" -q
11) Mikroservislər və hadisələr
Xidmət müqavilələri: OpenAPI/Protobuf versiyası; uyğunluq testləri (backward).
Event-driven:- Unit: Domain hadisələri və invariantları mapping.
- Integration: real broker nəşr/abunə (Kafka), outbox/inbox semantika, exactly-once imitasiya (ən azı - idempotent).
- Retraj/dublikat/yenidən nizamlama testləri (out-of-order).
12) Integration məlumat və izolyasiya
Hər test → unikal sxem/DD (Testcontainers JDBC URL '? TC _ TMPFS =/var/lib/postgresql/data: rw').
Əməliyyat fiksturları (begin → run → rollback) təmizləməni sürətləndirir.
Redis/cache üçün - əsas prefiks 'test: $ {RUN _ ID}:' və 'FLUSHDB' teardown.
13) iGaming/Maliyyə Xüsusiyyətləri
Pul və limitlər: invariantlar üçün property-based testlər (balans ≥ 0, ümumi məhdudiyyətlər).
Tənzimləyici: jurnalın yoxlanılması (audit-log yazılır), dəyişməz hadisələr.
Ödənişlər/PSP: HMAC/mTLS inteqrasiya testləri, 'Retry-After', idempotentlik, dedup 'jti'.
Məsuliyyətli oyun: eşik/kuldaun qaydaları testləri; fake clock-da «dünən → bu gün».
14) Antipattern
DB/NTTR qaldıran «Unit» artıq inteqrationdur (qatları qarışdırır və CI-ni yavaşlatır).
Boş iddialarla yüksək coverage («örtülmüş, lakin yoxlanılmamışdır»).
Müqavilənin lazım olduğu yerlərdə üçüncü tərəf xidmətlərinin məntiqi (yeniləmə zamanı pozulur).
'sleep (5)' ilə testlər hadisə/şərtləri gözləmək əvəzinə.
Paralel testlər üçün ümumi test DD → yarış və fleyka.
15) Prod hazırlıq yoxlama siyahısı
- Piramida müəyyən edilmişdir: Unit/Integration/E2E paylarının% -i və qaçış vaxtı ilə hədəf.
- Unit təcrid, sürətli, sərhəd dəyərləri və invariantları əhatə edir.
- Integration ümumi states olmadan hermetic-mühit (Testcontainers/Compose) istifadə edir.
- Müqavilə testləri (OpenAPI/Pact) CI-də təsdiqlənir.
- Test məlumatları - idarə olunur: seed/rollback/prefiks, fake clock.
- Paralel qaçış, JUnit/Allure hesabatları, konteyner log artefaktları.
- Metriklər: duration, flaky rate, mutation score; deqradasiya üçün alertlər.
- Ödəniş/vebhuk ssenariləri: HMAC/mTLS, retray, idempotentlik, dedup.
- Strategiya sənədləşdirilməsi və test şablonları nümunələri.
16) TL; DR
Unit - maksimum məntiq, minimum mühit; İnteqrasiya - minimum mok, maksimum realizm. Piramidanı saxlayın: Sürətli Unit 80% qüsurları tutur, Integration bağları və müqavilələri təsdiqləyir. hermetic konteynerləri, müqavilə testləri, fake clock və paralellik istifadə edin. Yalnız coverage deyil, həm də mutation score və flaky rate ölçün. Xüsusilə ödəmə/vebhuk yollarını yoxlayın: imzalar, retrajlar və idempotentlik.