{"id":8030,"date":"2021-09-22T05:12:36","date_gmt":"2021-09-22T05:12:36","guid":{"rendered":"https:\/\/berg-software.com\/?p=8030"},"modified":"2021-09-22T05:15:20","modified_gmt":"2021-09-22T05:15:20","slug":"gatling-leistungstests-integration-gitlab-ci-cd-pipeline","status":"publish","type":"post","link":"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/","title":{"rendered":"Gatling Leistungstests und Integration in die GitLab CI\/CD-Pipeline"},"content":{"rendered":"\n[et_pb_section fb_built=&#8220;1&#8243; fullwidth=&#8220;on&#8220; _builder_version=&#8220;4.4.1&#8243;][et_pb_fullwidth_post_title meta=&#8220;off&#8220; featured_placement=&#8220;background&#8220; _builder_version=&#8220;4.6.6&#8243; title_font=&#8220;||||||||&#8220; title_text_color=&#8220;#ff6317&#8243; title_font_size=&#8220;3.5em&#8220; meta_font=&#8220;|300|||||||&#8220; meta_text_color=&#8220;#ffffff&#8220; meta_font_size=&#8220;1em&#8220; background_enable_color=&#8220;off&#8220; use_background_color_gradient=&#8220;on&#8220; background_color_gradient_start=&#8220;rgba(248,248,248,0.85)&#8220; background_color_gradient_end=&#8220;rgba(248,248,248,0.75)&#8220; background_color_gradient_overlays_image=&#8220;on&#8220; min_height=&#8220;20vh&#8220; height=&#8220;400px&#8220; custom_padding=&#8220;6vh||6vh||false|false&#8220; global_module=&#8220;403&#8243; locked=&#8220;off&#8220;][\/et_pb_fullwidth_post_title][\/et_pb_section][et_pb_section fb_built=&#8220;1&#8243; admin_label=&#8220;intro&#8220; _builder_version=&#8220;4.4.6&#8243; custom_padding=&#8220;|||0px||&#8220; locked=&#8220;off&#8220;][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.4.6&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; hover_enabled=&#8220;0&#8243; border_color_left=&#8220;#ff6317&#8243; sticky_enabled=&#8220;0&#8243;]<p>Wenn CD\/kontinuierliche Entwicklung und Bereitstellung von Funktionen mit sehr hoher Geschwindigkeit erfolgen, ist es entscheidend, dass die Systemleistung innerhalb der definierten Grenzen bleibt. Im Folgenden erfahren Sie, wie wir <a href=\"https:\/\/gatling.io\" target=\"_blank\" rel=\"noopener noreferrer\">Gatling<\/a> Leistungstests entwickelt und in unsere <a href=\"https:\/\/about.gitlab.com\" target=\"_blank\" rel=\"noopener noreferrer\">GitLab<\/a> CI\/CD-Pipeline integriert haben.<\/p>\n[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Dieser Artikel befasst sich mit folgenden Themen:<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<ul>\n<li>Welche Tools f\u00fcr die Durchf\u00fchrung des Leistungstests zu verwenden sind<\/li>\n<li>Wie man den Leistungstest entwickelt<\/li>\n<li>Wie die GitLab-Pipeline eingerichtet wird<\/li>\n<li>Welche Endpunkte auf welcher Infrastruktur getestet werden sollen<\/li>\n<li>Aufbereitung der Daten f\u00fcr die Tests<\/li>\n<\/ul>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2 id=\"introduction\">Einf\u00fchrung<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Dieser Artikel ist ein Leitfaden, der beschreibt, wie wir unsere Leistungstests entwickelt und in unsere CI\/CD-Pipeline integriert haben. Dies ist keineswegs der einzige oder beste Weg &#8211; wir m\u00f6chten lediglich unseren Ansatz und die Herausforderungen, mit denen wir konfrontiert waren, mit Ihnen teilen. [\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Nichtfunktionale Anforderungen<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Jede Anwendung muss bestimmte Anforderungen erf\u00fcllen, die nicht mit den gesch\u00e4ftlichen Erfordernissen zusammenh\u00e4ngen, sondern als Beschr\u00e4nkungen definiert sind, innerhalb derer das System laufen muss. Diese werden als nicht-funktionale Anforderungen bezeichnet. Einige Beispiele: Leistungseinschr\u00e4nkungen, wenn eine bestimmte Anzahl gleichzeitiger Benutzer unterst\u00fctzt werden muss, und die Antwortzeit innerhalb bestimmter Grenzwerte. Andere Beispiele beziehen sich auf die Verf\u00fcgbarkeit des Systems &#8211; in der Regel definiert als prozentualer Anteil der Betriebszeit an der Gesamtzeit, die durch Eins\u00e4tze und Wartung beeinflusst wird. Zuverl\u00e4ssigkeit, Skalierbarkeit und Wartungsfreundlichkeit sind weitere Beispiele.[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Ein paar Worte \u00fcber die zu testende Anwendung<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; hover_enabled=&#8220;0&#8243; border_color_left=&#8220;#ff6317&#8243; sticky_enabled=&#8220;0&#8243;]<p>Bei dem zu testenden System handelt es sich um eine Sammlung von Microservices, die in einer Hochverf\u00fcgbarkeitskonfiguration auf dem <a href=\"https:\/\/about.gitlab.com\" target=\"_blank\" rel=\"noopener noreferrer\">Open Telekom Cloud<\/a> Provider laufen und deren Persistenz durch relationale <a href=\"https:\/\/www.mysql.com\" target=\"_blank\" rel=\"noopener noreferrer\">MySql<\/a>-Datenbanken sichergestellt wird. Die Anwendung ist auch mit anderen Systemen wie <a href=\"https:\/\/www.sap.com\/index.html\" target=\"_blank\" rel=\"noopener noreferrer\">SAP<\/a>, <a href=\"https:\/\/www.salesforce.com\/de\/?ir=1\" target=\"_blank\" rel=\"noopener noreferrer\">SalesForce<\/a> und Enterprise Content Management System \u00fcber Rest-Schnittstellen, Hooks und Dateien verbunden.<\/p>\n<p>Die Server und Dienste werden mithilfe von <a href=\"https:\/\/www.terraform.io\" target=\"_blank\" rel=\"noopener noreferrer\">Terraform<\/a> und <a href=\"https:\/\/www.ansible.com\" target=\"_blank\" rel=\"noopener noreferrer\">Ansible<\/a> \u00fcber einen Infrastructure-as-a-Code-Ansatz aufgesetzt. <a href=\"https:\/\/www.docker.com\" target=\"_blank\" rel=\"noopener noreferrer\">Docker<\/a> wird verwendet, um die Anwendung in mehrere Container zu verpacken.<\/p>\n<p>CI\/CD wird mit GitLab eingerichtet.<\/p>\n<p>Der Tech-Stack besteht haupts\u00e4chlich aus <a href=\"https:\/\/www.java.com\/en\/\" target=\"_blank\" rel=\"noopener noreferrer\">Java<\/a> mit <a href=\"https:\/\/spring.io\/projects\/spring-boot\" target=\"_blank\" rel=\"noopener noreferrer\">SpringBoot<\/a> und <a href=\"https:\/\/hibernate.org\" target=\"_blank\" rel=\"noopener noreferrer\">Hibernate<\/a>, <a href=\"https:\/\/hazelcast.com\" target=\"_blank\" rel=\"noopener noreferrer\">Hazelcast<\/a>, <a href=\"https:\/\/www.jhipster.tech\" target=\"_blank\" rel=\"noopener noreferrer\">JHipster<\/a>, <a href=\"https:\/\/angular.io\" target=\"_blank\" rel=\"noopener noreferrer\">Angular<\/a> mit <a href=\"https:\/\/www.typescriptlang.org\" target=\"_blank\" rel=\"noopener noreferrer\">Typescript<\/a>, sowie <a href=\"https:\/\/www.docker.com\" target=\"_blank\" rel=\"noopener noreferrer\">Docker<\/a> und <a href=\"https:\/\/kubernetes.io\" target=\"_blank\" rel=\"noopener noreferrer\">K8s<\/a>.<\/p>\n[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Was sind Leistungstests?<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Bei den Leistungstests handelt es sich um automatisierte Tests, die mit der zu testenden Anwendung auf einer bestimmten Infrastruktur durchgef\u00fchrt werden, um zu \u00fcberpr\u00fcfen, ob die Leistungsparameter wie Antwortzeit und Durchsatz unter der unterst\u00fctzten Last innerhalb der festgelegten Grenzen bleiben. [\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Verwendete Tools<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; hover_enabled=&#8220;0&#8243; border_color_left=&#8220;#ff6317&#8243; sticky_enabled=&#8220;0&#8243;]<p>F\u00fcr die Durchf\u00fchrung der Leistungstests haben wir <a href=\"https:\/\/gatling.io\" target=\"_blank\" rel=\"noopener noreferrer\">Gatling<\/a> verwendet, weil es einfach zu bedienen ist, sich gut in CI\/CD-Tools und DevOps-Prozesse integrieren l\u00e4sst und sofortige Berichte liefert.<\/p>\n<p>Der in Chrome verf\u00fcgbare Gatling-Recorder wurde manchmal als Ausgangspunkt f\u00fcr die Entwicklung von Testszenarien verwendet.<\/p>\n<p><a href=\"https:\/\/www.scala-lang.org\" target=\"_blank\" rel=\"noopener noreferrer\">Scala<\/a> wurde zum Schreiben der Leistungstestszenarien verwendet und <a href=\"https:\/\/gradle.org\" target=\"_blank\" rel=\"noopener noreferrer\">Gradle<\/a> war unser Build-Tool.<\/p>\n<p><a href=\"https:\/\/www.docker.com\" target=\"_blank\" rel=\"noopener noreferrer\">Docker<\/a> wurde verwendet, um unsere Anwendung als Container zu verpacken, und <a href=\"https:\/\/about.gitlab.com\" target=\"_blank\" rel=\"noopener noreferrer\">Gitlab<\/a> wurde f\u00fcr die CI\/CD-Pipelines mit unseren konfigurierten Runnern verwendet.<\/p>\n<p>Zur Vorbereitung der Testdaten verwendeten wir das <a href=\"https:\/\/spockframework.org\" target=\"_blank\" rel=\"noopener noreferrer\">Spock-Framework<\/a> mit in <a href=\"https:\/\/groovy.apache.org\" target=\"_blank\" rel=\"noopener noreferrer\">Groovy<\/a> geschriebenen Testszenarien.<\/p>\n[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Warum sollten Leistungstests in die CI\/CD-Pipeline integriert werden?<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Es ist wichtig sicherzustellen, dass die Systemleistung innerhalb der definierten Grenzen bleibt, wenn die kontinuierliche Entwicklung und Bereitstellung von Funktionen mit einer sehr hohen Geschwindigkeit erfolgt.<\/p>\n<p>Wenn die Tests fehlschlagen, wissen wir, dass ein Teil des neuen Codes die Leistungsbeschr\u00e4nkungen verletzt hat. Grunds\u00e4tzlich werden die automatischen Leistungstests bei jeder Zusammenf\u00fchrung eines Funktionszweigs mit bestimmten Umgebungszweigen durchgef\u00fchrt. Auf diese Weise haben wir die Gewissheit, dass die Leistung f\u00fcr die sensiblen oder abgedeckten Szenarien nicht beeintr\u00e4chtigt wurde, bevor die neue Version in der Produktion eingesetzt wird.<\/p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2 id=\"introductiontogatling\">Einf\u00fchrung in Gatling<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Aufnahme-Modus<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Der Rekorder kann \u00fcber das Gatling-Bundle gestartet werden. Er fungiert als Proxy zwischen dem Browser und dem Server. [\/et_pb_text][et_pb_gallery gallery_ids=&#8220;7987&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Im Rekorder m\u00fcssen Sie den lokalen Proxy-Port festlegen, mit dem sich der Browser verbinden muss. Der n\u00e4chste Schritt besteht darin, den Proxyserver so einzustellen, dass er \u00fcber den localhost und den oben definierten Port auf das Internet zugreift. In Chrome sollten Sie zu Einstellungen-&gt;Erweitert-&gt;System-&gt;\u00d6ffnen Sie Ihren Computer Proxy-Einstellungen-&gt;Verwenden Sie einen Proxy-Server navigieren und die folgenden Einstellungen eingeben.[\/et_pb_text][et_pb_gallery gallery_ids=&#8220;7989&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Dieser Bildschirm h\u00e4ngt von dem verwendeten Betriebssystem ab. Danach sollte sich der Browser mit diesem Port verbinden.<\/p>\n<p>W\u00e4hrend der Benutzer im Browser navigiert, zeichnet der Rekorder die Anfrage auf, pausiert und generiert am Ende den Simulationscode. Es gibt Filter, die definiert werden k\u00f6nnen, um bestimmte Anfragen herauszufiltern &#8211; zum Beispiel alle Anfragen nach css-Dateien. Au\u00dferdem k\u00f6nnen SSL-Zertifikate f\u00fcr den https-Modus bereitgestellt oder on the fly generiert werden.<\/p>\n<p>Der generierte Code kann als Ausgangspunkt f\u00fcr die Entwicklung der Leistungssimulation verwendet werden, muss aber \u00fcberarbeitet werden, um wartbarer zu sein, nicht ben\u00f6tigte Anfragen zu ignorieren und die richtigen Korrelationen und Abstraktionen herzustellen.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Simulationen<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Der Einstiegspunkt eines Leistungstests ist eine Simulation. In einem einzigen Durchlauf k\u00f6nnen die auszuf\u00fchrenden Simulationen konfiguriert werden. Die Simulation ist das \u00c4quivalent zu einem Testfall in der beliebten Junit-Bibliothek. Sie verf\u00fcgt \u00fcber Setup- und Teardown-Methoden, aber auch \u00fcber Hilfsmethoden zur Durchf\u00fchrung von Assertions und zur Speicherung globaler Werte.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family: monospace;\">class MyInteractionsTest extends Simulation {\n \n  val context: LoggerContext = LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext]\n  \/\/ Log all HTTP requests\n  context.getLogger(\"io.gatling.http\").setLevel(Level.valueOf(\"TRACE\"))<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Wir haben eine Simulation definiert, indem wir die Basisklasse erweitert haben, und die Protokollierung so eingerichtet, dass der Inhalt aller http-Anfragen verfolgt werden kann.[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">val httpConf = http\n  .baseUrl(PerfConstants.baseURLServer)\n  .inferHtmlResources()\n  .header(\"Origin\", PerfConstants.baseURLServerWeb)\n  .acceptHeader(\"application\/json, text\/plain, application\/hal+json, application\/problem+json, *\/*\")\n  .acceptEncodingHeader(\"gzip, deflate\")\n  .acceptLanguageHeader(\"en,en-US;q=0.9,ro-RO;q=0.8,ro;q=0.7,de;q=0.6\")\n  .connectionHeader(\"keep-alive\")\n  .userAgentHeader(\"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/71.0.3578.98 Safari\/537.36\")\n  .disableWarmUp\n  .silentResources \/\/ Silence all resources like css or css so they don't clutter the results<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Hier konfigurieren wir das http-Protokoll. Wir richten die http-Header mit den erwarteten Werten ein und simulieren die Browseranfragen. Der Origin-Header wird auf die angegebene Server-URL gesetzt, um CORS-Probleme zu vermeiden. Die statischen Ressourcen, wie z. B. css-Dateien, und ihre Fehler erzeugen eine Menge L\u00e4rm, so dass wir die Berichterstattung f\u00fcr sie \u00fcber das silentResources-Flag deaktivieren wollen.<\/p>\n<p>Das Ableiten der Html-Ressourcen bedeutet, dass das Verhalten des Browsers beim asynchronen Laden der eingebetteten Ressourcen wie Skripte, Links, Bilder, Frames, Objekte usw. nachgeahmt werden soll.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family: monospace;\">val headers_http_authenticated = Map(\n  \"Content-Type\" -&gt; \"\"\"application\/json\"\"\",\n  \"Accept\" -&gt; \"\"\"application\/json, application\/hal+json, application\/problem+json\"\"\",\n  \"Authorization\" -&gt; \"${access_token}\",\n)<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>F\u00fcr verschiedene Anfragen ben\u00f6tigen wir m\u00f6glicherweise unterschiedliche Kopfzeilen. Die obige Variable enth\u00e4lt die Header f\u00fcr eine authentifizierte Anfrage. Das Zugriffs-Token wird als Wert f\u00fcr den Autorisierungs-Header bereitgestellt. Das Token wurde zuvor bei einer Anmeldeanfrage in einer virtuellen Benutzersitzung \u00fcber einen Mechanismus namens Checks gespeichert. Die Checks werden verwendet, um die Anfragen zu validieren und Werte zu extrahieren, die sp\u00e4ter wiederverwendet werden k\u00f6nnen.<\/p>\n<p>Eine solche Login-Anfrage kann wie folgt aussehen:<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family: monospace;\">object Login {\n \n  val headers_http_authentication = Map(\n    \"Content-Type\" -&gt; \"\"\"application\/json\"\"\",\n    \"Accept\" -&gt; \"\"\"application\/json, application\/hal+json, application\/problem+json\"\"\",\n  )\n \n  val login =\n    exec(http(\"Authentication\")\n      .post(\"\/auth\/token\")\n      .headers(headers_http_authentication)\n      .body(StringBody(\"\"\"{\"username\":\"adm@project.com\", \"password\":\"*****\"}\"\"\"))\n      .check(status.is(PerfConstants.HTTP_STATUS_OK))\n      .check(header(\"Authorization\").saveAs(\"access_token\"))\n    ).exitHereIfFailed\n}<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Es gibt ein Login-Anforderungsobjekt mit einer Kopfzeile f\u00fcr nicht authentifizierte Benutzer, die keine Token enth\u00e4lt.<\/p>\n<p>\u00dcber die exec-Methode wird ein http-Post-Aufruf an den Endpunkt \/auth\/token ausgef\u00fchrt, der die Anmeldedaten im Body enth\u00e4lt. Die Pr\u00fcfkonstrukte validieren den Antwortstatus und speichern das zur\u00fcckerhaltene Zugriffstoken in der Kopfzeile der Autorisierungsantwort.<\/p>\n<p>Die Anfrage kann als Teil eines Szenarios \u00fcber eine fluent api ausgef\u00fchrt werden:<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">val scn = scenario(\"My interactions\")\n   .exec(Login.login).exitHereIfFailed<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]In einem typischen Szenario werden viele Anfragen nacheinander definiert.[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">val scn = scenario(\"My interactions\")\n  .exec(http(\"First unauthenticated request\")\n    .get(\"\/auth\/user\")\n    .headers(headers_http)\n    .check(status.is(401))\n  ).exitHereIfFailed\n  .pause(3)\n  .exec(Login.login\n  ).exitHereIfFailed\n  .pause(2)\n  .exec(http(\"Authenticated request\")\n    .get(\"\/auth\/user\")\n    .headers(headers_http_authenticated)\n    .check(status.is(200)))\n  .pause(3)\n  .exec(NavigationTree.navigationTree)\n  .exec(MyInteractions.myInteractions)<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Nach jeder Anfrage k\u00f6nnen Pr\u00fcfungen durchgef\u00fchrt werden, die bei Nichterf\u00fcllung der Bedingungen abgebrochen werden. Es k\u00f6nnen auch Pausen eingef\u00fcgt werden, um einen menschlichen Benutzer zu simulieren.<\/p>\n<p>Die anderen Szenario-Anfragen sehen \u00e4hnlich aus wie die Login-Anfrage, verwenden aber andere http-Methoden und Pr\u00fcfungen.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">val navigationTree =\n  exec(http(\"Navigation EndPoints\")\n    .get(PerfConstants.baseURLServer + \" \/navigationTree \")\n    .headers(headers_http_authenticated)\n    .check(status.is(PerfConstants.HTTP_STATUS_OK))\n    .check(jsonPath(\"$.mainObjects[0].mainObject.aid\").saveAs(\"firstOrder\")))\n    .pause(PerfConstants.PAUSE_BETWEEN_REQ_IN_SEC)<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>F\u00fcr einen authentifizierten Benutzer wird eine get-Anfrage durchgef\u00fchrt, und der Wert aus der geparsten json-Antwort wird in der virtuellen Sitzungsvariablen namens firstOrder gespeichert.<\/p>\n<p>Jedes Szenario hat eine Einrichtungsphase, in der die Anzahl der gleichzeitigen Benutzer und die Anlaufzeit festgelegt werden.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family: monospace;\">setUp(scn.inject(rampUsers(20) during (2 seconds))).protocols(httpConf)<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>In unserem Fall f\u00fchren 20 Benutzer dasselbe Szenario aus, und alle beginnen im Abstand von 2 Sekunden mit der Erstellung der ersten Anfrage. Das bedeutet, dass nach zwei Sekunden mindestens 20 Anfragen in Bearbeitung sein werden.<\/p>\n<p>Die Ausf\u00fchrung des Szenarios beginnt mit dem Konstrukt:<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">scenario(\"My navigation\").exec(scn)<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Erwartete Schwellenwerte<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Erwartete Antwort-\/Zeitschwellenwerte k\u00f6nnen global f\u00fcr alle Anfragen oder Szenarien, aber auch f\u00fcr einzelne Anfragen festgelegt werden. Die Werte m\u00fcssen auch die Infrastruktur ber\u00fccksichtigen, auf der die Tests laufen, und m\u00fcssen entsprechend angepasst werden. In der Regel ist die Produktionsinfrastruktur leistungsf\u00e4higer als die der anderen Umgebungen. Es war keine leichte Aufgabe, die richtigen Werte zu definieren, die uns auch die erwarteten Werte in der Produktion liefern.<\/p>\n<p>In der Phase der Szenarioeinrichtung werden auch die erwarteten Schwellenwerte definiert:<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">setUp(scn.inject(rampUsers(20) during (2 seconds))).protocols(httpConf)\n  \/\/ Assert that every request has no more than 1% of failing requests\n  .assertions(forAll.failedRequests.percent.lte(1))\n  \/\/ Assert that the max response time of all requests is less than 5000 ms\n  .assertions(global.responseTime.max.lt(PerfConstants.MAX_RESPONSE_TIME_MS))\n  \/\/ Assert that the max response time of authentication requests is less than 3000 ms\n  .assertions(details(\"Authentication\").responseTime.max.lt(PerfConstants.MAX_RESPONSE_TIME_AUTH_MS))\n  \/\/ Assert that the max response time of the navigation tree requests is less than 5000 ms\n  .assertions(details(\"Navigation tree\").responseTime.max.lt(PerfConstants.MAX_RESPONSE_TIME_MS))\n  \/\/ Assert that the max response time of the my interactions requests is less than 5000 ms\n  .assertions(details(\"My interactions\").responseTime.max.lt(PerfConstants.MAX_RESPONSE_TIME_MS))<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Mit dem Konstrukt forAll kann man Assertions f\u00fcr alle Anforderungen bestimmter Typen durchf\u00fchren, z.B. f\u00fcr fehlgeschlagene Anforderungen.<\/p>\n<p>Behauptungen k\u00f6nnen auch f\u00fcr alle Anfragen eines beliebigen Typs mit dem Konstrukt global gemacht werden.<\/p>\n<p>F\u00fcr eine bestimmte Anforderung, die durch den Pfad identifiziert wird, k\u00f6nnen Aussagen mit der Anweisung details(&#8222;request group \/ request path&#8220;) gemacht werden.<\/p>\n<p>Weitere Aussagen k\u00f6nnen \u00fcber Metriken wie die Anzahl der erfolgreichen Anfragen oder die Anzahl der Anfragen pro Sekunde gemacht werden. Zum Vergleich stehen Z\u00e4hl- oder Prozentwerte zur Verf\u00fcgung, wobei mehrere Bedingungen miteinander verkettet werden k\u00f6nnen. Vergleichsoperatoren wie between, around und deviatesAround(target, percent) sind verf\u00fcgbar.<\/p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2 id=\"setupthegitlabpipeline\">Einrichten der GitLab-Pipeline<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Die Pipeline wird in der Datei .gitlab-ci.yml konfiguriert, die sich im Stamm des Leistungstestprojekts befindet.<\/p>\n<p>Es gibt eine einzige Stufe namens test.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">stages:\n  - test<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Zu verwendendes Docker-Image<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Eine Herausforderung bestand darin, ein Docker-Image zu finden, das alle ben\u00f6tigten Scala- und Gatling-Bibliotheken enth\u00e4lt und ohne gro\u00dfen Aufwand verwendet werden kann. Der Gitlab-Runner sollte in der Lage sein, dieses Image zu ziehen, den Code auszuchecken und die Tests \u00fcber ein Bash-Skript zu starten.<\/p>\n<p>Nach mehreren Versuchen haben wir das Image koosiedemoer\/netty-tcnative-alpine gefunden, das in unserer Umgebung funktioniert.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">perftest-master:\n  image: koosiedemoer\/netty-tcnative-alpine\n  stage: test<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Ausl\u00f6ser der Ausf\u00fchrung<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Es gibt zwei Ereignisse, die die Ausf\u00fchrung der Leistungstests ausl\u00f6sen.<\/p>\n<p>Das eine Ereignis ist die \u00dcbergabe des Leistungstestprojekts an unseren Master-Zweig.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">perftest-master:\n\u2026\n  only:\n    - master\n  except:\n    variables:\n      - $EXECUTE_TEST_FOR_ENVIRONMENT =~ \/^TEST\/<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Der Schritt wird nur auf dem Master-Zweig ausgef\u00fchrt, wenn die Umgebungsvariable EXECUTE_TEST_FOR_ENVIRONMENT nicht definiert ist oder nicht mit TEST beginnt. Die Variable wird verwendet, um festzustellen, ob ein externer Ausl\u00f6ser die Ausf\u00fchrung verursacht hat &#8211; f\u00fcr den Fall, dass wir eine andere Aktion\/Konfiguration durchf\u00fchren m\u00fcssen.<\/p>\n<p>Das andere Ereignis tritt ein, wenn es extern nach einem bestimmten Schritt in einer anderen Projektpipeline aufgerufen wird.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">perftest-master:\n  stage: perftest\n  image: registry.gitlab.com\/finestructure\/pipeline-trigger\n  script:\n    - apk --no-cache add bash curl\n    - .\/ci\/bin\/perf-trigger.sh\n  tags:\n    - perftrigger\n  only:\n    - master<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>In einem Microservice-Projekt wird in der gitlab ci-Pipeline-Konfigurationsdatei eine perftest-Phase definiert, die das pipeline-trigger-Docker-Image abruft, die erforderlichen Pakete installiert und das ausgecheckte Skript perf-trigger.sh ausf\u00fchrt.<\/p>\n<p>Dieser Schritt wird nur ausgef\u00fchrt, wenn ein Commit auf dem Master-Branch vorliegt, und erst nachdem die vorherigen Pipeline-Stufen ausgef\u00fchrt wurden.<\/p>\n<p>Die Bash-Datei enth\u00e4lt etwas wie:<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">trigger -a ${APP_GITLABTRIGGER_APITOKEN} -p ${APP_GITLABTRIGGER_PERFTESTTOKEN} -t ${branch} ${APP_GITLABTRIGGER_PERFTESTID} -e EXECUTE_TEST_FOR_ENVIRONMENT=TEST<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Das Docker-Image enth\u00e4lt den Trigger-Befehl, bei dem Gitlab-Tokes bereitgestellt werden, die Ziel-Pipeline, den Zweig und die Umgebungsvariablen.<\/p>\n<p>Im Leistungstestprojekt kann eine weitere Stufe nur f\u00fcr den externen Ausl\u00f6ser definiert werden.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">perftest-master-ext:\n\u2026\nonly:\n    - master\nonly:\n  variables:\n    - $EXECUTE_TEST_FOR_ENVIRONMENT =~ \/^TEST\/<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Dieses Mal erfolgt die Ausf\u00fchrung nur, wenn die Verzweigung Master ist und die Variable mit dem angegebenen Wert versehen ist.[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Einrichtung der Ausf\u00fchrung<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">perftest-master:\n\u2026\n  script:\n    - apk --no-cache add bash\n    - .\/bin\/testperf.sh \"https:\/\/apistage.domain.net\"\n  tags:\n    - perftests\n  artifacts:\n    when: always\n    paths:\n      - build\/reports\/gatling\/*\n    expire_in: 1 week\n\u2026<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Im Skriptabschnitt werden die fehlenden Pakete im laufenden Container installiert und die Bash-Datei testperf.sh wird unter Angabe der Stage-Umgebung als Basis-API-URL ausgef\u00fchrt.<\/p>\n<p>Der Tag identifiziert das Label f\u00fcr den Gitlab-Runner, der die Tests ausf\u00fchren wird.<\/p>\n<p>Der Abschnitt artifacts konfiguriert das Ziel f\u00fcr die Speicherung der Berichte und wie lange sie zum Herunterladen zur Verf\u00fcgung stehen sollen.<\/p>\n<p>Die Bash-Datei startet den gradle-Befehl zur Ausf\u00fchrung des Tests in der angegebenen Umgebung:<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">.\/gradlew gatlingRun -DbaseURL=]<\/pre>[\/et_pb_text][et_pb_text admin_label=&#8220;in the gradle.build&#8220; _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>In der gradle.build-Datei verwenden wir das Gatling-Plugin und konfigurieren, welche Tests ausgef\u00fchrt und wo die Berichte gespeichert werden sollen, wie im Folgenden dargestellt:<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">plugins {\n   id \"com.github.lkishalmi.gatling\" version \"3.0.2\"\n}\n\u2026\napply plugin: \"com.github.lkishalmi.gatling\"\n..\ngatling {\n\u2026\n\tsimulations = { include \"**\/*Test.scala\" }\n}\ntask testReport(type: TestReport) {\n    destinationDir = file(\"$buildDir\/reports\/tests\")\n    reportOn test\n}\n\u2026<\/pre>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2 id=\"preparing_the_data_and_the_infrastructure\">Vorbereitung der Daten und der Infrastruktur f\u00fcr die Durchf\u00fchrung der Tests<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Auf welchen Systemen sollen die Tests ausgef\u00fchrt werden?<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Es gibt mindestens zwei M\u00f6glichkeiten, dies zu tun. Eine M\u00f6glichkeit besteht darin, eine neue Umgebung einzurichten und die Anwendung in dieser sauberen Umgebung mit einer genau definierten Konfiguration und Kapazit\u00e4t einzusetzen. Eine andere M\u00f6glichkeit besteht darin, den Leistungstest in einer bestehenden Umgebung mit fester Kapazit\u00e4t und bekannter Konfiguration durchzuf\u00fchren.<\/p>\n<p>Sie k\u00f6nnen die Tests auch von Zeit zu Zeit in der Produktionsumgebung durchf\u00fchren, wenn Sie es sich leisten k\u00f6nnen, sie zu skalieren oder ein Zeitfenster (Wartungsfenster) zu finden, in dem die Benutzer nicht gest\u00f6rt werden.<\/p>\n<p>Wir haben uns daf\u00fcr entschieden, die Leistung mit unserer Staging-Umgebung zu testen, da diese mit unserer Produktionsumgebung vergleichbar ist und wir nicht darauf warten wollten, eine weitere saubere Umgebung zu erstellen. Au\u00dferdem werden die Produktionsbenutzer durch die h\u00e4ufige Ausf\u00fchrung der Tests nicht beeintr\u00e4chtigt.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Welche Endpunkte sind zu testen?<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Jede Anwendung hat ihre eigenen Besonderheiten und l\u00f6st klare Gesch\u00e4ftsanforderungen. Die am h\u00e4ufigsten verwendeten Gesch\u00e4ftsszenarien m\u00fcssen getestet werden, um sicherzustellen, dass die Anwendung innerhalb der vereinbarten Leistungsparameter bleibt. Au\u00dferdem m\u00fcssen die Aktivit\u00e4ten ber\u00fccksichtigt werden, die die Leistung am st\u00e4rksten beeintr\u00e4chtigen k\u00f6nnen.<\/p>\n<p>Ein anderer Ansatz w\u00e4re die Verwendung von \u00dcberwachungswerkzeugen, um die Benutzeraktivit\u00e4ten zu verfolgen und dann die kritischen Punkte und die Antwortzeiten der Anwendung zu analysieren, um zu entscheiden, welche Leistungstests geschrieben werden sollen.<\/p>\n<p>Wir haben beide Ans\u00e4tze angewandt und gute Kandidaten identifiziert, wie z. B. die Authentifizierungsendpunkte, die Berechtigungspr\u00fcfung, einige umfangreiche Ressourcenlisten und Teile der Gesch\u00e4ftslogik.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font=&#8220;|600|||||||&#8220; header_3_font_size=&#8220;1.2em&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||5px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h3>Auff\u00fcllen der Daten<\/h3>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Bei den Daten f\u00fcr den Leistungstest kann es sich um ein Backup der Produktionsdatenbank handeln, das in angemessener Zeit wiederhergestellt werden kann.<\/p>\n<p>Falls eine bestehende Umgebung f\u00fcr die Durchf\u00fchrung des Leistungstests verwendet wird, k\u00f6nnen sich einige Testbenutzer authentifizieren und die Szenarien durchf\u00fchren.<\/p>\n<p>In unserem Fall verwenden wir die von unseren Integrationstests erstellten Testbenutzer und Daten. Dies ist eine Voraussetzung. Unsere Integrationstests werden in Groovy unter Verwendung des Spook-Frameworks entwickelt und f\u00fchren http-Anfragen aus, die unsere REST-APIs aufrufen, um die Daten aufzuf\u00fcllen.<\/p>\n<p>Spook-Tests k\u00f6nnen wie die beliebten JUnit-Tests geschrieben werden. Es gibt eine Basisklasse namens Specification, die erweitert werden kann und Hilfsmethoden f\u00fcr Mocking, Stubbing und Spying bietet. Sie ist \u00e4quivalent zu einem Testfall von Junit.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">class BaseSpec extends Specification {\n&nbsp;\n@Shared\npublic static HttpBuilder client<\/pre>[\/et_pb_text][et_pb_text admin_label=&#8220;in the gradle.build&#8220; _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>F\u00fcr die Ausf\u00fchrung der API-Aufrufe wird eine Art Groovy-Http-Client verwendet. Der Client wird mit einer Hilfsserialisierungsbibliothek namens JsonSlurper konfiguriert. Die Methoden k\u00f6nnen der Reihe nach ausgef\u00fchrt werden, wenn wir die @Stepwise-Annotation verwenden.<\/p>\n<p>Es gibt Setup- und Cleanup-Methoden, die vor jeder Testmethode ausgef\u00fchrt werden, und setupSpec und cleanupSpec, die vor und nach jeder Spezifikation ausgef\u00fchrt werden.<\/p>\n<p>Ein Beispiel f\u00fcr die setup-Methode kann den http-Client initialisieren und den Admin-Benutzer anmelden.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">def setupSpec() {\n    client = HttpBuilder.configure {\n    request.uri = BASE_URL_SERVER\n    request.setContentType('application\/json')\n    response.success { resp, data -&gt;\n     if (data != null){\n     }\t\n    }\n    \u2026\n    loginAs(admin)\n}<\/pre>[\/et_pb_text][et_pb_text admin_label=&#8220;in the gradle.build&#8220; _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Eine Testmethode wird im Stil der verhaltensgesteuerten Entwicklung mit der Struktur gegeben-wenn-dann geschrieben.[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">def 'give ROLE_ADMIN privilege to the user'() {\n    given: 'a valid ADMIN privilege'\n    def privilege = [\n            scope   : 'RESOURCE',\n            key     : 'ROLE_ADMIN',\n            user    : [\n                    aid: userAid\n            ],\n            role    : [\n                    aid: ROLE_ADMIN_LICENSE\n            ],\n            resource: [\n                    aid: ROOT_COMPANY_AID\n            ]\n    ]\n&nbsp;\n    when: 'I post the privilege'\n    def response = client.post {\n        request.uri.path = '\/privileges'\n        request.body = privilege\n    }\n&nbsp;\n    then: 'the privilege was created'\n    assertResponseStatus(response, 201)\n}\n&nbsp;<\/pre>[\/et_pb_text][et_pb_text admin_label=&#8220;in the gradle.build&#8220; _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Es wird eine privilegierte Anfrage erstellt und ein http POST an den Server gesendet. Am Ende wird der 201-http-Status gepr\u00fcft, es kann aber auch die Struktur der Antwort gepr\u00fcft werden.<\/p>\n<p>Mehrere Spezifikationen k\u00f6nnen in einer Testsuite gruppiert und auf einmal ausgef\u00fchrt werden.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">@RunWith(Suite.class)\n@Suite.SuiteClasses(\n        [\n                AnInitTestSuiteSpec,\n                AnotherWorkflowSpec\n\t]\n)\nclass TestSuite {\n}<\/pre>[\/et_pb_text][et_pb_text admin_label=&#8220;in the gradle.build&#8220; _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Der gradle build-Teil zur Ausf\u00fchrung der Testsuiten ist einfach und kann zus\u00e4tzliche Parameter \u00fcbergeben:[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">test{\n    systemProperty \"target\", findProperty(\"target\")\n    systemProperty \"targetServer\", findProperty(\"targetServer\")\n    testLogging {\n        exceptionFormat = 'full'\n    }\n    filter {\n        \/\/specific test method\n        includeTestsMatching \"specs.TestSuite\"\n    }\n}<\/pre>[\/et_pb_text][et_pb_text admin_label=&#8220;in the gradle.build&#8220; _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Zusammenfassend l\u00e4sst sich sagen, dass eine Testsuite, die unsere Leistungstestdaten erstellt, f\u00fcr uns funktioniert.[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2 id=\"performance_tests_reports\">Berichte \u00fcber Leistungstests<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Gatling erstellt nach der Ausf\u00fchrung der Szenarien eine Reihe von Berichten. In den Diagrammen k\u00f6nnen wir Dinge wie Antwortzeit, Anfragen pro Sekunde, Durchsatz, mittlere Zeiten und Perzentile \u00fcber Zeit und Benutzer verteilt sehen. Mit einigen der Diagramme kann man interagieren und zus\u00e4tzliche Informationen als Tooltip anzeigen oder das Zeitintervall vergr\u00f6\u00dfern und verkleinern. Im Folgenden werde ich einige davon anhand verschiedener Szenarien erl\u00e4utern.<\/p>[\/et_pb_text][et_pb_gallery gallery_ids=&#8220;7991&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Hier haben wir ein Szenario mit etwa 200 Anfragen von 20 Benutzern durchgef\u00fchrt. Alle waren erfolgreich, etwa 75 wurden unter 800 ms ausgef\u00fchrt, 25 Anfragen lagen zwischen 800 ms und 1200 ms, w\u00e4hrend der Rest, etwa 95, \u00fcber 1200 ms lag.[\/et_pb_text][et_pb_gallery gallery_ids=&#8220;7993&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]In den Szenarien k\u00f6nnen wir Leistungsanforderungen definieren, die in der obigen Tabelle gepr\u00fcft und gemeldet werden. Innerhalb eines Szenarios wurden mehrere Anfragen ausgef\u00fchrt, und wir definierten die Einschr\u00e4nkung, dass maximal 1 % der Anfragen verschiedener Typen fehlschlagen d\u00fcrfen. Eine weitere Bedingung war, dass die maximale Antwortzeit f\u00fcr jede Anfrage unter 15 Sekunden liegen sollte. Au\u00dferdem haben wir f\u00fcr bestimmte Anfragen festgelegt, dass die Antwortzeit unter 15 Sekunden liegen muss. Wir k\u00f6nnen sehen, dass einige der Behauptungen fehlgeschlagen sind. [\/et_pb_text][et_pb_gallery gallery_ids=&#8220;7995&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Wir k\u00f6nnen jede Anfrage benennen und die minimale, die mittlere und die maximale Zeit f\u00fcr jede Anfrage angeben lassen, kategorisiert in Perzentilen aller Anfragen. Hier haben 2 Benutzer das Szenario parallel ausgef\u00fchrt, mit den oben genannten Schritten.[\/et_pb_text][et_pb_gallery gallery_ids=&#8220;7997&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Wir k\u00f6nnen sehen, dass alle 50 Benutzer das Szenario nach ein oder zwei Sekunden aktiv durchlaufen und die Aktivit\u00e4t nach 20 Sekunden beendet haben.[\/et_pb_text][et_pb_gallery gallery_ids=&#8220;7999&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Das obige Diagramm zeigt den prozentualen Anteil der Antwortzeiten, verteilt auf Zeitspannen in Millisekunden.<\/p>\n<p>So ist beispielsweise zu erkennen, dass 17 % der Anfragen rund 265 ms ben\u00f6tigten.<\/p>[\/et_pb_text][et_pb_gallery gallery_ids=&#8220;8001&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>An einem bestimmten Punkt des obigen Diagramms k\u00f6nnen wir die Prozents\u00e4tze der laufenden Anfragen und ihre Antwortzeit in ms sehen. Wir k\u00f6nnen das Zeitintervall vergr\u00f6\u00dfern und verkleinern.<\/p>[\/et_pb_text][et_pb_gallery gallery_ids=&#8220;8003&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Maximal 40 Anfragen pro Sekunde wurden von 50 parallelen Nutzern \u00fcber einen Zeitraum von 24 Sekunden ausgef\u00fchrt, mit einigen Spitzen von 25 Anfragen pro Sekunde hier und da. Sie k\u00f6nnen das Zeitintervall am unteren Rand des Diagramms \u00e4ndern.[\/et_pb_text][et_pb_gallery gallery_ids=&#8220;8005&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;65%&#8220; module_alignment=&#8220;left&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]50 Benutzer, die in 2 Sekunden hochgefahren sind, haben das gleiche Szenario in 24 Sekunden ausgef\u00fchrt. Die Anzahl der abgeschlossenen Antworten im Laufe der Zeit wurde oben angegeben. [\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||0px||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2>Schlussfolgerungen<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Es war eine Herausforderung, Leistungstests regelm\u00e4\u00dfig in die CI\/CD-Pipeline zu integrieren und durchzuf\u00fchren. Wir haben hier \u00fcber einen Weg berichtet, der f\u00fcr uns funktioniert hat. Wir haben auch die Herausforderungen, mit denen wir konfrontiert waren, sowie die verwendeten Tools angesprochen. Au\u00dferdem haben wir versucht Einblick in die Art und Weise, wie wir die Tests schreiben und wie wir die Daten f\u00fcr sie vorbereiten, zu gew\u00e4hren. Wir hoffen, dass die von uns bereitgestellten Informationen f\u00fcr Sie hilfreich waren!<br> Sollten Sie Fragen haben, freuen wir uns auf Ihre Kontaktaufnahme unter <a href=\"mailto:contact@bergsoftprod.wpengine.com\">contact@bergsoftprod.wpengine.com<\/a>.<\/p>\n<p>***<\/p>\n<p>Und wie machen <strong>Sie<\/strong> das? <a href=\"https:\/\/berg-software.com\/de\/kontakt-berg-software\/\">M\u00f6chten Sie Ihre L\u00f6sung mit uns teilen?<\/a><\/p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8220;1&#8243; _builder_version=&#8220;4.4.1&#8243; custom_padding=&#8220;|||0px||&#8220; locked=&#8220;off&#8220;][et_pb_row use_custom_gutter=&#8220;on&#8220; gutter_width=&#8220;3&#8243; admin_label=&#8220;\uff3f&#8220; _builder_version=&#8220;4.4.6&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;4vh||8vh||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.6&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2>\uff3f<\/h2>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8220;1&#8243; _builder_version=&#8220;3.22&#8243; background_color=&#8220;#eeeeee&#8220; custom_padding=&#8220;50px||50px||false|false&#8220; border_color_top=&#8220;#ff6317&#8243; global_module=&#8220;1642&#8243;][et_pb_row column_structure=&#8220;1_3,1_3,1_3&#8243; _builder_version=&#8220;4.4.1&#8243; custom_padding=&#8220;0px|||||&#8220; locked=&#8220;off&#8220;][et_pb_column type=&#8220;1_3&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_social_media_follow _builder_version=&#8220;4.4.4&#8243; text_orientation=&#8220;left&#8220;][et_pb_social_media_follow_network social_network=&#8220;linkedin&#8220; url=&#8220;https:\/\/www.linkedin.com\/company\/berg-computers-srl\/&#8220; _builder_version=&#8220;4.4.4&#8243; background_color=&#8220;#007bb6&#8243; follow_button=&#8220;off&#8220; url_new_window=&#8220;on&#8220;]linkedin[\/et_pb_social_media_follow_network] [et_pb_social_media_follow_network social_network=&#8220;twitter&#8220; url=&#8220;https:\/\/twitter.com\/berg_software&#8220; _builder_version=&#8220;4.4.4&#8243; background_color=&#8220;#00aced&#8220; follow_button=&#8220;off&#8220; url_new_window=&#8220;on&#8220;]twitter[\/et_pb_social_media_follow_network] [et_pb_social_media_follow_network social_network=&#8220;facebook&#8220; url=&#8220;https:\/\/www.facebook.com\/bergCOMPUTERS&#8220; _builder_version=&#8220;4.4.4&#8243; background_color=&#8220;#3b5998&#8243; follow_button=&#8220;off&#8220; url_new_window=&#8220;on&#8220;]facebook[\/et_pb_social_media_follow_network] [et_pb_social_media_follow_network social_network=&#8220;instagram&#8220; url=&#8220;https:\/\/www.instagram.com\/berg_software\/&#8220; _builder_version=&#8220;4.4.4&#8243; background_color=&#8220;#ea2c59&#8243; follow_button=&#8220;off&#8220; url_new_window=&#8220;on&#8220;]instagram[\/et_pb_social_media_follow_network][\/et_pb_social_media_follow][\/et_pb_column][et_pb_column type=&#8220;1_3&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_post_nav in_same_term=&#8220;on&#8220; show_next=&#8220;off&#8220; _builder_version=&#8220;4.4.1&#8243; title_text_color=&#8220;#ff6317&#8243; custom_padding=&#8220;|25px|||false|false&#8220;][\/et_pb_post_nav][\/et_pb_column][et_pb_column type=&#8220;1_3&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_post_nav in_same_term=&#8220;on&#8220; show_prev=&#8220;off&#8220; _builder_version=&#8220;4.4.1&#8243; title_text_color=&#8220;#ff6317&#8243; custom_padding=&#8220;|||25px|false|false&#8220;][\/et_pb_post_nav][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8220;1&#8243; admin_label=&#8220;CONTACT&#8220; _builder_version=&#8220;4.4.1&#8243; background_color=&#8220;#d2d2d2&#8243; custom_padding=&#8220;75px||75px||false|false&#8220; global_module=&#8220;1544&#8243;][et_pb_row column_structure=&#8220;1_4,3_4&#8243; admin_label=&#8220;Service Section Title&#8220; _builder_version=&#8220;4.4.1&#8243; custom_padding=&#8220;||25px||false|false&#8220; animation_direction=&#8220;top&#8220; locked=&#8220;off&#8220;][et_pb_column type=&#8220;1_4&#8243; _builder_version=&#8220;3.25&#8243; custom_padding=&#8220;|||&#8220; custom_padding__hover=&#8220;|||&#8220;][\/et_pb_column][et_pb_column type=&#8220;3_4&#8243; _builder_version=&#8220;3.25&#8243; custom_padding=&#8220;|||&#8220; custom_padding__hover=&#8220;|||&#8220;][et_pb_text _builder_version=&#8220;4.4.1&#8243; text_font=&#8220;|300|||||||&#8220; text_text_color=&#8220;#ffffff&#8220; text_line_height=&#8220;1.1em&#8220; header_5_font=&#8220;|600|||||||&#8220; header_5_text_color=&#8220;#ffffff&#8220; header_5_font_size=&#8220;14px&#8220; header_5_line_height=&#8220;1.5em&#8220; custom_margin=&#8220;||||false|false&#8220;]29 Jahre im Gesch\u00e4ft | 2700 Software-Projekte | 760 Kunden | 24 L\u00e4nder<\/p>\n<h5>Wir verwandeln Ideen in Software. Wie lautet Ihre Idee?<\/h5>[\/et_pb_text][et_pb_text admin_label=&#8220;Title&#8220; _builder_version=&#8220;4.4.6&#8243; header_text_align=&#8220;center&#8220; header_2_font=&#8220;|300|||||||&#8220; header_2_text_align=&#8220;left&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;50px&#8220; header_2_line_height=&#8220;0.9em&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;25px||25px||false|false&#8220;]<h2 id=\"Getintouch\">Kontakt aufnehmen<\/h2>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8220;1_4,3_4&#8243; _builder_version=&#8220;4.4.4&#8243;][et_pb_column type=&#8220;1_4&#8243; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_column][et_pb_column type=&#8220;3_4&#8243; _builder_version=&#8220;4.4.4&#8243;][et_pb_contact_form email=&#8220;contact@bergsoftprod.wpengine.com&#8220; custom_message=&#8220;WEBFORM MESSAGE||et_pb_line_break_holder||\uff3f||et_pb_line_break_holder||FROM: %%Name%%||et_pb_line_break_holder||EMAIL: %%Email%%||et_pb_line_break_holder||PHONE NUMBER: %%Phone_number%%||et_pb_line_break_holder||COMPANY: %%Company_name%%||et_pb_line_break_holder||TERMS &amp; CONDITIONS: %%Terms_and_Conditions%%||et_pb_line_break_holder||DATA PRIVACY POLICY: %%Data_Privacy_Policy%%||et_pb_line_break_holder||\uff3f||et_pb_line_break_holder||MESSAGE:||et_pb_line_break_holder||%%Message%%&#8220; success_message=&#8220;Thank you for reaching out! Your message was sent. We will get back to you right away.&#8220; _builder_version=&#8220;4.7.7&#8243; form_field_background_color=&#8220;#d2d2d2&#8243; form_field_text_color=&#8220;#ffffff&#8220; form_field_focus_background_color=&#8220;#ffffff&#8220; form_field_focus_text_color=&#8220;#000000&#8243; title_level=&#8220;h2&#8243; title_font=&#8220;|300|||||||&#8220; title_text_color=&#8220;#ff6317&#8243; title_font_size=&#8220;30px&#8220; form_field_line_height=&#8220;1.5em&#8220; custom_button=&#8220;on&#8220; button_text_size=&#8220;14px&#8220; button_text_color=&#8220;#ffffff&#8220; button_bg_color=&#8220;#ff6317&#8243; button_border_width=&#8220;0px&#8220; button_border_radius=&#8220;0px&#8220; button_icon=&#8220;%%3%%&#8220; button_on_hover=&#8220;off&#8220; border_color_all=&#8220;#ffffff&#8220; border_width_bottom=&#8220;1px&#8220;][et_pb_contact_field field_id=&#8220;Name&#8220; field_title=&#8220;Name *&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243; form_field_background_color=&#8220;#d2d2d2&#8243; form_field_text_color=&#8220;#ffffff&#8220; form_field_focus_background_color=&#8220;#ffffff&#8220; form_field_focus_text_color=&#8220;#000000&#8243; border_width_bottom=&#8220;1px&#8220; button_text_size__hover_enabled=&#8220;off&#8220; button_one_text_size__hover_enabled=&#8220;off&#8220; button_two_text_size__hover_enabled=&#8220;off&#8220; button_text_color__hover_enabled=&#8220;off&#8220; button_one_text_color__hover_enabled=&#8220;off&#8220; button_two_text_color__hover_enabled=&#8220;off&#8220; button_border_width__hover_enabled=&#8220;off&#8220; button_one_border_width__hover_enabled=&#8220;off&#8220; button_two_border_width__hover_enabled=&#8220;off&#8220; button_border_color__hover_enabled=&#8220;off&#8220; button_one_border_color__hover_enabled=&#8220;off&#8220; button_two_border_color__hover_enabled=&#8220;off&#8220; button_border_radius__hover_enabled=&#8220;off&#8220; button_one_border_radius__hover_enabled=&#8220;off&#8220; button_two_border_radius__hover_enabled=&#8220;off&#8220; button_letter_spacing__hover_enabled=&#8220;off&#8220; button_one_letter_spacing__hover_enabled=&#8220;off&#8220; button_two_letter_spacing__hover_enabled=&#8220;off&#8220; button_bg_color__hover_enabled=&#8220;off&#8220; button_one_bg_color__hover_enabled=&#8220;off&#8220; button_two_bg_color__hover_enabled=&#8220;off&#8220;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Email&#8220; field_title=&#8220;E-Mail-Adresse *&#8220; field_type=&#8220;email&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243; button_text_size__hover_enabled=&#8220;off&#8220; button_one_text_size__hover_enabled=&#8220;off&#8220; button_two_text_size__hover_enabled=&#8220;off&#8220; button_text_color__hover_enabled=&#8220;off&#8220; button_one_text_color__hover_enabled=&#8220;off&#8220; button_two_text_color__hover_enabled=&#8220;off&#8220; button_border_width__hover_enabled=&#8220;off&#8220; button_one_border_width__hover_enabled=&#8220;off&#8220; button_two_border_width__hover_enabled=&#8220;off&#8220; button_border_color__hover_enabled=&#8220;off&#8220; button_one_border_color__hover_enabled=&#8220;off&#8220; button_two_border_color__hover_enabled=&#8220;off&#8220; button_border_radius__hover_enabled=&#8220;off&#8220; button_one_border_radius__hover_enabled=&#8220;off&#8220; button_two_border_radius__hover_enabled=&#8220;off&#8220; button_letter_spacing__hover_enabled=&#8220;off&#8220; button_one_letter_spacing__hover_enabled=&#8220;off&#8220; button_two_letter_spacing__hover_enabled=&#8220;off&#8220; button_bg_color__hover_enabled=&#8220;off&#8220; button_one_bg_color__hover_enabled=&#8220;off&#8220; button_two_bg_color__hover_enabled=&#8220;off&#8220;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Phone_number&#8220; field_title=&#8220;Telefonnummer&#8220; required_mark=&#8220;off&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Company_name&#8220; field_title=&#8220;Name des Unternehmens&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Message&#8220; field_title=&#8220;Nachricht *&#8220; field_type=&#8220;text&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243; form_field_background_color=&#8220;#d2d2d2&#8243; form_field_focus_background_color=&#8220;#ffffff&#8220; form_field_focus_text_color=&#8220;#000000&#8243; border_width_bottom=&#8220;1px&#8220; button_text_size__hover_enabled=&#8220;off&#8220; button_one_text_size__hover_enabled=&#8220;off&#8220; button_two_text_size__hover_enabled=&#8220;off&#8220; button_text_color__hover_enabled=&#8220;off&#8220; button_one_text_color__hover_enabled=&#8220;off&#8220; button_two_text_color__hover_enabled=&#8220;off&#8220; button_border_width__hover_enabled=&#8220;off&#8220; button_one_border_width__hover_enabled=&#8220;off&#8220; button_two_border_width__hover_enabled=&#8220;off&#8220; button_border_color__hover_enabled=&#8220;off&#8220; button_one_border_color__hover_enabled=&#8220;off&#8220; button_two_border_color__hover_enabled=&#8220;off&#8220; button_border_radius__hover_enabled=&#8220;off&#8220; button_one_border_radius__hover_enabled=&#8220;off&#8220; button_two_border_radius__hover_enabled=&#8220;off&#8220; button_letter_spacing__hover_enabled=&#8220;off&#8220; button_one_letter_spacing__hover_enabled=&#8220;off&#8220; button_two_letter_spacing__hover_enabled=&#8220;off&#8220; button_bg_color__hover_enabled=&#8220;off&#8220; button_one_bg_color__hover_enabled=&#8220;off&#8220; button_two_bg_color__hover_enabled=&#8220;off&#8220;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Terms_and_Conditions&#8220; field_title=&#8220; &#8220; field_type=&#8220;checkbox&#8220; checkbox_options=&#8220;%91{%22value%22:%22Ich habe die AGB gelesen und akzeptiert%22,%22checked%22:0,%22dragID%22:-1}%93&#8243; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Data_Privacy_Policy&#8220; field_title=&#8220; &#8220; field_type=&#8220;checkbox&#8220; checkbox_options=&#8220;%91{%22value%22:%22Ich habe die Datenschutzrichtlinie gelesen und akzeptiert%22,%22checked%22:0,%22dragID%22:-1}%93&#8243; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_contact_field][\/et_pb_contact_form][\/et_pb_column][\/et_pb_row][\/et_pb_section]\n","protected":false},"excerpt":{"rendered":"<p>Wenn CD\/kontinuierliche Entwicklung und Bereitstellung von Funktionen mit sehr hoher Geschwindigkeit erfolgen, ist es entscheidend, dass die Systemleistung innerhalb der definierten Grenzen bleibt. Im Folgenden erfahren Sie, wie wir Leistungstests entwickelt und in unsere CI\/CD-Pipeline integriert haben.<\/p>\n","protected":false},"author":12,"featured_media":6307,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[79,141],"tags":[],"class_list":["post-8030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-einblicke","category-how-to-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v16.1.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Gatling Leistungstests und Integration in die GitLab CI\/CD-Pipeline | Berg Software<\/title>\n<meta name=\"description\" content=\"Wenn CD\/kontinuierliche Entwicklung und Bereitstellung von Funktionen mit sehr hoher Geschwindigkeit erfolgen, ist es entscheidend, dass die Systemleistung innerhalb der definierten Grenzen bleibt. Im Folgenden erfahren Sie, wie wir Leistungstests entwickelt und in unsere CI\/CD-Pipeline integriert haben.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gatling Leistungstests und Integration in die GitLab CI\/CD-Pipeline | Berg Software\" \/>\n<meta property=\"og:description\" content=\"Wenn CD\/kontinuierliche Entwicklung und Bereitstellung von Funktionen mit sehr hoher Geschwindigkeit erfolgen, ist es entscheidend, dass die Systemleistung innerhalb der definierten Grenzen bleibt. Im Folgenden erfahren Sie, wie wir Leistungstests entwickelt und in unsere CI\/CD-Pipeline integriert haben.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/\" \/>\n<meta property=\"og:site_name\" content=\"Berg Software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/bergCOMPUTERS\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-22T05:12:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-09-22T05:15:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.berg-software.com\/wp-content\/uploads\/Berg-Software-End-to-end-tests-an-GitLab-integration-00-Cover.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@berg_software\" \/>\n<meta name=\"twitter:site\" content=\"@berg_software\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"24 Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.berg-software.com\/de\/#organization\",\"name\":\"Berg Software\",\"url\":\"https:\/\/www.berg-software.com\/de\/\",\"sameAs\":[\"https:\/\/www.facebook.com\/bergCOMPUTERS\/\",\"https:\/\/www.instagram.com\/berg_software\/\",\"https:\/\/www.linkedin.com\/company\/berg-computers-srl\/\",\"https:\/\/www.youtube.com\/channel\/UCw1FfcRJnC-CoKPwlcM10Iw\",\"https:\/\/twitter.com\/berg_software\"],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.berg-software.com\/de\/#logo\",\"inLanguage\":\"de-DE\",\"url\":\"https:\/\/berg-software.com\/wp-content\/uploads\/berg-software-logo.png\",\"contentUrl\":\"https:\/\/berg-software.com\/wp-content\/uploads\/berg-software-logo.png\",\"width\":512,\"height\":512,\"caption\":\"Berg Software\"},\"image\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.berg-software.com\/de\/#website\",\"url\":\"https:\/\/www.berg-software.com\/de\/\",\"name\":\"Berg Software\",\"description\":\"We turn ideas into software.\",\"publisher\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/www.berg-software.com\/de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de-DE\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/#primaryimage\",\"inLanguage\":\"de-DE\",\"url\":\"https:\/\/www.berg-software.com\/wp-content\/uploads\/Berg-Software-End-to-end-tests-an-GitLab-integration-00-Cover.jpg\",\"contentUrl\":\"https:\/\/www.berg-software.com\/wp-content\/uploads\/Berg-Software-End-to-end-tests-an-GitLab-integration-00-Cover.jpg\",\"width\":1200,\"height\":600,\"caption\":\"Berg Software - End-to-end tests an GitLab integration - 00 Cover\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/#webpage\",\"url\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/\",\"name\":\"Gatling Leistungstests und Integration in die GitLab CI\/CD-Pipeline | Berg Software\",\"isPartOf\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/#primaryimage\"},\"datePublished\":\"2021-09-22T05:12:36+00:00\",\"dateModified\":\"2021-09-22T05:15:20+00:00\",\"description\":\"Wenn CD\/kontinuierliche Entwicklung und Bereitstellung von Funktionen mit sehr hoher Geschwindigkeit erfolgen, ist es entscheidend, dass die Systemleistung innerhalb der definierten Grenzen bleibt. Im Folgenden erfahren Sie, wie wir Leistungstests entwickelt und in unsere CI\/CD-Pipeline integriert haben.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.berg-software.com\/de\/\",\"url\":\"https:\/\/www.berg-software.com\/de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.berg-software.com\/de\/category\/einblicke\/\",\"url\":\"https:\/\/www.berg-software.com\/de\/category\/einblicke\/\",\"name\":\"Einblicke\"}},{\"@type\":\"ListItem\",\"position\":3,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/\",\"url\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/\",\"name\":\"Gatling Leistungstests und Integration in die GitLab CI\/CD-Pipeline\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/#webpage\"},\"author\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#\/schema\/person\/4becfb1c9de08963757e6dc8531fef1a\"},\"headline\":\"Gatling Leistungstests und Integration in die GitLab CI\/CD-Pipeline\",\"datePublished\":\"2021-09-22T05:12:36+00:00\",\"dateModified\":\"2021-09-22T05:15:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/#webpage\"},\"publisher\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/gatling-leistungstests-integration-gitlab-ci-cd-pipeline\/#primaryimage\"},\"articleSection\":\"Einblicke,How to\",\"inLanguage\":\"de-DE\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.berg-software.com\/de\/#\/schema\/person\/4becfb1c9de08963757e6dc8531fef1a\",\"name\":\"Ionu\\u021b Bucurescu\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/posts\/8030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/comments?post=8030"}],"version-history":[{"count":0,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/posts\/8030\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/media\/6307"}],"wp:attachment":[{"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/media?parent=8030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/categories?post=8030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/tags?post=8030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}