Tutorial: Identifizieren von Leistungsregressionen mit Azure Load Testing (Vorschauversion) und Azure Pipelines

In diesem Tutorial erfahren Sie, wie Sie Leistungsregressionstests mithilfe von Azure Load Testing (Vorschauversion) und Azure Pipelines automatisieren. Sie richten einen Azure Pipelines-CI/CD-Workflow ein, um eine Node.js-Beispielanwendung in Azure bereitzustellen und einen Auslastungstest mithilfe der Azure Load Testing-Aufgabe auszulösen. Sobald der Auslastungstest abgeschlossen ist, verwenden Sie das Azure Load Testing-Dashboard, um Leistungsprobleme zu identifizieren.

Sie stellen eine Beispiel-Web-App für Node.js in Azure App Service bereit. Die Web-App verwendet Azure Cosmos DB zum Speichern der Daten. Die Beispielanwendung enthält außerdem ein Apache JMeter-Skript zum Laden von drei APIs.

Wenn Sie für Ihre CI/CD-Workflows GitHub Actions verwenden, finden Sie weitere Informationen im entsprechenden GitHub Actions-Tutorial.

Erfahren Sie mehr über die wichtigsten Konzepte bei Azure Load Testing.

Sie lernen Folgendes:

  • Einrichten Ihres Repositorys mit Dateien, die für Auslastungstests erforderlich sind
  • Einrichten von Azure Pipelines für die Azure Load Testing-Integration
  • Ausführen des Auslastungstests und Anzeigen der Ergebnisse in den Pipelineprotokollen
  • Definieren von Erfolgs-/Fehlerkriterien für den Auslastungstest
  • Parametrisieren des Auslastungstests mithilfe von Pipelinevariablen

Wichtig

Azure Load Testing befindet sich derzeit in der VORSCHAUPHASE. Die zusätzlichen Nutzungsbestimmungen für Microsoft Azure-Vorschauen enthalten rechtliche Bedingungen. Sie gelten für diejenigen Azure-Features, die sich in der Beta- oder Vorschauversion befinden oder aber anderweitig noch nicht zur allgemeinen Verfügbarkeit freigegeben sind.

Hinweis

Für Aufträge, die auf von Microsoft gehosteten Agents für private Projekte ausgeführt werden, gilt bei Azure Pipelines ein Timeout von 60 Minuten. Wenn Ihr Auslastungstest länger als 60 Minuten dauert, müssen Sie für zusätzliche Kapazität bezahlen. Andernfalls tritt für die Pipeline ein Timeout auf, ohne auf die Testergebnisse zu warten. Der Status des Auslastungstests kann im Azure-Portal angezeigt werden.

Voraussetzungen

  • Ein Azure-Konto mit einem aktiven Abonnement. Wenn Sie kein Azure-Abonnement haben, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
  • Eine Azure DevOps-Organisation und ein entsprechendes Projekt. Falls Sie über keine Azure DevOps-Organisation verfügen, können Sie kostenlos eine erstellen. Informationen zu den ersten Schritten mit Azure Pipelines finden Sie bei Bedarf unter Erstellen Ihrer ersten Pipeline.
  • Ein GitHub-Konto, in dem Sie ein Repository erstellen können. Wenn Sie noch keines besitzen, können Sie es kostenlos erstellen.

Einrichten des Repositorys für Beispielanwendungen

Um mit diesem Tutorial zu beginnen, müssen Sie zunächst eine Node.js-Beispielwebanwendung einrichten. Die Beispielanwendung enthält eine Azure Pipelines-Definition, um die Anwendung in Azure bereitzustellen und einen Auslastungstest auszulösen.

  1. Öffnen Sie einen Browser, und navigieren Sie zum GitHub-Quellrepository der Beispielanwendung.

    Die Beispielanwendung ist eine Node.js-App, die aus einer Azure App Service-Webkomponente und einer Azure Cosmos DB-Datenbank besteht.

  2. Wählen Sie Fork (Forken) aus, um das Repository der Beispielanwendung in Ihr GitHub-Konto zu forken.

    Screenshot that shows the button to fork the sample application's GitHub repo.

Das Repository der Beispielanwendung enthält ein Apache JMeter-Skript mit dem Namen SampleApp.jmx. Das Skript testet die drei APIs in der Beispielanwendung:

  • add: Führt einen Einfügevorgang in Azure Cosmos DB zum Speichern der Anzahl von Web-App-Besuchern aus.
  • get: Führt einen Lesevorgang in Azure Cosmos DB zum Abrufen der Besucheranzahl aus.
  • lasttimestamp: Aktualisiert den In-Memory-Zeitstempel des letzten Benutzerbesuchs.

Einrichten von Azure Pipelines-Zugriffsberechtigungen für Azure

In diesem Abschnitt wird das Azure DevOps-Projekt so konfiguriert, dass es über Zugriffsberechtigungen für die Azure Load Testing-Ressource verfügt.

Erstellen Sie für den Zugriff auf Azure-Ressourcen eine Dienstverbindung in Azure DevOps, und verwenden Sie die rollenbasierte Zugriffssteuerung, um die erforderlichen Berechtigungen zuzuweisen:

  1. Melden Sie sich bei Ihrer Azure DevOps-Organisation (https://dev.azure.com/<yourorganization>) an.

  2. Wählen Sie ProjekteinstellungenDienstverbindungen aus.

  3. Wählen Sie + Neue Dienstverbindung, die Dienstverbindung Azure Resource Manager und anschließend Weiter aus.

  4. Wählen Sie die Authentifizierungsmethode Dienstprinzipal (automatisch) und anschließend Weiter aus.

  5. Wählen Sie die Bereichsebene Abonnement und anschließend das Azure-Abonnement aus, das Ihre Azure Load Testing-Ressource enthält.

    Screenshot that shows selections for creating a new service connection.

    Der Name der Dienstverbindung wird in einem späteren Schritt verwendet, um die Pipeline zu konfigurieren.

  6. Wählen Sie Speichern aus, um das die Verbindung zu erstellen.

  7. Wählen Sie in der Liste die Dienstverbindung und anschließend Dienstprinzipal verwalten aus.

    Screenshot that shows selections for managing a service principal.

    Die Details des Dienstprinzipals werden im Azure-Portal angezeigt. Notieren Sie sich die Anwendungsclient-ID des Dienstprinzipals.

    Screenshot that shows how to get the application I D for the service connection.

  8. Weisen Sie dem Dienstprinzipal die Rolle „Auslastungstestmitwirkender“ zu, um Zugriff auf den Azure Load Testing-Dienst zu gewähren.

    Rufen Sie zunächst die ID des Dienstprinzipalobjekts ab. Verwenden Sie das Ergebnis objectId aus dem folgenden Azure CLI-Befehl:

    az ad sp show --id "<application-client-id>"
    

    Weisen Sie als Nächstes dem Dienstprinzipal die Rolle „Auslastungstestmitwirkender“ zu. Ersetzen Sie den Platzhaltertext <sp-object-id> durch die ID des Dienstprinzipalobjekts. Ersetzen Sie außerdem <subscription-name-or-id> durch Ihre Azure-Abonnement-ID.

    az role assignment create --assignee "<sp-object-id>" \
        --role "Load Test Contributor" \
        --scope /subscriptions/<subscription-name-or-id>/resourceGroups/<resource-group-name> \
        --subscription "<subscription-name-or-id>"
    

Konfigurieren des Azure Pipelines-Workflows zum Ausführen eines Auslastungstests

In diesem Abschnitt wird ein Azure Pipelines-Workflow zum Auslösen des Auslastungstests eingerichtet. Das Repository der Beispielanwendung enthält bereits eine Pipelinedefinitionsdatei (azure-pipeline.yml).

Der Azure Pipelines-Workflow führt die folgenden Schritte für jedes Update des Mainbranch aus:

  • Bereitstellen der Node.js-Beispielanwendung in einer Azure App Service-Web-App.
  • Erstellen Sie eine Azure Load Testing-Ressource mithilfe der ARM-Vorlage (Azure Resource Manager) ARMTemplate/template.json, falls die Ressource noch nicht vorhanden ist. Weitere Informationen zu ARM-Vorlagen finden Sie hier.
  • Auslösen von Azure Load Testing, um den Auslastungstest basierend auf dem Apache JMeter-Skript und der YAML-Testkonfigurationsdatei im Repository zu erstellen und auszuführen
  • Rufen Sie Azure Load Testing mithilfe der Azure Load Testing-Aufgabe, des Apache JMeter-Beispielskripts SampleApp.jmx und der Konfigurationsdatei für den Auslastungstest SampleApp.yaml aus.

Führen Sie die folgenden Schritte aus, um den Azure Pipelines-Workflow für Ihre Umgebung zu konfigurieren:

  1. Installieren Sie die Azure Load Testing-Aufgabenerweiterung aus dem Azure DevOps Marketplace.

    Screenshot that shows how to browse the Visual Studio Marketplace for extensions.

    Screenshot that shows the button for installing the Azure Load Testing extension from the Visual Studio Marketplace.

  2. Wählen Sie in Ihrem Azure DevOps-Projekts die Option Pipelines und anschließend Pipeline erstellen aus.

    Screenshot that shows selections for creating an Azure pipeline.

  3. Wählen Sie auf der Registerkarte Connect die Option GitHub aus.

  4. Wählen Sie Azure Pipelines autorisieren aus, damit Azure Pipelines zum Auslösen von Workflows auf Ihr GitHub-Konto zugreifen kann.

  5. Wählen Sie auf der Registerkarte Auswählen das geforkte Repository der Beispielanwendung aus.

    Screenshot that shows how to select the sample application's GitHub repository.

    Das Repository enthält eine Pipelinedefinitionsdatei namens azure-pipeline.yml. Der folgende Codeausschnitt zeigt, wie Sie die Aufgabe „Azure Load Testing“ in Azure Pipelines verwenden:

    - task: AzureLoadTest@1
      inputs:
        azureSubscription: $(serviceConnection)
        loadTestConfigFile: 'SampleApp.yaml'
        resourceGroup: $(loadTestResourceGroup)
        loadTestResource: $(loadTestResource)
        env: |
          [
            {
            "name": "webapp",
            "value": "$(webAppName).azurewebsites.net"
            }
          ]
    

    Diese Pipeline wird nun geändert, um eine Verbindung mit dem Azure Load Testing-Dienst herzustellen.

  6. Ersetzen Sie auf der Registerkarte Überprüfen den folgenden Platzhaltertext im YAML-Code:

    Platzhalter Wert
    <Name of your webapp> Der Name der Azure App Service-Web-App.
    <Name of your webARM Service connection> Der Name der Dienstverbindung, die Sie im vorherigen Abschnitt erstellt haben.
    <Azure subscriptionId> die Azure-Abonnement-ID
    <Name of your load test resource> Der Name der Azure Load Testing-Ressource.
    <Name of your load test resource group> Der Name der Ressourcengruppe, die die Azure Load Testing-Ressource enthält.

    Screenshot that shows the Azure Pipelines Review tab when you're creating a pipeline.

    Diese Variablen werden verwendet, um die Azure Pipelines-Aufgabe für die Bereitstellung der Beispielanwendung in Azure zu konfigurieren und eine Verbindung mit Ihrer Azure Load Testing-Ressource herzustellen.

  7. Wählen Sie Speichern und ausführen aus, geben Sie Text für die Commitnachricht ein, und wählen Sie anschließend Speichern und ausführen aus.

    Screenshot that shows selections for saving and running a new Azure pipeline.

    Nun wird von Azure Pipelines der CI/CD-Workflow ausgeführt. Status und Protokolle können durch Auswählen des Pipelineauftrags überwacht werden.

    Screenshot that shows how to view pipeline job details.

Anzeigen von Auslastungstestergebnissen

So zeigen Sie die Ergebnisse des Auslastungstests im Pipelineprotokoll an:

  1. Wählen Sie in Ihrem Azure DevOps-Projekt die Option Pipelines und anschließend in der Liste Ihre Pipelinedefinition aus.

  2. Wählen Sie die Pipelineausführung aus, um die Ausführungszusammenfassung anzuzeigen.

    Screenshot that shows the pipeline run summary.

  3. Wählen Sie im Abschnitt Aufträge die Option Auslastungstest aus, um das Pipelineprotokoll anzuzeigen.

    Screenshot that shows the Azure Pipelines run log.

    Nach Abschluss des Auslastungstests können Sie sich die Testzusammenfassung und die clientseitigen Metriken im Pipelineprotokoll ansehen. Das Protokoll enthält auch die URL des Azure Load Testing-Dashboards für diesen Auslastungstest.

  4. Wählen Sie in der Pipelineprotokollansicht die Option Auslastungstest und anschließend 1 Artefakt erstellt aus, um die Ergebnisdateien für den Auslastungstest herunterzuladen.

    Screenshot that shows how to download the load test results.

Definieren von Erfolgs-/Fehlerkriterien für den Test

In diesem Abschnitt werden Kriterien hinzugefügt, um zu bestimmen, ob der Auslastungstest erfolgreich war. Wenn mindestens eines der Erfolgs-/Fehlerkriterien als true ausgewertet wird, war der Auslastungstest nicht erfolgreich.

Diese Kriterien können in der YAML-Testkonfigurationsdatei angegeben werden:

  1. Bearbeiten Sie die Datei SampleApp.yml in Ihrem GitHub-Repository.

  2. Fügen Sie am Ende der Datei den folgenden Codeausschnitt hinzu:

    failureCriteria: 
        - avg(response_time_ms) > 100
        - percentage(error) > 20
    

    Sie haben nun Erfolgs-/Fehlerkriterien für Ihren Auslastungstest angegeben. Der Test ist nicht erfolgreich, wenn mindestens eine der folgenden Bedingungen erfüllt ist:

    • Die aggregierte durchschnittliche Antwortzeit ist größer als 100 ms.
    • Der aggregierte Prozentsatz der Fehler ist größer als 20 Prozent.
  3. Committen und pushen Sie die Änderungen an den Mainbranch des Repositorys.

    Durch die Änderungen wird der CI/CD-Workflow von Azure Pipelines ausgelöst.

  4. Wählen Sie in der Liste auf der Seite für Pipelineausführungen den neuesten Eintrag aus.

    Nach Abschluss des Auslastungstests sehen Sie, dass die Pipeline nicht erfolgreich war, da die durchschnittliche Antwortzeit höher war als der in den Erfolgs-/Fehlerkriterien angegebene Wert.

    Screenshot that shows pipeline logs after failed test criteria.

    Die Kriterien werden während des Testlaufs vom Azure Load Testing-Dienst ausgewertet. Wird eine dieser Bedingungen als Fehler eingestuft, wird vom Azure Load Testing-Dienst ein Exitcode ungleich null zurückgegeben. Dieser Code informiert den CI/CD-Workflow darüber, dass der Test nicht erfolgreich war.

  5. Bearbeiten Sie die Datei SampleApp.yml, und ändern Sie die Erfolgs-/Fehlerkriterien des Tests:

    failureCriteria: 
        - avg(response_time_ms) > 5000
        - percentage(error) > 20
    
  6. Committen Sie die Änderungen, um den CI/CD-Workflow von Azure Pipelines auszulösen.

    Screenshot that shows pipeline logs after all test criteria pass.

    Der Auslastungstest ist jetzt erfolgreich, und die Pipeline wird erfolgreich abgeschlossen.

Übergeben von Parametern aus der Pipeline an Ihre Auslastungstests

Als Nächstes wird der Auslastungstest mithilfe von Pipelinevariablen parametrisiert. Diese Variablen können Geheimnisse (beispielsweise Kennwörter) oder keine Geheimnisse sein.

In diesem Tutorial wird die Beispielanwendung neu konfiguriert, um nur sichere Anforderungen zu akzeptieren. Zum Senden einer sicheren Anforderung muss in der HTTP-Anforderung ein Geheimniswert übergeben werden:

  1. Bearbeiten Sie die Datei SampleApp.yaml in Ihrem GitHub-Repository.

    Aktualisieren Sie die Konfigurationseinstellung testPlan, um die Datei testPlan zu verwenden:

    version: v0.1
    testName: SampleApp
    testPlan: SampleApp_Secrets.jmx
    description: 'SampleApp Test with secrets'
    engineInstances: 1
    

    Das Apache JMeter-Skript SampleApp_Secrets.jmx verwendet eine benutzerdefinierte Variable, die den Geheimniswert mit der benutzerdefinierten Funktion abruft. Dieser Geheimniswert wird dann von Apache JMeter an den Endpunkt der Beispielanwendung übergeben.

  2. Committen Sie die Änderungen an der YAML-Datei.

  3. Bearbeiten Sie die Datei config.json in Ihrem GitHub-Repository.

    Ändern Sie die Einstellung enableSecretsFeature in true, um die Beispielanwendung so zu konfigurieren, dass nur sichere Anforderungen akzeptiert werden:

    {
        "enableSecretsFeature": true
    }
    
  4. Committen Sie die Änderungen an der Datei config.json.

  5. Navigieren Sie zur Seite Pipelines. Wählen Sie Ihre Pipelinedefinition und anschließend Bearbeiten aus.

    Screenshot that shows selections for editing a pipeline definition.

  6. Wählen Sie Variablen und anschließend Neue Variable aus.

  7. Geben Sie Name (mySecret) und Wert (1797669089) ein. Aktivieren Sie dann das Kontrollkästchen Diesen Geheimniswert beibehalten, um die Variable sicher zu speichern.

    Screenshot that shows selections for creating a pipeline variable.

  8. Wählen Sie OK und anschließend Speichern aus, um die neue Variable zu speichern.

  9. Bearbeiten Sie die Datei azure-pipeline.yml, um das Geheimnis an den Auslastungstest zu übergeben.

    Bearbeiten Sie die Azure Load Testing-Aufgabe, indem Sie den folgenden YAML-Codeausschnitt hinzufügen:

    secrets: |
      [
          {
          "name": "appToken",
          "value": "$(mySecret)"
          }
      ]
    
  10. Speichern Sie die Pipeline, und führen Sie sie aus.

    Das Geheimnis aus der Pipeline wird durch die Azure Load Testing-Aufgabe sicher an die Test-Engine übergeben. Der Geheimnisparameter wird nur während der Ausführung des Auslastungstests verwendet und danach aus dem Arbeitsspeicher gelöscht.

Bereinigen von Ressourcen

Wichtig

Sie können die Azure Load Testing-Ressource, die Sie für andere Tutorials und Anleitungen zu Azure Load Testing erstellt haben, wiederverwenden.

Wenn Sie die erstellten Ressourcen nicht mehr benötigen, löschen Sie sie, damit Ihnen keine weiteren Kosten entstehen. Wenn Sie die Beispielanwendung in einer anderen Ressourcengruppe bereitgestellt haben, müssen die folgenden Schritte ggf. wiederholt werden.

So löschen Sie Ressourcen über das Azure-Portal:

  1. Wählen Sie im Portal links oben die Menüschaltfläche und dann Ressourcengruppen aus.

  2. Wählen Sie in der Liste die Ressourcengruppe aus, die Sie erstellt haben.

  3. Wählen Sie die Option Ressourcengruppe löschen. Screenshot of the selections to delete a resource group in the Azure portal.

  4. Geben Sie den Ressourcengruppennamen ein. Wählen Sie anschließend die Option Löschen.

Um Ressourcen mithilfe des Azure CLI löschen, geben Sie den folgenden Befehl ein:

az group delete --name <yourresourcegroup>

Denken Sie daran, dass beim Löschen der Ressourcengruppe alle darin enthaltenen Ressourcen gelöscht werden.

Nächste Schritte

Sie haben nun einen CI/CD-Workflow von Azure Pipelines erstellt, der Azure Load Testing für die automatische Ausführung von Auslastungstests verwendet. Mithilfe von Erfolgs-/Fehlerkriterien können Sie den Status des CI/CD-Workflows festlegen. Mit Parametern können Sie die Ausführung von Auslastungstests konfigurierbar machen.