Unit vs Integration testlari
1) Nega test turlarini farqlash kerak
Testlarning to’g’ri granulyatsiyasi ishlab chiqishni oldindan aytib bo’lmaydigan qiladi: Unit mantiqdagi nuqsonlarni tez va arzon ushlab turadi; Integration modullar, haqiqiy transport va «yelim» ni tekshiradi. Ular birgalikda regressiyani kamaytiradi va relizlarni tezlashtiradi.
2) Belgilash va chegaralar
Unit-test
Izolyatsiyada xatti-harakatlarning kichik birligini (funksiya, sinf, use-case) tekshiradi.
Tashqi bogʻlanishlar almashtirildi (mock/stub/fake).
Tezkor (ms-o’nlab ms), determinizatsiya qilingan.
Integration-test
Bir nechta haqiqiy komponentlarning oʻzaro taʼsirini tekshiradi: DB, broker (Kafka/RabbitMQ), HTTP/gRPC, fayl tizimi, kesh.
Minimal mokov, haqiqiy protokollar.
Sekinroq (yuzlab ms-soniyalar), qo’llab-quvvatlash uchun qimmatroq.
3) Test piramidasi (muz shoxi emas)
Asosi: Unit (soni bo’yicha 70-80%) - arzon, tez.
O’rta qatlam: Integration/Component (15-25%) - muhim yo’llar va shartnomalar.
Yuqori: E2E/UX/Exploratory (5-10%) - minimal yetarli.
Yon tomonlarda: Static Analysis/Lint/Type check va Mutation testing sifat kuchaytirgichlari sifatida.
4) Unit va Integration
5) Ma’lumotlar va fikstura
Unit
Inline fixturalar/bilderlar (factory methods).
Chegara qiymatlari uchun jadval testlari (table-driven).
Property-based invariantlar uchun yondashuv (masalan, «debetlar summasi = kreditlar summasi»).
Integration
Hermetic muhit: Testcontainers/Docker Compose’postgres + redis + kafka + wiremock’ni ko’taradi.
DB/keshdagi boshlangʻich seed va undan keyin tozalash (tranzaksiya/rollback, truncate).
Soatlar/taymerlar - soxta (nazorat qilinadigan), aks holda flaklar.
6) Asboblar va patternlar
Mocks/Stubs/Fakes/Spies:- Stub - qat’iy javob (arzon).
- Mock - o’zaro ta’sir/qo’ng’iroqlar sonini tekshirish.
- Fake - soddalashtirilgan amalga oshirish (masalan, In-Memory Repo).
- Contract testing (CDC): Pact/Swagger-based - mijozning taxminlarini aniqlaymiz va provayderni tekshiramiz.
- WireMock/MockServer - uchinchi tomon xizmatlari uchun HTTP tugmalari.
- Testcontainers - jonli DB/brokerlar mahalliy va CI «hayvonot bog’i» siz.
7) Misollar
7. 1 Unit: toʻlov idempotentligi (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: vebxuk imzosi (HMAC) + takrorlash
bash docker-compose: app + redis + wiremock (PSP)
docker compose -f docker-compose. test. yml up -d pytest -m "integration and webhook" -q
Test:
- WireMock voqeani’X-Timestamp’bilan va imzo bilan beradi.
- Ilova HMACni tekshiradi,’event _ id’deduplitsii, 5 soniyadan keyin takrorlash dubl yaratmaydi.
- ’200’ va bitta yozuvni tekshiramiz.
7. 3 CDC: mijozning provayderga shartnomasi
Mijoz Pact shakllantiradi (’POST/v1/payout’→’201’sxemasi bilan kutiladi).
Provayder CI’da o’z stendida kontraktni tekshirishni amalga oshiradi.
8) Tezlik, parallellik, fleykalar
Unit test uchun <100 ms ishlashi kerak; paket - soniya.
Integration - konteynyerlar/portlar bo’yicha parallel; ishga tushirishda migratsiyadan foydalanish.
- nazorat qilinadigan vaqt (fake clock),
- ’sleep’ emas, balki «aniq voqea bo’yicha» kutish,
- barqaror chegaralar (jitter bilan retrajlar determinatsiya qilingan holda sinovdan o’tkaziladi).
9) Sifat metrikasi
Coverage (satrlar/tarmoqlar): trendni kuzatish uchun foydalidir, lekin maqsad emas.
Mutation testing (PIT/Mutmut): testlar soxta o’zgarishlarni o’ldiradimi yoki yo’qligini ko’rsatadi - asurensning haqiqiy kuchi.
Test duration va flaky rate: o’sishda alertlar.
Defect containment: ishlab chiqarishdan oldin ushlangan xatolar ulushi.
10) CI/CDga joylashtirish
Joblar: unit → integration → e2e (xizmatlar bo’yicha fan-out).
Bogʻliqlik keshi, DB/tillar/versiyalar boʻyicha parallel matritsalar.
Hisobotlar: JUnit/Allure + konteyner log artefaktlari (yiqilganda).
Gate: «yashil unit + kritik integration» - merj sharti; 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) Mikroservislar va voqealar
Servis kontraktlari: OpenAPI/Protobuf versiyalari; muvofiqlik testlari (backward).
Event-driven:- Unit: domen hodisalari va invariantlarning mappingi.
- Integration: haqiqiy brokerda chop etish/obuna (Kafka), outbox/inbox semantika, exactly-once imitatsiya (hech bo’lmaganda idempotent).
- Retray/dublikat/qayta tartibga solish testlari (out-of-order).
12) Integration’da ma’lumotlar va izolyatsiya
Har bir test → noyob sxema/DD (Testcontainers JDBC URL’? TC _ TMPFS =/var/lib/postgresql/data: rw’).
Tranzaksion fixturalar (begin → run → rollback) tozalashni tezlashtiradi.
Redis/kesh uchun - asosiy prefiks’test: $ {RUN _ ID}:’i’FLUSHDB’teardown.
13) iGaming/Moliya xususiyatlari
Pul va limitlar: invariantlar uchun property-based testlar (balans ≥ 0, umumiy cheklovlar).
Tartibga solish: jurnalni tekshirish (audit-log yoziladi), o’zgarmas voqealar.
To’lovlar/PSP: HMAC/mTLS,’Retry-After’, idempotentlik, dedup’jti’integratsiya testlari.
Mas’uliyatli o’yin: chegara/kuldaun qoidalari testlari; «kecha → bugun» fake clock.
14) Antipatternlar
BD/MTTRni ko’taradigan «unit» - bu integration (qatlamlarni chalkashtirib, CIni sekinlashtiradi).
Boʻsh daʼvolar tufayli yuqori coverage («qoplangan, lekin tekshirilmagan»).
Kontrakt kerak bo’lgan joyda uchinchi tomon xizmatlarining mantig’i buziladi (yangilanishda buziladi).
Test’sleep (5)’o’rniga hodisa/shartlarni kutish.
Parallel testlar uchun umumiy test DB → poyga va fleyka.
15) Prod-tayyorlik chek-varaqasi
- Piramida aniqlangan: Unit/Integration/E2E ulushlari va maqsadlar soni.
- Unit izolyatsiyalangan, tezkor, chegara qiymatlari va invariantlarni qoplaydi.
- Integration umumiy statelarsiz hermetic-muhitdan (Testcontainers/Compose) foydalanadi.
- Kontrakt testlari (OpenAPI/Pact) CI bilan tasdiqlanadi.
- Test ma’lumotlari - boshqariladigan: seed/rollback/prefikslar, fake clock.
- Parallel yugurish, JUnit/Allure hisobotlari, konteyner log artefaktlari.
- Metriklar: duration, flaky rate, mutation score; tanazzulga uchraydigan alertlar.
- To’lov/vebxuk stsenariylari: HMAC/mTLS, retryalar, idempotentlik, dedup.
- Strategiya hujjatlari va test namunalari misollari.
16) TL; DR
Unit - maksimal mantiq, minimal atrof-muhit; Integration - minimal mok, maksimal realizm. Piramidani saqlang: tezkor Unit nuqsonlarning 80 foizini ushlaydi, Integration aloqalar va shartnomalarni tasdiqlaydi. Hermetic konteynerlari, kontrakt testlari, fake clock va parallellikdan foydalaning. Nafaqat coverage, balki mutation score va flaky rate. Ayniqsa, to’lov/vebxuk yo’llari: imzolar, retrajlar va idempotentlikni tekshiring.