Einleitung

Lasttests (Load Testing) sind essenziell, um die Leistungsfähigkeit einer Webanwendung unter realistischen Bedingungen zu bewerten. Eine Java-Webanwendung kann unter hoher Last unerwartetes Verhalten zeigen, das erst durch gezielte Tests erkennbar wird. Das Open-Source-Tool k6 ist eine leistungsfähige und moderne Lösung für das Last- und Performance-Testing von Webanwendungen.

In diesem Artikel zeigen wir, wie man k6 für das Load Testing einer Java-Webanwendung verwendet. Wir erklären die Grundlagen von k6, die Installation, das Schreiben von Tests und die Analyse der Testergebnisse.


Was ist k6?

k6 ist ein in Go geschriebenes Open-Source-Tool für Lasttests, das sich durch eine einfache JavaScript-basierte Testskript-Syntax auszeichnet. Es eignet sich besonders für Entwickler und DevOps-Teams, um die Skalierbarkeit und Stabilität einer Webanwendung unter Last zu analysieren.

Vorteile von k6

  • Einfache Testskripterstellung: Tests werden in JavaScript geschrieben.
  • CLI-basiert: Keine grafische Oberfläche erforderlich, wodurch sich k6 gut in CI/CD-Pipelines integrieren lässt.
  • Gute Performance: Da k6 in Go geschrieben ist, bietet es eine hohe Effizienz.
  • Integrierte Metriken: Erfasst umfangreiche Metriken zur Analyse der Performance.

Installation von k6

Die Installation von k6 ist einfach und kann je nach Betriebssystem über verschiedene Paketmanager erfolgen.

Installation unter Windows

choco install k6

Installation unter macOS

brew install k6

Installation unter Linux (Ubuntu/Debian)

sudo apt update && sudo apt install k6

Nach der Installation kann die Funktionalität von k6 mit folgendem Befehl überprüft werden:

k6 version

Erstellung eines ersten Testskripts

Ein Load-Test wird in k6 mit einem JavaScript-Skript definiert. Ein einfaches Beispiel für eine Java-Webanwendung könnte folgendermaßen aussehen:

import http from 'k6/http';
import { check, sleep } from 'k6';

export let options = {
  vus: 10, // Anzahl gleichzeitiger virtueller Nutzer
  duration: '30s', // Testdauer
};

export default function () {
  let res = http.get('http://localhost:8080');
  check(res, {
    'Status ist 200': (r) => r.status === 200,
  });
  sleep(1);
}
Code-Sprache: JavaScript (javascript)

Dieses Skript startet 10 virtuelle Nutzer (VUs), die für 30 Sekunden Anfragen an http://localhost:8080 senden. Es überprüft, ob der Server mit Statuscode 200 antwortet, und fügt eine Pause von 1 Sekunde zwischen den Anfragen hinzu.


Ausführen eines Tests

Um den Test auszuführen, speichert man das obige Skript beispielsweise als test.js und startet es mit folgendem Befehl:

k6 run test.js
Code-Sprache: CSS (css)

Während des Tests zeigt k6 eine Echtzeit-Ausgabe der wichtigsten Metriken an:

        
  data_received..........: 12 MB
  http_req_duration.....: avg=120ms min=90ms max=300ms
  http_req_failed.......: 0%

Erweiterte Lasttests

Stufenweise Laststeigerung

Eine realistischere Simulation kann durch eine stufenweise Erhöhung der Nutzerzahl erreicht werden:

export let options = {
  stages: [
    { duration: '30s', target: 20 }, // Langsame Erhöhung auf 20 VUs
    { duration: '1m', target: 50 },  // Erhöhung auf 50 VUs
    { duration: '30s', target: 0 },  // Reduzierung der Last
  ],
};
Code-Sprache: JavaScript (javascript)

Test mit Authentifizierung

Falls eine Java-Webanwendung Authentifizierung benötigt, kann dies durch das Senden eines Tokens in den Headern umgesetzt werden:

let params = {
  headers: {
    Authorization: 'Bearer <TOKEN>'
  }
};
let res = http.get('http://localhost:8080/protected-endpoint', params);
Code-Sprache: JavaScript (javascript)

Analyse der Testergebnisse

Nach einem Test können die Ergebnisse in verschiedenen Formaten ausgegeben werden, z. B. JSON oder CSV:

k6 run --out json=ergebnisse.json test.js

Zur tiefergehenden Analyse können externe Tools wie Grafana und InfluxDB verwendet werden. k6 kann die Daten direkt in InfluxDB speichern:

k6 run --out influxdb=http://localhost:8086/k6 test.js
Code-Sprache: JavaScript (javascript)

Diese Daten können dann in einem Grafana-Dashboard visualisiert werden.


Integration in CI/CD-Pipelines

k6 eignet sich gut für den Einsatz in CI/CD-Pipelines, z. B. in GitHub Actions oder GitLab CI/CD:

Beispiel für GitHub Actions

name: Load Test

on: push

jobs:
  load-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install k6
        run: sudo apt update && sudo apt install -y k6
      - name: Run k6 test
        run: k6 run test.js
Code-Sprache: HTTP (http)

Fazit

k6 ist ein leistungsstarkes und flexibles Tool für das Load Testing von Java-Webanwendungen. Es ermöglicht Entwicklern, Performance-Probleme frühzeitig zu erkennen und zu beheben. Durch die einfache Integration in CI/CD-Pipelines und die Unterstützung für externe Analysetools ist k6 eine hervorragende Wahl für automatisierte Lasttests.

Mit den hier gezeigten Beispielen kann man schnell eigene Tests schreiben und ausführen, um die Belastbarkeit und Skalierbarkeit einer Java-Webanwendung zu verbessern.