# Lasttests (Gatling)

Last- und Performance-Tests fuer Effigenix ERP auf Basis von [Gatling](https://gatling.io/).

## Voraussetzungen

- Java 21
- Maven
- Docker oder Podman (fuer Testcontainers/PostgreSQL)
- Backend muss vorher gebaut sein (`mvn install` im Root oder `backend/`)

## Backend bauen

Das Loadtest-Modul bindet das Backend als Dependency ein und startet es embedded.
Daher muss das Backend-Artefakt im lokalen Maven-Repository vorhanden sein:

```bash
cd backend
mvn clean install -DskipTests
```

## Lasttests starten

```bash
cd loadtest
mvn gatling:test
```

Das startet automatisch:

1. PostgreSQL via Testcontainers (Docker/Podman)
2. Spring Boot embedded mit Liquibase-Migrationen
3. Testdaten-Seeding (120 Artikel, 30 Lieferanten, 50 Kunden, 30 Rezepte, ~1500 Chargen, 100 Produktionsauftraege)
4. Gatling-Simulation mit ~2500 Requests

## Lastprofil

| Szenario | User | Repeat | ~Requests |
|---|---|---|---|
| Stammdaten CRUD | 15 | 15x | ~240 |
| Produktions-Workflow | 30 | 1x (Chain) | ~270 |
| Lagerverwaltung | 15 | 15x | ~240 |
| Produktion Read-Only | 50 | 15x | ~800 |
| Stammdaten Read-Only | 50 | 15x | ~800 |
| **Gesamt** | | | **~2350** |

## Ergebnisse

Nach dem Lauf liegt der HTML-Report unter:

```
loadtest/target/gatling/<simulation-name>/index.html
```

## Assertions

- p95 < 500ms (global)
- p99 < 1000ms (global)
- Fehlerrate < 5%
- Einzeldatensatz-Reads: mean < 20ms
- Listen (wenig Daten): mean < 35ms
- Listen (viel Daten): mean < 75ms
- Write-Requests: mean < 50ms

## Konfiguration

- `src/test/resources/gatling.conf` - Gatling-Einstellungen (Charting, HTTP-Cache, Writer)
- `src/test/resources/logback-test.xml` - Log-Level waehrend der Tests

## Aufbau

```
loadtest/
  src/test/java/de/effigenix/loadtest/
    infrastructure/
      LoadTestInfrastructure.java   # Startet PostgreSQL + Spring Boot
      LoadTestDataSeeder.java       # Erzeugt realistische Testdaten via REST-API
    scenario/
      AuthenticationScenario.java   # Login-Chain
      MasterDataScenario.java       # Artikel, Lieferanten, Kunden
      ProductionScenario.java       # Rezepte, Chargen, Produktionsauftraege
      InventoryScenario.java        # Lagerorte, Bestaende
    simulation/
      FullWorkloadSimulation.java   # Haupt-Simulation (kombiniert alle Szenarien)
    util/
      JsonBodyBuilder.java          # JSON-Request-Body-Erzeugung
```
