GH GambleHub

Unități vs Teste de integrare

1) De ce distinge între tipurile de testare

Granularea corectă a testelor face dezvoltarea previzibilă: defectele logice de captură a unităților rapid și ieftin; Integrarea verifică pachete de module, transport real și "lipici. "Împreună, acestea reduc regresia și accelerează eliberările.

2) Definiții și limite

Încercare de unitate

Testează o unitate mică de comportament (funcție, clasă, utilizare-caz) în izolare.
Dependențele externe sunt înlocuite (mock/stub/fake).
Rapid (ms-zeci de ms), determinist.

Test de integrare

Verifică interacțiunea mai multor componente reale: bază de date, broker (Kafka/RabbitMQ), HTTP/gRPC, sistem de fișiere, cache.
Mocs minime, protocoale reale.
Mai lent (sute de ms-secunde), mai scump în sprijin.

💡 Regulă: de îndată ce „trecem prin proces/priză/DB” - suntem deja în apele de integrare.

3) Testarea piramidei (nu cornul de gheață)

Fundație: Unitate (70-80% la număr) - ieftin, rapid.
Strat de mijloc: Integrare/Componentă (15-25%) - căi critice și contracte.
Top: E2E/UX/Exploratory (5-10%) - minim suficient.
Pe părțile laterale: Static Analysis/Lint/Type check and Mutation testing as quality amplificators.

4) Ce să dați unității și ce să integrați

SarcinăTipDin ce motiv
Logică de afaceri pură (validări, calcule de comision, idempotence cheie)UnitateValori rapide, deterministe, multe limite
Mapări DTO↔model, serializare, parsareUnitateMulte cazuri, ușor de izolat
Depozite/interogări ORMIntegrare (с test DB)„Comportament” Nuanțele ORM și SQL sunt vizibile numai pe o bază de date live
Contract HTTP (statusuri, antete, scheme)Integrare/ContractAveți nevoie de o stivă HTTP + JSON Schema/OpenAPI
Saga/Outbox, Retras, Termene limităIntegrare/ComponentăTemporizări, tranzacționalitate, broker
Limita ratei в gatewayIntegrareRedis/stare/timeout
Carti web de plata (HMAC, repetare)Integrare/CDCSemnături, ore, caracteristici de rețea

5) Date și remedieri

Unitate

Ficțiuni/constructori inline (metode din fabrică).
Teste bazate pe tabel pentru valori limită.
Abordare bazată pe proprietăți pentru invarianți (de ex. „suma debitelor = suma creditelor”).

Integrare

Mediu ermetic: Testcontainere/Docker Compune ridica 'postgres + redis + kafka + wiremock'.
Semințe inițiale în baza de date/cache și curățare după (tranzacție/rollback, trunchiat).
Ceasuri/cronometre sunt false (controlate), în caz contrar flacks.

6) Instrumente și modele

Mocks/Stubs/Falsuri/Spioni:
  • Stub este un răspuns fix (ieftin).
  • Mock - verificați interacțiunile/numărul de apeluri.
  • Fake este o implementare simplificată (de exemplu, In-Memory Repo).
  • Testarea contractelor (CDC): Pact/Swagger - fixați așteptările clienților și verificați furnizorul.
  • WireMock/MockServer - HTTP pentru servicii terțe părți.
  • Testcontainerele sunt live DBs/brokeri la nivel local și în CI fără o „grădină zoologică”.

7) Exemple

7. 1 Unitate: Idempotence de plată (pseudocod)

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 Integrare: Semnătură broşură web (HMAC) + Repetare

bash docker-compose: app + redis + wiremock (PSP)
docker compose -f docker-compose. test. yml up -d pytest -m "integration and webhook" -q
Încercare:
  • WireMock oferă un eveniment cu un 'X-Timestamp' și o semnătură.
  • Aplicația verifică HMAC, deduplicates by 'event _ id', repetă după 5 secunde nu creează o dublă.
  • Verificăm „200” și că există o singură intrare.

7. 3 CDC: Contractul clientului cu furnizorul

Clientul generează un Pact (în așteptare: „POST/v1/payout” → „201” cu o diagramă).
Furnizorul din CI efectuează verificarea contractului la standul său.

8) Viteză, paralelism, fulgi

Unitățile trebuie să ruleze <100 ms per test; pachet - secunde.
Integrare - paralel cu containere/porturi; utilizați migrațiile de pornire.

Antidot cu fulgi:
  • timp controlat (ceas fals),
  • așteptări "prin eveniment explicit", nu "somn',
  • praguri stabile (retrai cu testul jitter deterministic).

9) Măsurători ale calității

Acoperire (linii/ramuri): utilă pentru observarea tendinței, dar nu și a țintei.
Testarea mutațiilor (PIT/Mutmut): Arată dacă testele „ucid” schimbări false - puterea reală a asasinilor.
Durata testului și rata de fulguială: alerte la creștere.
Izolarea defectelor: proporția de bug-uri interceptate înainte de producție.

10) Încorporarea în CI/CD

Locuri de muncă: unitate → integrare → e2e (fan-out prin serviciu).
Cache de dependență, matrice paralele prin bază de date/limbă/versiune.
Rapoarte: JUnit/Allure + artefacte jurnal container (pentru picături).
Poarta: „unitate verde + integrare critică” - stare de îmbinare; e2e - pe timp de noapte.

Exemplu de matrice (Acțiuni GitHub, fragment):
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) Microservicii și evenimente

Contracte de servicii: OpenAPI/Protobuf sunt versionate; teste de compatibilitate (înapoi).

Bazat pe evenimente:
  • Unitate: maparea evenimentelor de domeniu și invarianți.
  • Integrare: publicare/abonare într-un broker real (Kafka), semantică outbox/inbox, imitație exact o dată (cel puțin - idempotent).
  • Teste în afara ordinii.

12) Date și izolare în integrare

Fiecare test → o schemă unică/bază de date (Testcontainers JDBC URL'? TC _ TMPFS =/var/rob/postgresql/data: rw ').
Remedierile tranzacționale (begin→run→rollback) accelerează curățarea.
Pentru Redis/cache, prefixul cheie este 'test: $ {RUN _ ID}:' și 'FLUSHDB' în rupere.

13) Specificul iGaming/Finanțe

Bani și limite: teste bazate pe proprietate pentru invarianți (sold ≥ 0, restricții totale).
Reglementare: verificare logare (jurnalul de audit este scris), evenimente neschimbabile.
Plăți/PSP: teste de integrare HMAC/mTLS, 'Retry-After', idempotency, dedup 'jti'.
Joc responsabil: pragul/testele regulilor de reactivare; „vchera→segodnya” pe ceas fals.

14) Antipattern

„Unitățile” care ridică DB/HTTP sunt deja integrate (confundă straturile și încetinesc CI).
Acoperire ridicată din cauza declarațiilor goale („acoperite, dar nu verificate”).
Logica Moki a serviciilor terță parte în cazul în care este necesar un contract (pauze atunci când este actualizat).
Teste cu „somn (5)” în loc de așteptări eveniment/condiție.
Baza de date de testare comună pentru teste paralele → rasă și fulg.

15) Lista de verificare Prod Readiness

  • Piramida definit ca% din Unit/Integration/E2E și acțiuni țintă de timp.
  • Unitățile sunt izolate, rapide, acoperă valorile limită și invarianții.
  • Integrarea folosește un mediu ermetic (Testcontainers/Compose), fără stări comune.
  • Testele contractuale (OpenAPI/Pact) sunt verificate în CI.
  • Date de testare - gestionate: semințe/rollback/prefixe, ceas fals.
  • Paralel run, rapoarte JUnit/Allure, artefacte jurnal container.
  • Metrica: durata, rata de fulguială, scorul mutației; alerte de degradare.
  • Scenarii de plată/webhook: HMAC/mTLS, retrai, idempotency, deadup.
  • Documentația strategiei și șabloanele de testare a eșantionului.

16) TL; DR

Unitate - logică maximă, mediu minim; Integrare - moks minime, realism maxim. Țineți piramida: Unitățile rapide prind 80% din defecte, Integrarea confirmă pachetele și contractele. Utilizați containere ermetice, teste de contract, ceas fals și paralelism. Măsura nu numai acoperire, dar, de asemenea, scorul mutației și rata de fulguială. Mai ales verificați căile de plată/webhook: semnături, retribuții și idempotență.

Contact

Contactați-ne

Scrieți-ne pentru orice întrebare sau solicitare de suport.Suntem mereu gata să ajutăm!

Pornește integrarea

Email-ul este obligatoriu. Telegram sau WhatsApp sunt opționale.

Numele dumneavoastră opțional
Email opțional
Subiect opțional
Mesaj opțional
Telegram opțional
@
Dacă indicați Telegram — vă vom răspunde și acolo, pe lângă Email.
WhatsApp opțional
Format: cod de țară și număr (de exemplu, +40XXXXXXXXX).

Apăsând butonul, sunteți de acord cu prelucrarea datelor dumneavoastră.