Load Testing und Performance Testing | Enjyn Gruppe
Hallo Welt
Hallo Welt
Original Lingva Deutsch
Übersetzung wird vorbereitet...
Dieser Vorgang kann bis zu 60 Sekunden dauern.
Diese Seite wird erstmalig übersetzt und dann für alle Besucher gespeichert.
0%
DE Zurück zu Deutsch
Übersetzung durch Lingva Translate

235 Dokumentationen verfügbar

Wissensdatenbank

Load Testing Performance

Zuletzt aktualisiert: 20.01.2026 um 11:25 Uhr

Load Testing und Performance Testing

Load Testing zeigt, wie Ihre Anwendung unter Last reagiert. Lernen Sie Lasttests mit k6, Artillery und JMeter zu planen und durchzuführen.

Testarten verstehen

┌─────────────────────────────────────────────────────────────┐
│                   PERFORMANCE TEST ARTEN                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   LOAD TEST                                                 │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  Last ▲                                              │  │
│   │       │    ┌────────────────┐                       │  │
│   │       │    │  Normal Load   │                       │  │
│   │       └────┴────────────────┴────────► Zeit         │  │
│   │  → Wie verhält sich das System unter erwarteter Last│  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   STRESS TEST                                               │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  Last ▲            ╱╲                                │  │
│   │       │          ╱    ╲                              │  │
│   │       │        ╱        ╲                            │  │
│   │       └──────╱────────────╲───────► Zeit            │  │
│   │  → Ab welcher Last bricht das System zusammen?      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   SPIKE TEST                                                │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  Last ▲      │                                       │  │
│   │       │      │    │                                  │  │
│   │       │  ────┴────┴────                             │  │
│   │       └────────────────────────────► Zeit           │  │
│   │  → Wie reagiert das System auf plötzliche Spitzen?  │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   SOAK TEST (Endurance)                                     │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  Last ▲                                              │  │
│   │       │  ─────────────────────────────────────      │  │
│   │       │                                              │  │
│   │       └────────────────────────────► Zeit (Stunden) │  │
│   │  → Gibt es Memory Leaks oder Degradation über Zeit? │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

k6 - Moderne Load Testing Tool

// Installation
// brew install k6
// apt install k6
// docker pull grafana/k6

// basic-test.js
import http from 'k6/http';
import { check, sleep } from 'k6';

// Test-Konfiguration
export const options = {
    // Stages für Ramp-Up/Ramp-Down
    stages: [
        { duration: '30s', target: 20 },   // Ramp up auf 20 User
        { duration: '1m', target: 20 },    // 1 Minute halten
        { duration: '30s', target: 50 },   // Auf 50 User erhöhen
        { duration: '2m', target: 50 },    // 2 Minuten halten
        { duration: '30s', target: 0 },    // Ramp down
    ],

    // Schwellwerte
    thresholds: {
        http_req_duration: ['p(95)<500'],    // 95% unter 500ms
        http_req_failed: ['rate<0.01'],       // Weniger als 1% Fehler
        checks: ['rate>0.99'],                // 99% der Checks bestehen
    },
};

export default function () {
    // Test-Szenario
    const response = http.get('https://api.example.com/users');

    // Assertions
    check(response, {
        'status is 200': (r) => r.status === 200,
        'response time < 200ms': (r) => r.timings.duration < 200,
        'has users': (r) => JSON.parse(r.body).users.length > 0,
    });

    sleep(1); // 1 Sekunde Pause zwischen Requests
}
// Komplexeres Szenario mit mehreren Endpoints
import http from 'k6/http';
import { check, group, sleep } from 'k6';

const BASE_URL = 'https://api.example.com';

export default function () {
    // User Flow simulieren
    group('User Login Flow', function () {
        // 1. Login
        const loginRes = http.post(`${BASE_URL}/auth/login`, JSON.stringify({
            email: 'test@example.com',
            password: 'password123',
        }), {
            headers: { 'Content-Type': 'application/json' },
        });

        check(loginRes, {
            'login successful': (r) => r.status === 200,
            'has token': (r) => JSON.parse(r.body).token !== undefined,
        });

        const token = JSON.parse(loginRes.body).token;

        sleep(1);

        // 2. Dashboard laden
        const dashboardRes = http.get(`${BASE_URL}/dashboard`, {
            headers: { Authorization: `Bearer ${token}` },
        });

        check(dashboardRes, {
            'dashboard loaded': (r) => r.status === 200,
        });

        sleep(2);

        // 3. Daten abrufen
        const dataRes = http.get(`${BASE_URL}/api/data`, {
            headers: { Authorization: `Bearer ${token}` },
        });

        check(dataRes, {
            'data retrieved': (r) => r.status === 200,
            'response time OK': (r) => r.timings.duration < 500,
        });
    });

    sleep(3);
}
# k6 ausführen
k6 run basic-test.js

# Mit mehr Output
k6 run --out json=results.json basic-test.js

# Mit Grafana Cloud Integration
k6 run --out cloud basic-test.js

# Nur bestimmte Anzahl VUs
k6 run --vus 10 --duration 30s basic-test.js

Artillery

# Installation
npm install -g artillery

# artillery.yml
config:
  target: 'https://api.example.com'
  phases:
    - duration: 60
      arrivalRate: 5
      name: "Warm up"
    - duration: 120
      arrivalRate: 10
      rampTo: 50
      name: "Ramp up load"
    - duration: 300
      arrivalRate: 50
      name: "Sustained load"

  defaults:
    headers:
      Content-Type: 'application/json'

  ensure:
    p99: 500
    maxErrorRate: 1

scenarios:
  - name: "User Journey"
    flow:
      - post:
          url: "/auth/login"
          json:
            email: "test@example.com"
            password: "password123"
          capture:
            - json: "$.token"
              as: "authToken"

      - think: 2

      - get:
          url: "/api/users"
          headers:
            Authorization: "Bearer {{ authToken }}"
          expect:
            - statusCode: 200
            - contentType: json

      - think: 3

      - get:
          url: "/api/products"
          expect:
            - statusCode: 200
# Artillery ausführen
artillery run artillery.yml

# Mit Report
artillery run --output report.json artillery.yml
artillery report report.json --output report.html

# Quick Test
artillery quick --count 100 --num 10 https://api.example.com/health

JMeter (GUI-basiert)

# JMeter CLI Beispiel (ohne GUI)

# Test Plan erstellen (testplan.jmx)
# Enthält Thread Group, HTTP Requests, Listeners

# Ausführen
jmeter -n -t testplan.jmx -l results.jtl -e -o report/

# Parameter:
# -n    Non-GUI Mode
# -t    Test Plan File
# -l    Results Log
# -e    Generate Report
# -o    Report Output Folder

# Mit Properties
jmeter -n -t testplan.jmx \
  -Jthreads=100 \
  -Jrampup=60 \
  -Jduration=300 \
  -l results.jtl

Wichtige Metriken

RESPONSE TIME METRIKEN

┌────────────────┬────────────────────────────────────────────┐
│ Metrik         │ Beschreibung                               │
├────────────────┼────────────────────────────────────────────┤
│ Average        │ Durchschnittliche Antwortzeit              │
│                │ → Kann durch Ausreißer verfälscht sein     │
├────────────────┼────────────────────────────────────────────┤
│ Median (p50)   │ 50% der Requests sind schneller            │
│                │ → Besserer Indikator als Average           │
├────────────────┼────────────────────────────────────────────┤
│ p90            │ 90% der Requests sind schneller            │
│                │ → Zeigt typische User Experience           │
├────────────────┼────────────────────────────────────────────┤
│ p95            │ 95% der Requests sind schneller            │
│                │ → Standard SLA Metrik                      │
├────────────────┼────────────────────────────────────────────┤
│ p99            │ 99% der Requests sind schneller            │
│                │ → Worst-Case für normale User              │
├────────────────┼────────────────────────────────────────────┤
│ Max            │ Längste Antwortzeit                        │
│                │ → Oft Ausreißer, weniger aussagekräftig    │
└────────────────┴────────────────────────────────────────────┘

WICHTIG: p95 und p99 sind wichtiger als Average!

THROUGHPUT METRIKEN
• Requests per Second (RPS)
• Transactions per Second (TPS)
• Concurrent Users (VUs)

ERROR METRIKEN
• Error Rate (%)
• Errors by Type (4xx, 5xx, Timeouts)

Test-Ergebnisse interpretieren

k6 OUTPUT BEISPIEL:

     data_received..................: 15 MB  250 kB/s
     data_sent......................: 2.1 MB 35 kB/s
     http_req_blocked...............: avg=1.2ms   med=0.9ms  p(95)=2.5ms
     http_req_connecting............: avg=0.8ms   med=0.6ms  p(95)=1.8ms
     http_req_duration..............: avg=45ms    med=38ms   p(95)=120ms  ← WICHTIG
     http_req_failed................: 0.5%   ← FEHLERRATE
     http_req_receiving.............: avg=2ms     med=1.5ms  p(95)=5ms
     http_req_sending...............: avg=0.3ms   med=0.2ms  p(95)=0.8ms
     http_req_waiting...............: avg=42ms    med=35ms   p(95)=115ms
     http_reqs......................: 50000  833/s         ← THROUGHPUT
     iteration_duration.............: avg=1.2s    med=1.1s   p(95)=1.5s
     iterations.....................: 50000  833/s
     vus............................: 50     min=1   max=50
     vus_max........................: 50

INTERPRETATION:
✅ p(95) = 120ms - 95% unter 200ms Ziel
✅ Error Rate 0.5% - Unter 1% Schwelle
✅ 833 RPS - Ausreichend für erwartete Last

CI/CD Integration

# .github/workflows/load-test.yml

name: Load Test

on:
  pull_request:
    branches: [main]
  schedule:
    - cron: '0 2 * * *'  # Täglich um 2 Uhr

jobs:
  load-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install k6
        run: |
          sudo gpg -k
          sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
          echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
          sudo apt-get update
          sudo apt-get install k6

      - name: Run Load Test
        run: k6 run --out json=results.json tests/load/api-test.js

      - name: Upload Results
        uses: actions/upload-artifact@v4
        with:
          name: load-test-results
          path: results.json

      - name: Check Thresholds
        run: |
          # Parse results und prüfe Schwellwerte
          FAILED=$(jq '.metrics.checks.values.fails' results.json)
          if [ "$FAILED" -gt 0 ]; then
            echo "Load test failed: $FAILED checks failed"
            exit 1
          fi

Best Practices

PLANUNG
1. Baseline etablieren (aktuelle Performance messen)
2. Ziele definieren (SLAs, erwartete Last)
3. Realistische Szenarien (echte User Flows)
4. Test-Daten vorbereiten

DURCHFÜHRUNG
1. Isolierte Umgebung (keine anderen Einflüsse)
2. Monitoring aktiviert (APM, Logs, Metriken)
3. Langsam hochfahren (Ramp-Up)
4. Mehrere Durchläufe für Konsistenz

AUSWERTUNG
1. Percentiles statt Averages
2. Bottlenecks identifizieren (CPU, Memory, DB, Network)
3. Ergebnisse dokumentieren
4. Trends über Zeit verfolgen

HÄUFIGE FEHLER
❌ Test von lokalem Rechner (Netzwerk-Limitierung)
❌ Zu wenig Test-Daten (Cache-Effekte)
❌ Keine Ramp-Up Phase (unrealistischer Spike)
❌ Nur Average betrachten
💡 Tipps: 1. Realistische User-Szenarien simulieren
2. p95/p99 für SLAs verwenden, nicht Average
3. Monitoring während Tests aktiv haben
4. Regelmäßig testen (nicht nur vor Release)
5. Ergebnisse dokumentieren und vergleichen

Weitere Informationen

Enjix Beta

Enjyn AI Agent

Hallo 👋 Ich bin Enjix — wie kann ich dir helfen?
120