Упражнение. Выполнение нагрузочных тестов в 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 проекта понимает вышестоящий удаленный, так как вы настроили эту связь при создании вилки проекта из репозитория Майкрософт и клонировали его локально.

    Через некоторое время вы отправите эту ветвь в репозиторий GitHub, известный как origin.

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

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

    Примечание.

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

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

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

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

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

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

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

Screenshot of setting the hostname variable in Apache JMeter.

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

Screenshot for reading the hostname variable in 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 - Nonfunctional test .

  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. Чтобы сохранить переменную в конвейере, нажмите кнопку "Сохранить " в верхней части страницы.

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

    Screenshot of Azure Pipelines, showing the variable group. The group contains five variables.

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

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

  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 устанавливает обработчик XSLT xsltproc и преобразует выходные данные 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. После завершения сборки перейдите на страницу сводки.

    Screenshot of Azure Pipelines, showing the completed stages.

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

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

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

    A screenshot of Azure Pipelines, showing the test summary.

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

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

    Screenshot of Azure Pipelines, showing the full test report.

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

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

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

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

    Screenshot of Filtering passed tests in the test report.

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

    Screenshot of the test report, showing two successful test cases.

Примечание.

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