Упражнение. Выполнение нагрузочных тестов в Azure Pipelines

Завершено

В этом разделе вы запустите тестовый план, созданный в конвейере выпуска. План тестирования использует Apache JMeter для выполнения нагрузочных тестов.

Вот как выполнить тесты:

  • Получите и проверьте ветвь Git, реализующую тесты.
  • Измените конвейер, чтобы установить JMeter, запустите план тестирования, преобразуйте результаты в JUnit и опубликуйте результаты в Azure Pipelines.
  • Отправьте ветвь в GitHub, просмотрите тесты, выполняемые в Azure Pipelines, а затем изучите результаты.

Забрать ветку из GitHub

В этом разделе вы получите ветвь jmeter из GitHub и выберете ее или переключитесь на эту ветвь.

Эта ветвь содержит проект Space Game, с которым вы работали в предыдущих модулях. Он также содержит конфигурацию Azure Pipelines для начальной настройки.

  1. В Visual Studio Code откройте интегрированный терминал.

  2. Чтобы скачать ветвь с именем jmeter из репозитория Майкрософт и переключиться на нее, выполните следующие команды git fetch и git checkout:

    git fetch upstream jmeter
    git checkout -B jmeter upstream/jmeter
    

    Помните, что вышестоящий ссылается на репозиторий Microsoft GitHub. Конфигурация Git вашего проекта понимает внешний удаленный репозиторий, так как вы настроили эту связь, когда сфоркали проект из репозитория Microsoft и клонировали его локально.

    Вскоре вы будете отправлять эту ветвь в репозиторий GitHub, известный как origin.

  3. При необходимости в Visual Studio Code откройте файл azure-pipelines.yml. Просмотрите начальную конфигурацию.

    Конфигурация напоминает те, которые вы создали в предыдущих модулях в этом пути обучения. Он создает только конфигурацию релиз приложения. Чтобы не затягивать, он опускает триггеры, ручные утверждения и тесты, которые вы настроили в предыдущих модулях.

    Заметка

    Более надежная конфигурация может указывать ветви, участвующие в процессе сборки. Например, чтобы помочь проверить качество кода, можно запускать модульные тесты каждый раз при отправке изменений в любой ветви. Вы также можете развернуть приложение в среде, которая выполняет более исчерпывающее тестирование. Но это развертывание выполняется только в том случае, если у вас есть запрос на вытягивание, если у вас есть кандидат на выпуск или при слиянии кода с основной.

    Для получения дополнительной информации см. разделы "Реализация кода в рабочем процессе конвейера сборки с использованием Git и GitHub" и "Триггеры конвейера сборки".

  4. При необходимости в Visual Studio Code можно просмотреть файл плана тестирования JMeter, LoadTest.jmxи преобразование XLST, JMeter2JUnit.xsl. XLST-файл преобразует выходные данные JMeter в JUnit, чтобы Azure Pipelines могли визуализировать результаты.

Добавление переменных в Azure Pipelines

Исходный тестовый план команды предоставляет жестко закодированное значение для имени хоста веб-сайта Space Game, который запускается в стэйджинг среде.

Чтобы сделать план тестирования более гибким, версия использует свойство JMeter. Подумайте о свойстве как переменной, которую можно задать из командной строки.

Вот как определяется переменная hostname в JMeter:

снимок экрана: задание переменной имени узла в Apache JMeter.

Вот как переменная hostname использует функцию __P для чтения переменной hostname.

снимок экрана для чтения переменной имени узла в Apache JMeter.

Соответствующий файл плана тестирования, LoadTest.jmx, указывает эту переменную и использует ее для задания имени узла.

При запуске JMeter из командной строки используется аргумент -J для задания свойства hostname. Ниже приведен пример:

apache-jmeter-5.4.3/bin/./jmeter -n -t LoadTest.jmx -o Results.xml -Jhostname=tailspin-space-game-web-staging-1234.azurewebsites.net

Здесь вы задаете переменную STAGING_HOSTNAME в Azure Pipelines. Эта переменная указывает на имя хоста вашего сайта, который запускается в службе приложений в промежуточной среде . Вы также задаете jmeterVersion, чтобы указать версию JMeter для установки.

При запуске агента эти переменные автоматически экспортируются в агент в качестве переменных среды, поэтому конфигурация конвейера может выполнять JMeter таким образом:

apache-jmeter-5.4.3/bin/./jmeter -n -t LoadTest.jmx -o Results.xml -Jhostname=$(STAGING_HOSTNAME)

Давайте добавим переменные конвейера, прежде чем обновлять конфигурацию конвейера. Для этого сделайте:

  1. В Azure DevOps перейдите к проекту Space Game — web — нефункциональные тесты.

  2. В разделе Конвейерывыберите библиотеку.

  3. Выберите группу переменных выпуска.

  4. В разделе Переменныевыберите опцию + Добавить.

  5. Введите имя переменной STAGING_HOSTNAME. Введите URL-адрес экземпляра службы приложений, соответствующий промежуточной среде, например tailspin-space-game-web-staging-1234.azurewebsites.net.

    Важный

    Не включайте префикс протокола http:// или https:// в значение. JMeter предоставляет протокол при выполнении тестов.

  6. Добавьте вторую переменную с именем jmeterVersion. Для его значения укажите 5.4.3.

    Заметка

    Это версия JMeter, которую мы в последний раз использовали для тестирования этого модуля. Чтобы получить последнюю версию, перейдите к скачайте Apache JMeter.

  7. Чтобы сохранить вашу переменную в конвейер, выберите Сохранить ближе к верху страницы.

    Ваша группа переменных похожа на ту, что показана на следующем рисунке:

    снимок экрана Azure Pipelines, показывающий группу переменных. Группа содержит пять переменных.

Изменение конфигурации конвейера

В этом разделе вы измените конвейер для выполнения нагрузочных тестов на этапе промежуточной проверки.

  1. В Visual Studio Code откройте файл azure-pipelines.yml. Затем измените файл следующим образом:

    Совет / Чаевые

    Вы можете заменить весь файл или просто обновить выделенную часть.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs:
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    
    - stage: 'Dev'
      displayName: 'Deploy to the dev environment'
      dependsOn: Build
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: dev
        variables:
        - group: Release
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameDev)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Test'
      displayName: 'Deploy to the test environment'
      dependsOn: Dev
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: test
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameTest)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Staging'
      displayName: 'Deploy to the staging environment'
      dependsOn: Test
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: staging
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameStaging)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
      - job: RunLoadTests
        dependsOn: Deploy
        displayName: 'Run load tests'
        pool:
          vmImage: 'ubuntu-20.04'
        variables:
        - group: Release
        steps:
        - script: |
            wget -c archive.apache.org/dist/jmeter/binaries/apache-jmeter-$(jmeterVersion).tgz
            tar -xzf apache-jmeter-$(jmeterVersion).tgz
          displayName: 'Install Apache JMeter'
        - script: apache-jmeter-$(jmeterVersion)/bin/./jmeter -n -t LoadTest.jmx -o Results.xml -Jhostname=$(STAGING_HOSTNAME)
          displayName: 'Run Load tests'
        - script: |
            sudo apt-get update
            sudo apt-get install xsltproc
            xsltproc JMeter2JUnit.xsl Results.xml > JUnit.xml
          displayName: 'Transform JMeter output to JUnit'
        - task: PublishTestResults@2
          inputs:
            testResultsFormat: JUnit
            testResultsFiles: JUnit.xml
    

    Ниже приведены общие сведения об изменениях:

    • Задача RunLoadTests проводит нагрузочное тестирование с использованием агента на базе Linux.
    • Задание RunLoadTests зависит от задания Deploy, чтобы убедиться, что задания выполняются в правильном порядке. Чтобы запустить нагрузочные тесты, необходимо развернуть веб-сайт в Службе приложений. Если эта зависимость не указана, задания на этапе могут выполняться в любом порядке или параллельно выполняться.
    • Первая script задача загружает и устанавливает JMeter. Переменная конвейера jmeterVersion указывает версию JMeter, которую нужно установить.
    • Вторая задача script запускает JMeter. Аргумент -J задает свойство hostname в JMeter, считывая переменную STAGING_HOSTNAME из конвейера.
    • Третья задача script устанавливает xsltproc, процессор XSLT и преобразует выходные данные JMeter в JUnit.
    • Задача PublishTestResults@2 публикует полученный отчет JUnit JUnit.xmlв конвейер. Azure Pipelines поможет визуализировать результаты теста.
  2. В интегрированном терминале добавьте azure-pipelines.yml в индекс, зафиксируйте изменения и отправьте ветвь до GitHub.

    git add azure-pipelines.yml
    git commit -m "Run load tests with Apache JMeter"
    git push origin jmeter
    

Просмотрите выполнение тестов в Azure Pipelines

Здесь вы увидите запуск конвейера. Вы увидите, что нагрузочные тесты будут выполняться во время промежуточного этапа.

  1. В Azure Pipelines перейдите к сборке и отслеживайте ее выполнение.

    Во время стадии тестированиявы увидите запуск нагрузочных тестов после развертывания веб-сайта.

  2. После завершения сборки перейдите на страницу сводки.

    снимок экрана Azure Pipelines, показывающий завершенные этапы.

    Вы видите, что развертывание и нагрузочные тесты успешно завершены.

  3. В верхней части страницы обратите внимание на сводку.

    Вы видите, что результат сборки для веб-сайта Space Game публикуется как и всегда. Также обратите внимание на раздел Тесты и покрытие, в котором показано, что нагрузочные тесты успешно пройдены.

    Снимок экрана Azure Pipelines с сводкой теста.

  4. Выберите сводку теста, чтобы просмотреть полный отчет.

    В отчете показано, что оба теста прошли.

    снимок экрана Azure Pipelines, показывающий полный тестовый отчет.

    Если какой-либо тест завершился ошибкой, вы увидите подробные результаты сбоя. Из этих результатов можно изучить источник сбоя.

    Помните, что XSLT-файл создает JUnit-файл с именем JUnit.xml. Файл JUnit отвечает на эти два вопроса:

    • Среднее время запроса меньше одной секунды?
    • Занимает ли выполнение менее 10 процентов запросов больше одной секунды?

    В докладе показано, что эти требования выполнены. Чтобы просмотреть дополнительные сведения, выберите стрелку результата в отчете. Затем убедитесь, что выбран только Пройденные.

    снимок экрана: фильтрация пройденных тестов в тестовом отчете.

    Вы видите, что тесты среднее время отклика и максимальное время отклика успешно выполнены.

    снимок экрана тестового отчета, показывающий два успешных тестовых случая.

Заметка

Вы используете план службы приложений B1, который работает на базовом уровне . Этот план предназначен для приложений с низкими требованиями к трафику, например приложениям в тестовой среде. Из-за этого плана производительность веб-сайта может быть меньше, чем вы ожидаете. На практике вы бы выбрали план для среды , которая в максимальной степени соответствует вашей рабочей среде. Например, планы "Стандартный " и "Премиум " предназначены для рабочих нагрузок. Они выполняются на выделенных экземплярах виртуальных машин.