{"id":559,"date":"2024-12-03T16:18:05","date_gmt":"2024-12-03T15:18:05","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=559"},"modified":"2025-02-10T17:32:20","modified_gmt":"2025-02-10T16:32:20","slug":"load-testing-von-java-webanwendungen-mit-k6","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=559","title":{"rendered":"Load Testing von Java-Webanwendungen mit k6"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Einleitung<\/h2>\n\n\n\n<p>Lasttests (Load Testing) sind essenziell, um die Leistungsf\u00e4higkeit 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\u00e4hige und moderne L\u00f6sung f\u00fcr das Last- und Performance-Testing von Webanwendungen.<\/p>\n\n\n\n<p>In diesem Artikel zeigen wir, wie man k6 f\u00fcr das Load Testing einer Java-Webanwendung verwendet. Wir erkl\u00e4ren die Grundlagen von k6, die Installation, das Schreiben von Tests und die Analyse der Testergebnisse.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist k6?<\/h2>\n\n\n\n<p>k6 ist ein in Go geschriebenes Open-Source-Tool f\u00fcr Lasttests, das sich durch eine einfache JavaScript-basierte Testskript-Syntax auszeichnet. Es eignet sich besonders f\u00fcr Entwickler und DevOps-Teams, um die Skalierbarkeit und Stabilit\u00e4t einer Webanwendung unter Last zu analysieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vorteile von k6<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Einfache Testskripterstellung:<\/strong> Tests werden in JavaScript geschrieben.<\/li>\n\n\n\n<li><strong>CLI-basiert:<\/strong> Keine grafische Oberfl\u00e4che erforderlich, wodurch sich k6 gut in CI\/CD-Pipelines integrieren l\u00e4sst.<\/li>\n\n\n\n<li><strong>Gute Performance:<\/strong> Da k6 in Go geschrieben ist, bietet es eine hohe Effizienz.<\/li>\n\n\n\n<li><strong>Integrierte Metriken:<\/strong> Erfasst umfangreiche Metriken zur Analyse der Performance.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Installation von k6<\/h2>\n\n\n\n<p>Die Installation von k6 ist einfach und kann je nach Betriebssystem \u00fcber verschiedene Paketmanager erfolgen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installation unter Windows<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">choco install k6\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Installation unter macOS<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">brew install k6\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Installation unter Linux (Ubuntu\/Debian)<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo apt update &amp;&amp; sudo apt install k6\n<\/code><\/span><\/pre>\n\n\n<p>Nach der Installation kann die Funktionalit\u00e4t von k6 mit folgendem Befehl \u00fcberpr\u00fcft werden:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">k6 version\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Erstellung eines ersten Testskripts<\/h2>\n\n\n\n<p>Ein Load-Test wird in k6 mit einem JavaScript-Skript definiert. Ein einfaches Beispiel f\u00fcr eine Java-Webanwendung k\u00f6nnte folgenderma\u00dfen aussehen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> http <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'k6\/http'<\/span>;\n<span class=\"hljs-keyword\">import<\/span> { check, sleep } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'k6'<\/span>;\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">let<\/span> options = {\n  <span class=\"hljs-attr\">vus<\/span>: <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-comment\">\/\/ Anzahl gleichzeitiger virtueller Nutzer<\/span>\n  <span class=\"hljs-attr\">duration<\/span>: <span class=\"hljs-string\">'30s'<\/span>, <span class=\"hljs-comment\">\/\/ Testdauer<\/span>\n};\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">let<\/span> res = http.get(<span class=\"hljs-string\">'http:\/\/localhost:8080'<\/span>);\n  check(res, {\n    <span class=\"hljs-string\">'Status ist 200'<\/span>: <span class=\"hljs-function\">(<span class=\"hljs-params\">r<\/span>) =&gt;<\/span> r.status === <span class=\"hljs-number\">200<\/span>,\n  });\n  sleep(<span class=\"hljs-number\">1<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dieses Skript startet 10 virtuelle Nutzer (VUs), die f\u00fcr 30 Sekunden Anfragen an <code>http:\/\/localhost:8080<\/code> senden. Es \u00fcberpr\u00fcft, ob der Server mit Statuscode 200 antwortet, und f\u00fcgt eine Pause von 1 Sekunde zwischen den Anfragen hinzu.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Ausf\u00fchren eines Tests<\/h2>\n\n\n\n<p>Um den Test auszuf\u00fchren, speichert man das obige Skript beispielsweise als <code>test.js<\/code> und startet es mit folgendem Befehl:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">k6<\/span> <span class=\"hljs-selector-tag\">run<\/span> <span class=\"hljs-selector-tag\">test<\/span><span class=\"hljs-selector-class\">.js<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>W\u00e4hrend des Tests zeigt k6 eine Echtzeit-Ausgabe der wichtigsten Metriken an:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">        \n  data_received..........: 12 MB\n  http_req_duration.....: avg=120ms min=90ms max=300ms\n  http_req_failed.......: 0%\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Erweiterte Lasttests<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Stufenweise Laststeigerung<\/h3>\n\n\n\n<p>Eine realistischere Simulation kann durch eine stufenweise Erh\u00f6hung der Nutzerzahl erreicht werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">let<\/span> options = {\n  <span class=\"hljs-attr\">stages<\/span>: &#91;\n    { <span class=\"hljs-attr\">duration<\/span>: <span class=\"hljs-string\">'30s'<\/span>, <span class=\"hljs-attr\">target<\/span>: <span class=\"hljs-number\">20<\/span> }, <span class=\"hljs-comment\">\/\/ Langsame Erh\u00f6hung auf 20 VUs<\/span>\n    { <span class=\"hljs-attr\">duration<\/span>: <span class=\"hljs-string\">'1m'<\/span>, <span class=\"hljs-attr\">target<\/span>: <span class=\"hljs-number\">50<\/span> },  <span class=\"hljs-comment\">\/\/ Erh\u00f6hung auf 50 VUs<\/span>\n    { <span class=\"hljs-attr\">duration<\/span>: <span class=\"hljs-string\">'30s'<\/span>, <span class=\"hljs-attr\">target<\/span>: <span class=\"hljs-number\">0<\/span> },  <span class=\"hljs-comment\">\/\/ Reduzierung der Last<\/span>\n  ],\n};\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Test mit Authentifizierung<\/h3>\n\n\n\n<p>Falls eine Java-Webanwendung Authentifizierung ben\u00f6tigt, kann dies durch das Senden eines Tokens in den Headern umgesetzt werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">let<\/span> params = {\n  <span class=\"hljs-attr\">headers<\/span>: {\n    <span class=\"hljs-attr\">Authorization<\/span>: <span class=\"hljs-string\">'Bearer &lt;TOKEN&gt;'<\/span>\n  }\n};\n<span class=\"hljs-keyword\">let<\/span> res = http.get(<span class=\"hljs-string\">'http:\/\/localhost:8080\/protected-endpoint'<\/span>, params);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Analyse der Testergebnisse<\/h2>\n\n\n\n<p>Nach einem Test k\u00f6nnen die Ergebnisse in verschiedenen Formaten ausgegeben werden, z. B. JSON oder CSV:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">k6 run --out json=ergebnisse.json test.js\n<\/code><\/span><\/pre>\n\n\n<p>Zur tiefergehenden Analyse k\u00f6nnen externe Tools wie Grafana und InfluxDB verwendet werden. k6 kann die Daten direkt in InfluxDB speichern:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">k6 run --out influxdb=http:<span class=\"hljs-comment\">\/\/localhost:8086\/k6 test.js<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Diese Daten k\u00f6nnen dann in einem Grafana-Dashboard visualisiert werden.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Integration in CI\/CD-Pipelines<\/h2>\n\n\n\n<p>k6 eignet sich gut f\u00fcr den Einsatz in CI\/CD-Pipelines, z. B. in GitHub Actions oder GitLab CI\/CD:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel f\u00fcr GitHub Actions<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">name<\/span>: Load Test\n\non: push\n\njobs:\n  load-test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v2\n      - name: Install k6\n        run: sudo apt update &amp;&amp; sudo apt install -y k6\n      - name: Run k6 test\n        run: k6 run test.js\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>k6 ist ein leistungsstarkes und flexibles Tool f\u00fcr das Load Testing von Java-Webanwendungen. Es erm\u00f6glicht Entwicklern, Performance-Probleme fr\u00fchzeitig zu erkennen und zu beheben. Durch die einfache Integration in CI\/CD-Pipelines und die Unterst\u00fctzung f\u00fcr externe Analysetools ist k6 eine hervorragende Wahl f\u00fcr automatisierte Lasttests.<\/p>\n\n\n\n<p>Mit den hier gezeigten Beispielen kann man schnell eigene Tests schreiben und ausf\u00fchren, um die Belastbarkeit und Skalierbarkeit einer Java-Webanwendung zu verbessern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einleitung Lasttests (Load Testing) sind essenziell, um die Leistungsf\u00e4higkeit 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\u00e4hige und moderne L\u00f6sung f\u00fcr das Last- und Performance-Testing von Webanwendungen. In diesem Artikel zeigen wir, wie man [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-559","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=559"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/559\/revisions"}],"predecessor-version":[{"id":561,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/559\/revisions\/561"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}