GH GambleHub

Jednostki vs Testy integracyjne

1) Dlaczego należy rozróżnić rodzaje badań

Prawidłowa granulacja testów sprawia, że rozwój jest przewidywalny: Jednostka złapać wady logiczne szybko i tanio; Integracja sprawdza pakiety modułów, prawdziwy transport i "klej. "Razem zmniejszają regresję i przyspieszają uwalnianie.

2) Definicje i granice

Badanie jednostkowe

Testuje małą jednostkę zachowania (funkcja, klasa, przypadek użycia) w izolacji.
Zewnętrzne zależności są zastępowane (mock/stub/fake).
Szybko (ms-dziesiątki ms), deterministyczne.

Test integracyjny

Sprawdza interakcje kilku rzeczywistych komponentów: bazy danych, brokera (Kafka/RabbitMQ), HTTP/gRPC, systemu plików, pamięci podręcznej.
Minimalne kpiny, prawdziwe protokoły.
Wolniejsze (setki ms-sekund), droższe wsparcie.

💡 Zasada: jak tylko „przejdziemy przez proces/gniazdo/DB” - jesteśmy już w wodach integracyjnych.

3) Piramida testowa (nie róg lodowy)

Fundacja: Jednostka (70-80% w liczbie) - tanie, szybkie.
Warstwa środkowa: Integracja/komponent (15-25%) - ścieżki krytyczne i umowy.
Góra: E2E/UX/Exploratory (5-10%) - minimalnie wystarczająco.
Po bokach: Analiza statyczna/Lint/Typ sprawdź i test mutacji jako wzmacniacze jakości.

4) Co dać jednostce i co do integracji

ZadanieTypZ jakiego powodu
Czysta logika biznesowa (walidacje, obliczenia prowizji, idempotencja klucza)JednostkaSzybkie, deterministyczne, wiele wartości granicznych
Mapowania Model DTO, serializacja, parsowanieJednostkaWiele przypadków, łatwe do odizolowania
Repozytoria/zapytania ORMIntegracja (DB testu)Niuanse „Behavior” ORM i SQL są widoczne tylko w bazie danych na żywo
Umowa HTTP (statusy, nagłówki, schematy)Integracja/UmowaPotrzebujesz stos na żywo HTTP + JSON Schema/OpenAPI
Saga/Outbox, Retras, TerminyIntegracja/komponentTerminy, transakcje, broker
Brama graniczna stawkiIntegracjaRedis/state/timeouts
Haki do płatności (HMAC, powtórz)Integracja/CDCPodpisy, godziny, funkcje sieciowe

5) Dane i poprawki

Jednostka

Inline fikcji/budowniczych (metody fabryczne).
Badania stołowe pod kątem wartości granicznych.
Podejście oparte na własności dla niezmienników (np. „suma obciążeń = suma kredytów”).

Integracja

Środowisko hermetyczne: Testcontainers/Docker Compose raise 'postgres + redis + kafka + wiremock'.
Początkowe nasiona w bazie danych/pamięci podręcznej i oczyszczania po (transakcja/rollback, okrawanie).
Zegarki/zegarki są fałszywe (kontrolowane), w przeciwnym razie flaki.

6) Narzędzia i wzory

Kpiny/Stuby/Fałszywe/Szpiedzy:
  • Stub jest stałą odpowiedzią (tanio).
  • Mock - sprawdź interakcje/liczbę połączeń.
  • Fałszywe jest uproszczona implementacja (na przykład In-Memory Repo).
  • Testowanie kontraktów (CDC): Pakt/Swagger-based - naprawić oczekiwania klientów i sprawdzić dostawcę.
  • WireMock/MockServer - stubs HTTP dla usług firm trzecich.
  • Testcontainers są żywe DB/brokerów lokalnie i w CI bez „zoo”.

7) Przykłady

7. 1 Jednostka: Idempotencja płatności (pseudokoda)

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 Integracja: Podpis Webhook (HMAC) + Powtórzyć

bash docker-compose: app + redis + wiremock (PSP)
docker compose -f docker-compose. test. yml up -d pytest -m "integration and webhook" -q
Badanie:
  • WireMock podaje wydarzenie z 'X-Timestamp' i podpisem.
  • Aplikacja sprawdza HMAC, deduplicates by 'event _ id', powtórzyć po 5 sekundach nie tworzy podwójnego.
  • Sprawdzamy '200' i jest tylko jeden wpis.

7. 3 CDC: Umowa klienta z dostawcą

Klient generuje pakt (czeka: 'POST/v1/payout' → '201' z diagramem).
Dostawca w CI prowadzi weryfikację kontraktu na swoim stoisku.

8) Prędkość, równoległość, płatki

Jednostki muszą przebiegać <100 ms na badanie; pakiet - sekundy.
Integracja - równoległe kontenery/porty; wykorzystują migracje startowe.

Antidotum płatkowe:
  • czas kontrolowany (fałszywy zegar),
  • oczekiwania „przez wyraźne wydarzenie”, a nie „sen”,
  • stabilne progi (retrai z testem jitter deterministycznie).

9) Wskaźniki jakości

Zasięg (linie/gałęzie): przydatny do obserwacji trendu, ale nie do celu.
Test mutacji (PIT/Mutmut): Pokazuje, czy testy „zabić” fałszywe zmiany - rzeczywista moc zabójców.
Czas trwania badania i szybkość błędów: wpisy dotyczące wzrostu.
Przechowywanie wad: odsetek błędów przechwyconych przed produkcją.

10) Wbudowanie w CI/CD

Zadania: jednostka → integracja → e2e (fan-out by service).
Pamięć podręczna zależności, równoległe matryce według bazy danych/języka/wersji.
Raporty: JUnit/Allure + kontener log artefakty (dla kropli).
Brama: „zielona jednostka + integracja krytyczna” - warunek połączenia; e2e - w nocy.

Przykład macierzy (Akcje 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) Mikroservice i wydarzenia

Kontrakty na usługi: OpenAPI/Protobuf są wersjonowane; testy kompatybilności (do tyłu).

Napędzane zdarzeniami:
  • Jednostka: mapowanie zdarzeń domenowych i niezmienne.
  • Integracja: publikacja/subskrypcja w prawdziwym brokerze (Kafka), semantyka skrzynki odbiorczej/skrzynki odbiorczej, dokładnie raz imitacja (przynajmniej - idempotent).
  • Testy pozasądowe.

12) Dane i izolacja w integracji

Każdy test → unikalny schemat/baza danych (Testcontainers JDBC URL'? TC _ TMPFS =/var/lib/postgresql/data: rw ').
Poprawki transakcyjne (rozpocząć → uruchom → rollback) przyspieszyć czyszczenie.
Dla Redis/cache prefiks klucza jest 'test: $ {RUN _ ID}:' i 'FLUSHDB' w łzawieniu.

13) Szczegóły dotyczące iGaming/Finance

Pieniądze i limity: testy na nieruchomości (saldo ≥ 0, całkowite ograniczenia).
Regulacja: kontrola rejestrowania (dziennik audytu jest zapisany), niezmienne zdarzenia.
Płatności/PSP: testy integracji HMAC/mTLS, „Retry-After”, idempotencja, dedup 'jti'.
Odpowiedzialna gra: testy reguły progowej/chłodzenia; „vchera → segodnya” na fałszywy zegar.

14) Antypattery

„Jednostki”, które podnoszą DB/HTTP są już integracja (pomylić warstwy i spowolnić CI).
Wysoki zasięg ze względu na puste oświadczenia („pokryte, ale nie sprawdzone”).
Logika moki usług osób trzecich, w przypadku gdy potrzebna jest umowa (przerwa po aktualizacji).
Testy z 'snem (5)' zamiast oczekiwań dotyczących zdarzenia/stanu.
Wspólna baza danych testowych do badań równoległych → wyścig i płatek.

15) Lista kontrolna gotowości Prod

  • Piramida zdefiniowana jako% Unit/Integration/E2E i docelowych udziałów w czasie trwania.
  • Jednostki są odizolowane, szybkie, obejmują wartości graniczne i niezmienne.
  • Integracja wykorzystuje środowisko hermetyczne (Testcontainers/Compose), bez wspólnych stanów.
  • Testy kontraktowe (OpenAPI/Pact) są weryfikowane w CI.
  • Dane z badań - zarządzane: nasiona/wałek/przedrostki, fałszywy zegar.
  • Równoległy bieg, raporty JUnit/Allure, artefakty z rejestru kontenerów.
  • Wskaźniki: czas trwania, wskaźnik błędów, wynik mutacji; wpisy do degradacji.
  • Scenariusze płatności/webhook: HMAC/mTLS, retrai, idempotence, deadup.
  • Dokumentacja strategiczna i szablony prób próbnych.

16) TL; DR

Jednostka - maksymalna logika, minimalne środowisko; Integracja - minimum moks, maksymalny realizm. Trzymaj piramidę: Szybkie jednostki złapać 80% wad, Integracja potwierdza wiązki i kontrakty. Użyj hermetycznych pojemników, testów kontraktowych, fałszywego zegara i równoległości. Zmierzyć nie tylko zasięg, ale także wynik mutacji i błędny wskaźnik. W szczególności sprawdź ścieżki płatności/webhook: podpisy, przekaźniki i idempotencję.

Contact

Skontaktuj się z nami

Napisz do nas w każdej sprawie — pytania, wsparcie, konsultacje.Zawsze jesteśmy gotowi pomóc!

Rozpocznij integrację

Email jest wymagany. Telegram lub WhatsApp są opcjonalne.

Twoje imię opcjonalne
Email opcjonalne
Temat opcjonalne
Wiadomość opcjonalne
Telegram opcjonalne
@
Jeśli podasz Telegram — odpowiemy także tam, oprócz emaila.
WhatsApp opcjonalne
Format: kod kraju i numer (np. +48XXXXXXXXX).

Klikając przycisk, wyrażasz zgodę na przetwarzanie swoich danych.