Упражнение. Выполнение нагрузочных тестов в Azure Pipelines
В этом разделе вы запустите тестовый план, созданный в конвейере выпуска. План тестирования использует Apache JMeter для выполнения нагрузочных тестов.
Вот как выполнить тесты:
- Получите и проверьте ветвь Git, реализующую тесты.
- Измените конвейер, чтобы установить JMeter, запустите план тестирования, преобразуйте результаты в JUnit и опубликуйте результаты в Azure Pipelines.
- Отправьте ветвь в GitHub, просмотрите тесты, выполняемые в Azure Pipelines, а затем изучите результаты.
Забрать ветку из GitHub
В этом разделе вы получите ветвь jmeter
из GitHub и выберете ее или переключитесь на эту ветвь.
Эта ветвь содержит проект Space Game, с которым вы работали в предыдущих модулях. Он также содержит конфигурацию Azure Pipelines для начальной настройки.
В Visual Studio Code откройте интегрированный терминал.
Чтобы скачать ветвь с именем
jmeter
из репозитория Майкрософт и переключиться на нее, выполните следующие командыgit fetch
иgit checkout
:git fetch upstream jmeter git checkout -B jmeter upstream/jmeter
Помните, что вышестоящий ссылается на репозиторий Microsoft GitHub. Конфигурация Git вашего проекта понимает внешний удаленный репозиторий, так как вы настроили эту связь, когда сфоркали проект из репозитория Microsoft и клонировали его локально.
Вскоре вы будете отправлять эту ветвь в репозиторий GitHub, известный как
origin
.При необходимости в Visual Studio Code откройте файл azure-pipelines.yml. Просмотрите начальную конфигурацию.
Конфигурация напоминает те, которые вы создали в предыдущих модулях в этом пути обучения. Он создает только конфигурацию релиз приложения. Чтобы не затягивать, он опускает триггеры, ручные утверждения и тесты, которые вы настроили в предыдущих модулях.
Заметка
Более надежная конфигурация может указывать ветви, участвующие в процессе сборки. Например, чтобы помочь проверить качество кода, можно запускать модульные тесты каждый раз при отправке изменений в любой ветви. Вы также можете развернуть приложение в среде, которая выполняет более исчерпывающее тестирование. Но это развертывание выполняется только в том случае, если у вас есть запрос на вытягивание, если у вас есть кандидат на выпуск или при слиянии кода с основной.
Для получения дополнительной информации см. разделы "Реализация кода в рабочем процессе конвейера сборки с использованием Git и GitHub" и "Триггеры конвейера сборки".
При необходимости в Visual Studio Code можно просмотреть файл плана тестирования JMeter, LoadTest.jmxи преобразование XLST, JMeter2JUnit.xsl. XLST-файл преобразует выходные данные JMeter в JUnit, чтобы Azure Pipelines могли визуализировать результаты.
Добавление переменных в Azure Pipelines
Исходный тестовый план команды предоставляет жестко закодированное значение для имени хоста веб-сайта Space Game, который запускается в стэйджинг среде.
Чтобы сделать план тестирования более гибким, версия использует свойство JMeter. Подумайте о свойстве как переменной, которую можно задать из командной строки.
Вот как определяется переменная hostname
в JMeter:
Вот как переменная hostname
использует функцию __P для чтения переменной hostname
.
Соответствующий файл плана тестирования, 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)
Давайте добавим переменные конвейера, прежде чем обновлять конфигурацию конвейера. Для этого сделайте:
В Azure DevOps перейдите к проекту Space Game — web — нефункциональные тесты.
В разделе Конвейерывыберите библиотеку.
Выберите группу переменных выпуска.
В разделе Переменныевыберите опцию + Добавить.
Введите имя переменной STAGING_HOSTNAME. Введите URL-адрес экземпляра службы приложений, соответствующий промежуточной среде, например tailspin-space-game-web-staging-1234.azurewebsites.net.
Важный
Не включайте префикс протокола
http://
илиhttps://
в значение. JMeter предоставляет протокол при выполнении тестов.Добавьте вторую переменную с именем jmeterVersion. Для его значения укажите 5.4.3.
Заметка
Это версия JMeter, которую мы в последний раз использовали для тестирования этого модуля. Чтобы получить последнюю версию, перейдите к скачайте Apache JMeter.
Чтобы сохранить вашу переменную в конвейер, выберите Сохранить ближе к верху страницы.
Ваша группа переменных похожа на ту, что показана на следующем рисунке:
Изменение конфигурации конвейера
В этом разделе вы измените конвейер для выполнения нагрузочных тестов на этапе промежуточной проверки.
В 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 поможет визуализировать результаты теста.
- Задача
В интегрированном терминале добавьте azure-pipelines.yml в индекс, зафиксируйте изменения и отправьте ветвь до GitHub.
git add azure-pipelines.yml git commit -m "Run load tests with Apache JMeter" git push origin jmeter
Просмотрите выполнение тестов в Azure Pipelines
Здесь вы увидите запуск конвейера. Вы увидите, что нагрузочные тесты будут выполняться во время промежуточного этапа.
В Azure Pipelines перейдите к сборке и отслеживайте ее выполнение.
Во время стадии тестированиявы увидите запуск нагрузочных тестов после развертывания веб-сайта.
После завершения сборки перейдите на страницу сводки.
Вы видите, что развертывание и нагрузочные тесты успешно завершены.
В верхней части страницы обратите внимание на сводку.
Вы видите, что результат сборки для веб-сайта Space Game публикуется как и всегда. Также обратите внимание на раздел Тесты и покрытие, в котором показано, что нагрузочные тесты успешно пройдены.
Выберите сводку теста, чтобы просмотреть полный отчет.
В отчете показано, что оба теста прошли.
Если какой-либо тест завершился ошибкой, вы увидите подробные результаты сбоя. Из этих результатов можно изучить источник сбоя.
Помните, что XSLT-файл создает JUnit-файл с именем JUnit.xml. Файл JUnit отвечает на эти два вопроса:
- Среднее время запроса меньше одной секунды?
- Занимает ли выполнение менее 10 процентов запросов больше одной секунды?
В докладе показано, что эти требования выполнены. Чтобы просмотреть дополнительные сведения, выберите стрелку результата в отчете. Затем убедитесь, что выбран только Пройденные.
Вы видите, что тесты среднее время отклика и максимальное время отклика успешно выполнены.
Заметка
Вы используете план службы приложений B1, который работает на базовом уровне . Этот план предназначен для приложений с низкими требованиями к трафику, например приложениям в тестовой среде. Из-за этого плана производительность веб-сайта может быть меньше, чем вы ожидаете. На практике вы бы выбрали план для среды , которая в максимальной степени соответствует вашей рабочей среде. Например, планы "Стандартный " и "Премиум " предназначены для рабочих нагрузок. Они выполняются на выделенных экземплярах виртуальных машин.