GH GambleHub

Unit vs Integrationstests

1) Warum zwischen Testtypen unterscheiden

Die richtige Granulierung der Tests macht die Entwicklung vorhersehbar: Unit fängt Logikfehler schnell und günstig auf; Integration prüft Modulbündel, realen Transport und „Kleber“. Gemeinsam reduzieren sie Rückschritte und beschleunigen Freigaben.

2) Definitionen und Grenzen

Unit-Prüfung

Prüft eine kleine Verhaltenseinheit (Funktion, Klasse, Use-Case) isoliert.
Externe Abhängigkeiten werden ersetzt (mock/stub/fake).
Schnell (ms-zehnt ms), deterministisch.

Integrationstest

Überprüft das Zusammenspiel mehrerer realer Komponenten: DB, Broker (Kafka/RabbitMQ), HTTP/gRPC, Dateisystem, Cache.
Minimale Moks, echte Protokolle.
Langsamer (Hunderte von ms-Sekunden), teurer in der Unterstützung.

💡 Regel: Sobald „Prozess/Sockel/DB durchlaufen“ - sind wir schon in Integrationsgewässern.

3) Testpyramide (nicht Eishorn)

Basis: Einheit (70-80% durch Quantität) - billig, schnell.
Mittlere Schicht: Integration/Komponente (15-25%) - kritische Pfade und Verträge.
Top: E2E/UX/Exploratory (5-10%) - minimal genug.
An den Seiten: Statische Analyse/Lint/Typenprüfung und Mutationsprüfung als Qualitätsverstärker.

4) Was geben Einheit und was - Integration

AufgabeDer TypWarum
Reine Geschäftslogik (Validierungen, Provisionsberechnungen, Schlüsselidempotenz)UnitSchnell, deterministisch, viele Grenzwerte
Muppings DTO↔model, Serialisierung, ParsingUnitViele Fälle, leicht zu isolieren
Repositories/ORM-AbfragenIntegration (с test DB)„Verhalten“ ORM und SQL Nuancen nur auf Live-DB sichtbar
HTTP-Vertrag (Status, Header, Schemata)Integration / ContractSie benötigen einen HTTP + JSON Schema/OpenAPI Live Stack
Saga/Outbox, Retrays, DeadlinesIntegration / ComponentTimings, Transaktionalität, Broker
Rate limit в gatewayIntegrationRedis/Staat/Zeiträume
Payment Webhooks (HMAC, Wiederholung)Integration / CDCSignaturen, Uhren, Netzwerkfunktionen

5) Daten und Fiktionen

Unit

Inline-Fixturen/-Bildner (Fabrikmethoden).
Tabellarische Tests (table-driven) für Grenzwerte.
Eigenschaftsbasierter Ansatz für Invarianten (z.B. „Lastschriftbetrag = Gutschriftbetrag“).

Integration

Hermetische Umgebung: Testcontainer/Docker Compose erheben 'postgres + redis + kafka + wiremock'.
Initialer Seed im DB/Cache und Bereinigung danach (Transaktion/Rollback, Truncate).
Uhren/Timer sind Fake (kontrolliert), sonst Flacks.

6) Werkzeuge und Muster

Mocks/Stubs/Fakes/Spies:
  • Stub ist eine feste Antwort (billig).
  • Mock - Überprüfen Sie Interaktionen/Anzahl der Anrufe.
  • Fake ist eine vereinfachte Implementierung (z.B. In-Memory Repo).
  • Vertragsprüfung (CDC): Pact/Swagger-based - wir erfassen die Erwartungen des Kunden und prüfen den Anbieter.
  • WireMock/MockServer - HTTP-Stubs für Dienste von Drittanbietern.
  • Testcontainer sind Live-DBs/Broker lokal und im CI ohne „Zoo“.

7) Beispiele

7. 1 Einheit: Idempotenz der Zahlung (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: Webhook-Signatur (HMAC) + Wiederholung

bash docker-compose: app + redis + wiremock (PSP)
docker compose -f docker-compose. test. yml up -d pytest -m "integration and webhook" -q
Test:
  • WireMock verschenkt das Event mit 'X-Timestamp' und Signatur.
  • Die Anwendung überprüft HMAC, dedupliziert durch 'event _ id', eine Wiederholung nach 5 Sekunden erzeugt keinen Take.
  • Wir überprüfen '200' und dass es nur einen Eintrag gibt.

7. 3 CDC: Vertrag des Kunden mit dem Anbieter

Der Kunde bildet einen Pact (Erwartung: 'POST/v1/payout' → '201' mit Schema).
Der Anbieter im CI fährt die Vertragsprüfung an seinem Stand durch.

8) Geschwindigkeit, Parallelität, Flakes

Einheiten sollten <100 ms pro Test arbeiten; Paket - Sekunden.
Integration - parallel zu Containern/Häfen; Migrationen beim Start verwenden.

Flaky-Gegenmittel:
  • kontrollierte Zeit (Fake Clock),
  • Erwartungen „für ein klares Ereignis“ und nicht „Schlaf“,
  • stabile Schwellen (Retrays mit Jitter deterministisch testen).

9) Qualitätsmetriken

Coverage (Zeilen/Zweige): nützlich, um einen Trend zu beobachten, aber nicht das Ziel.
Mutationstests (PIT/Mutmut): Zeigt, ob Tests falsche Änderungen „töten“ - die wahre Stärke von Assurence.
Testdauer und Flakrate: Alerts beim Wachstum.
Defect containment: Der Anteil der vor der Produktion abgefangenen Fehler.

10) Einbettung in CI/CD

Jobs: Einheit → Integration → e2e (Fan-out für Dienste).
Abhängigkeitscache, parallele Matrizen nach DB/Sprachen/Versionen.
Berichte: JUnit/Allure + Container Logartefakte (bei Stürzen).
Gate: „grüne Einheit + kritische Integration“ - eine Bedingung der Perge; e2e - auf nightly.

Beispiel für eine Matrix (GitHub Actions, Snippet):
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) Microservices und Events

Serviceverträge: OpenAPI/Protobuf werden versioniert; Kompatibilitätstests (Backward).

Event-driven:
  • Unit: Mapping von Domänenereignissen und Invarianten.
  • Integration: Veröffentlichung/Abonnement in einem echten Broker (Kafka), outbox/inbox Semantik, exactly-once Nachahmung (mindestens - idempotent).
  • Retray-/Duplikat-/Reorder-Tests (Out-of-Order).

12) Daten und Isolation in der Integration

Jeder Test → ein eindeutiges Schema/DB (Testcontainers JDBC URL'? TC _ TMPFS =/var/lib/postgresql/data: rw').
Transaktionale Fixturen (begin→run→rollback) beschleunigen die Reinigung.
Für Redis/Cache ist das Schlüsselpräfix' test: $ {RUN _ ID}: 'und' FLUSHDB 'in teardown.

13) Spezifität von iGaming/Finanzen

Geld und Grenzen: eigenschaftsbasierte Invariantentests (Saldo ≥ 0, Gesamtgrenzen).
Regulierung: Überprüfung der Protokollierung (Audit-Log wird geschrieben), unveränderliche Ereignisse.
Zahlungen/PSP: HMAC/mTLS Integrationstests, 'Retry-After', idempotency, dedup 'jti'.
Verantwortungsvolles Spielen: Tests der Schwellen-/Coulddowns-Regeln; „vchera→segodnya“ auf der Fake-Uhr.

14) Antipatterns

Die „Einheiten“, die die DB/NTTR anheben, sind bereits Integration (verwirren Schichten und verlangsamen CI).
Hohe Deckung durch leere Aussagen („abgedeckt, aber nicht überprüft“).
Moki Logik von Drittanbietern Dienstleistungen, wo Sie einen Vertrag benötigen (bricht mit dem Upgrade).
Tests mit 'Schlaf (5)' anstelle der Erwartungen des Ereignisses/Bedingung.
Gemeinsame Test-DB für parallele Tests → Rennen und Flyes.

15) Checkliste Prod-Ready

  • Die Pyramide ist definiert als:% der Unit/Integration/E2E und das Ziel nach Laufzeit.
  • Einheiten sind isoliert, schnell, decken Randwerte und Invarianten ab.
  • Integration verwendet eine hermetische Umgebung (Testcontainer/Compose), ohne gemeinsame Elemente.
  • Vertragstests (OpenAPI/Pact) werden im CI verifiziert.
  • Testdaten - überschaubar: Saatgut/Rollback/Präfixe, Fake-Uhr.
  • Parallellauf, JUnit/Allure-Berichte, Container-Logartefakte.
  • Metriken: duration, flaky rate, mutation score; Alerts auf Degradation.
  • Payment/Webhook-Szenarien: HMAC/mTLS, Retrays, Idempotenz, Dedup.
  • Strategiedokumentation und Beispiele für Testvorlagen.

16) TL; DR

Einheit - Maximum der Logik, Minimum der Umgebung; Integration - ein Minimum an Moks, ein Maximum an Realismus. Halten Sie die Pyramide: Schnelle Einheiten fangen 80% der Mängel auf, Integration bestätigt Bündel und Verträge. Verwenden Sie hermetische Container, Vertragstests, Fake Clock und Parallelität. Messen Sie nicht nur coverage, sondern auch mutation score und flaky rate. Überprüfen Sie insbesondere die Zahlungs-/Webhook-Pfade: Signaturen, Retrays und Idempotenz.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.