Упражнение. Выполнение нагрузочных тестов в 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 проекта понимает вышестоящий удаленный, так как вы настроили эту связь при создании вилки проекта из репозитория Майкрософт и клонировали его локально.
Через некоторое время вы отправите эту ветвь в репозиторий GitHub, известный как
origin
.При необходимости в Visual Studio Code откройте файл azure-pipelines.yml . Просмотрите начальную конфигурацию.
Конфигурация напоминает те, которые вы создали в предыдущих модулях в этом пути обучения. Он создает только конфигурацию выпуска приложения. Для краткости он окунит триггеры, утверждения вручную и тесты, настроенные в предыдущих модулях.
Примечание.
Более надежная конфигурация может указывать ветви, участвующие в процессе сборки. Например, чтобы помочь проверить качество кода, можно запускать модульные тесты каждый раз при отправке изменений в любой ветви. Вы также можете развернуть приложение в среде, которая выполняет более исчерпывающее тестирование. Но это развертывание выполняется только при наличии запроса на вытягивание, когда у вас есть релиз-кандидат или когда вы выполняете слияние кода с главной версией.
Дополнительные сведения см. в разделе "Реализация рабочего процесса кода в конвейере сборки" с помощью триггеров конвейера сборки и 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 - Nonfunctional test .
В разделе "Конвейеры" выберите библиотеку.
Выберите группу переменных выпуска .
В разделе "Переменные" нажмите кнопку +Добавить.
Введите имя переменной 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
устанавливает обработчик XSLT xsltproc и преобразует выходные данные 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 Служба приложений, который выполняется на уровне "Базовый". Этот план предназначен для приложений с низкими требованиями к трафику, например приложениям в тестовой среде. Из-за этого плана производительность веб-сайта может быть меньше, чем вы ожидаете. На практике вы выбрали план промежуточной среды, которая более тесно соответствует рабочей среде. Например, планы "Стандартный" и "Премиум" предназначены для рабочих нагрузок. Они выполняются на выделенных экземплярах виртуальных машин.