Continuous Performance Testing (CPT) ist die konsequente Erweiterung von Continuous Integration: Performance-Metriken laufen pro Build mit, statt einmal pro Release. Regressionen fallen am nächsten Morgen auf, nicht zwei Sprints später im Production-Monitoring. Wer DevOps ernst meint, hat CPT in der Pipeline.
In diesem Artikel zeige ich dir, was CPT bedeutet, wie du Performance-Tests in CI/CD-Pipelines integrierst (JMeter, GitHub Actions, AWS), und welche Schwellenwerte sinnvoll sind. Plus die Stolperfallen aus echten Projekten.
Inhaltsverzeichnis
Was ist Continuous Performance Testing?
Continuous Performance Testing (CPT) ist die Methode, Performance-Tests automatisiert und kontinuierlich in der CI/CD-Pipeline laufen zu lassen. Statt einmal pro Release manuell zu messen, läuft pro Push ein Smoke-Performance-Test und pro Nightly ein vollständiger Lasttest gegen Staging.
Drei Eigenschaften definieren CPT:
- Automatisiert. Tests laufen ohne Handarbeit, getriggert von Build-System oder Cron.
- Reproduzierbar. Gleicher Test-Plan, gleiche Lastprofile, gleiche Schwellenwerte über alle Builds.
- Gated. Schwellenwerte definieren Pass/Fail. Bei Regression failed der Build oder warnt mindestens.
Für die Grundlagen siehe den Performance-Testing-Pillar. Für die Performance-Testing-Sicht auf DevOps insgesamt den Artikel Performance Testing in DevOps.
Pipeline-Profile: was läuft wann
| Stage | Test-Typ | Last | Dauer | Trigger |
|---|---|---|---|---|
| Commit-Stage | Smoke-Performance | 10 bis 50 User | 2 Min | Pro Push |
| Nightly | Lasttest auf Staging | 100 bis 500 User | 15 bis 30 Min | Werktags 2 Uhr |
| Pre-Release | Stresstest + Spike | 1.000+ User | 1 bis 2 h | Vor Release-Cut |
| Quartal | Endurance | Produktions-Last | 24 bis 48 h | Vor Major-Release |
Wichtig: nicht alle Test-Typen in der Commit-Stage. Sonst blockiert ein 30-minütiger Lasttest jeden Push. Gestaffelte Profile sind der Trick.
GitHub Actions: JMeter-Lasttest im Workflow
name: jmeter-nightly
on:
schedule:
- cron: '0 2 * * 1-5'
jobs:
loadtest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run JMeter
run: |
docker run --rm -v ${{ github.workspace }}:/tests \
justb4/jmeter:5.6.3 \
-n -t /tests/plan.jmx \
-l /tests/results.jtl \
-e -o /tests/report-html/ \
-Jhost=staging.example.com -Jusers=200
- uses: actions/upload-artifact@v4
with:
name: jmeter-report
path: report-html/
Was passiert: Cron triggert den Workflow nightly, Docker-Image führt JMeter im Non-GUI-Mode aus, HTML-Report wird als Artefakt gespeichert. Für tieferes Setup mit Distributed Workern siehe den Artikel JMeter Lasttest-Praxis.
AWS-Worker für Cluster-Skalierung
Eine GitHub-Actions-VM (ubuntu-latest) schafft etwa 500 bis 1.000 virtuelle User. Für mehr Last brauchst du dedizierte Worker. Drei Optionen:
- EC2-Worker on-demand. Terraform spinnt 5 Worker vom Typ
c6i.2xlargehoch, JMeter Master koordiniert via RMI, nach dem Run zerstört Terraform die Worker wieder. Kosten: ~1,80 USD pro 1-Stunden-Run. - ECS/Fargate. Container-basiert, kein VM-Lifecycle. Etwas teurer als EC2 Spot, dafür schneller im Bootstrap.
- k6 Cloud oder BlazeMeter. Managed Service, Pay-per-Test. Sinnvoll bei seltenen Tests ohne Performance-Team.
Bei AWS müssen Worker-Security-Groups Port 1099 (RMI) zwischen Master und Worker offen lassen. Klassiker, der den ersten Distributed Run gerne 60 Sekunden hängen lässt bevor Timeout.
Schwellenwerte und Pass/Fail-Gates
CPT ohne Schwellenwerte ist nur Datensammeln. Drei Schwellen-Typen:
- Absolute Werte. z.B. „95% unter 500 ms bei 200 Usern". Klar definiert, aber starr.
- Vergleich zum Baseline. z.B. „p(95) nicht mehr als 20 % schlechter als letzte Woche". Adaptiv, aber erfordert Trend-Datenbank.
- Error-Rate. z.B. „Error-Rate unter 1 %". Easy, immer sinnvoll.
Hard-Gates (Build failed bei Verletzung) nur in Nightly aufwärts. In der Commit-Stage maximal Soft-Warnungen, sonst blockierst du jeden Push wegen einem Ausreißer.
Stolperfallen aus der Praxis
- Flaky-Tests aus Shared-CI-Runnern. Performance auf
ubuntu-latestschwankt um Faktor 2. Dedizierte Worker oder Cloud-VMs für stabile Messungen. - Test-Daten-Drift. Performance-Test mit 100 Demo-Datensätzen rennt grün, Production mit 10 Millionen killt die DB. Test-Daten müssen Production-Volumen widerspiegeln.
- Build-Blocker im Commit-Stage. Performance-Tests in der Commit-Stage als hard-failing-Gate stoppen jeden Push. Soft-Gate mit Trend-Warnung, hard-Gate nur in Nightly.
- HTML-Report nicht archiviert. Build endet, Workspace aufgeräumt, Report weg. Immer
upload-artifactoderpublishHTMLnutzen.
Fazit
Continuous Performance Testing macht aus einem einmaligen Pre-Release-Stress einen Trend, den du täglich beobachtest. Mit gestaffelten Profilen, Cloud-Worker für Skalierung und sinnvollen Schwellenwerten verwandelst du Performance von einem Quartals-Audit in einen Pipeline-Standard.
Qualität ist kein Gate am Ende der Pipeline. Qualität ist die Pipeline.
Für die DevOps-Sicht insgesamt lies den Artikel Performance Testing in DevOps. Für die JMeter-Praxis im Produktions-Setup siehe JMeter Lasttest: Distributed Mode, Cloud & CI/CD.
Häufige Fragen (FAQ)
Was ist Continuous Performance Testing?
Continuous Performance Testing (CPT) ist die Methode, Performance-Tests automatisiert in CI/CD-Pipelines laufen zu lassen, statt einmal pro Release manuell. Pro Push ein Smoke-Test, nightly ein vollständiger Lasttest gegen Staging.
Welches Tool nutze ich für CPT?
JMeter (etabliert, Mixed Protocols), k6 (modern, JavaScript, Grafana-Native) oder Locust (Python-Teams). Alle drei eignen sich für CI/CD. Vergleich im Tool-Vergleich.
Wie oft sollen Performance-Tests laufen?
Smoke-Performance pro Push (2 Min), Lasttest nightly (15 bis 30 Min), Stresstest pre-Release (1 bis 2 h), Endurance quartalsweise. Hard-Gates nur ab Nightly aufwärts.
Was kostet CPT in AWS?
Etwa 1,80 USD pro 1-Stunden-Run mit 5 Worker (c6i.2xlarge) plus Master (t3.medium). Bei nightly 5x/Woche sind das ~40 USD/Monat.
Brauche ich Grafana für CPT?
Nicht zwingend, aber sehr empfohlen. Trend-Visualisierung über Builds macht Regressionen sichtbar. JMeter Backend Listener + InfluxDB + Grafana ist der Open-Source-Standard.