GH GambleHub

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.

💡 Qoida: "jarayonni/soket/DBni o’tkazganimizdan so’ng, biz allaqachon integratsiyalashgan suvlardamiz.

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

VazifaTuriNega
Sof biznes-mantiq (validatsiyalar, komissiyalarning hisob-kitoblari, kalitlarning idempotentligi)UnitTez, aniqlangan, ko’plab chegara qiymatlari
Mappinglar DTO modeli, serializatsiya, parsingUnitKo’p holatlar, izolyatsiya qilish oson
Repozitoriya/ORM soʻrovlariIntegration (с test DB)ORM va SQL «xulq-atvori» nuanslari faqat jonli DBda ko’rinadi
HTTP-kontrakt (maqomlar, sarlavhalar, sxemalar)Integration / ContractHTTP + JSON Schema/OpenAPI
Saga/Outbox, retraylar, muddatlarIntegration / ComponentTayminglar, tranzaksionlik, broker
Rate limit в gatewayIntegrationRedis/state/taymautlar
To’lov vebxuklari (HMAC, takrorlash)Integration / CDCImzolar, soatlar, tarmoq xususiyatlari

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.

Flaky-antidot:
  • 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.

Matritsaga misol (GitHub Actions, parcha):
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.

Contact

Biz bilan bog‘laning

Har qanday savol yoki yordam bo‘yicha bizga murojaat qiling.Doimo yordam berishga tayyormiz.

Integratsiyani boshlash

Email — majburiy. Telegram yoki WhatsApp — ixtiyoriy.

Ismingiz ixtiyoriy
Email ixtiyoriy
Mavzu ixtiyoriy
Xabar ixtiyoriy
Telegram ixtiyoriy
@
Agar Telegram qoldirilgan bo‘lsa — javob Email bilan birga o‘sha yerga ham yuboriladi.
WhatsApp ixtiyoriy
Format: mamlakat kodi va raqam (masalan, +998XXXXXXXX).

Yuborish orqali ma'lumotlaringiz qayta ishlanishiga rozilik bildirasiz.