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.
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
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.
- 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.
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ę.