Exercício - Executar testes de carga no Azure Pipelines

Concluído

Nesta seção, você executará o plano de teste criado no pipeline de versão. O plano de teste usa o Apache JMeter para executar testes de carga.

Veja como executar os testes:

  • Procure e confira uma ramificação do Git que implementa os testes.
  • Modifique seu pipeline para instalar o JMeter, execute o plano de teste, transforme os resultados em JUnit e publique os resultados no Azure Pipelines.
  • Envie sua ramificação para o GitHub, observe a execução dos testes no Azure Pipelines e examine os resultados.

Buscar a ramificação no GitHub

Nesta seção, você buscará a ramificação jmeter no GitHub e fará check-out, ou alternará para, essa ramificação.

Este ramo contém o projeto Space Game com que trabalhou nos módulos anteriores. Também contém uma configuração do Azure Pipelines para começar.

  1. No Visual Studio Code, abra o terminal integrado.

  2. Para baixar uma ramificação chamada jmeter do repositório da Microsoft e alternar para essa ramificação, execute os seguintes comandos git fetch e git checkout:

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

    Lembre-se de que upstream refere-se ao repositório Microsoft GitHub. A configuração do Git do seu projeto compreende o controle remoto upstream porque você configura essa relação quando bifurcou o projeto do repositório da Microsoft e o clonou localmente.

    Em breve, você enviará essa ramificação para o repositório GitHub, conhecido como origin.

  3. Opcionalmente, no Visual Studio Code, abra o arquivo azure-pipelines.yml. Revise a configuração inicial.

    A configuração é semelhante às que você criou nos módulos anteriores neste caminho de aprendizagem. Ele constrói apenas a configuração de Release do aplicativo. Por uma questão de brevidade, ele omite os gatilhos, aprovações manuais e testes que você configurou nos módulos anteriores.

    Observação

    Uma configuração mais robusta pode especificar as ramificações que participam do processo de compilação. Por exemplo, para ajudar a verificar a qualidade do código, você pode executar testes de unidade sempre que enviar uma alteração em qualquer ramificação. Você também pode implantar o aplicativo em um ambiente que executa testes mais exaustivos. Mas fazes essa implantação apenas quando existe um pull request, quando há um release candidate, ou quando mesclas código para o ramo principal .

    Para obter mais informações, consulte Implementar um fluxo de trabalho de código em seu pipeline de compilação usando o Git e o GitHub e gatilhos de pipeline de compilação.

  4. Opcionalmente, no Visual Studio Code, você pode verificar o arquivo de plano de teste JMeter, LoadTest.jmxe a transformação XLST, JMeter2JUnit.xsl. O arquivo XLST transforma a saída JMeter em JUnit para que o Azure Pipelines possa visualizar os resultados.

Adicionar variáveis aos Pipelines do Azure

O plano de teste original da equipa fornece um valor em código rígido para o nome do host do site Space Game que opera no ambiente de estágio .

Para tornar o plano de teste mais flexível, sua versão usa uma propriedade JMeter. Pense em uma propriedade como uma variável que você pode definir a partir da linha de comando.

Veja como a variável hostname é definida no JMeter:

Captura de tela da configuração da variável hostname no Apache JMeter.

Veja como a variável hostname usa a função __P para ler a variável hostname.

Captura de tela para ler a variável hostname no Apache JMeter.

O arquivo de plano de teste correspondente, LoadTest.jmx, especifica essa variável e a usa para definir o nome do host.

Ao executar o JMeter a partir da linha de comando, você usa o argumento -J para definir a propriedade hostname. Aqui está um exemplo:

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

Aqui, você define a variável STAGING_HOSTNAME no Azure Pipelines. Essa variável aponta para o nome do host do seu site que é executado no Serviço de Aplicação em seu ambiente de de preparação. Você também define o jmeterVersion para especificar a versão do JMeter a ser instalada.

Quando o agente é executado, essas variáveis são exportadas automaticamente para o agente como variáveis de ambiente, para que a configuração do pipeline possa executar o JMeter da seguinte maneira:

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

Vamos adicionar as variáveis do pipeline agora, antes de atualizar a configuração do seu pipeline. Para tal:

  1. No Azure DevOps, vá para o seu projeto Space Game - web - testes não funcionais.

  2. Em Pipelines, selecione Biblioteca.

  3. Selecione o grupo de variáveis Release.

  4. Em Variáveis, selecione + Adicionar.

  5. Para o nome da variável, digite STAGING_HOSTNAME. Para o seu valor, insira a URL da instância do Serviço de Aplicativo que corresponde ao seu ambiente de preparação , como tailspin-space-game-web-staging-1234.azurewebsites.net.

    Importante

    Não inclua os prefixos de protocolo http:// ou https:// no seu valor. O JMeter fornece o protocolo quando os testes são executados.

  6. Adicione uma segunda variável chamada jmeterVersion. Para o seu valor, especifique 5.4.3.

    Observação

    Esta é a versão do JMeter que usamos pela última vez para testar este módulo. Para obter a versão mais recente, consulte Download Apache JMeter.

  7. Para salvar sua variável no pipeline, selecione Salvar na parte superior da página.

    Seu grupo de variáveis é semelhante ao mostrado na imagem a seguir:

    Captura de tela do Azure Pipelines, mostrando o grupo de variáveis. O grupo contém cinco variáveis.

Modificar a configuração do pipeline

Nesta seção, você modificará o pipeline para executar seus testes de carga durante a fase de preparo no estágio.

  1. No Visual Studio Code, abra o arquivo azure-pipelines.yml. Em seguida, modifique o arquivo da seguinte maneira:

    Dica

    Você pode substituir o arquivo inteiro ou apenas atualizar a parte realçada.

    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
    

    Aqui está um resumo das alterações:

    • O trabalho RunLoadTests faz testes de carga a partir de um agente Linux.
    • O trabalho RunLoadTests depende do trabalho Deploy para garantir que os trabalhos sejam executados na ordem correta. Você precisa implantar o site no Serviço de Aplicativo antes de executar os testes de carga. Se você não especificar essa dependência, os trabalhos dentro do estágio poderão ser executados em qualquer ordem ou em paralelo.
    • A primeira tarefa script baixa e instala o JMeter. A variável de pipeline jmeterVersion especifica a versão do JMeter a ser instalada.
    • A segunda tarefa script executa o JMeter. O argumento -J define a propriedade hostname no JMeter lendo a variável STAGING_HOSTNAME do pipeline.
    • A terceira tarefa script instala xsltproc, um processador XSLT, e transforma a saída JMeter em JUnit.
    • A tarefa PublishTestResults@2 publica o relatório JUnit que resulta, JUnit.xml, na pipeline. Os Pipelines do Azure podem ajudá-lo a visualizar os resultados do teste.
  2. No terminal integrado, adicione azure-pipelines.yml ao índice, confirme as alterações e envie a ramificação para o GitHub.

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

Assista ao Azure Pipelines executar os testes

Aqui, você verá o pipeline funcionar. Você verá os testes de carga a serem executados durante a Fase de Staging.

  1. No Azure Pipelines, vá para a compilação e rastreie-a à medida que é executada.

    Durante de preparação, você verá os testes de carga executados após a implantação do site.

  2. Depois que a compilação terminar, vá para a página de resumo.

    Captura de tela do Azure Pipelines, mostrando os estágios concluídos.

    Você vê que a implantação e os testes de carga foram concluídos com êxito.

  3. Perto do topo da página, anote o resumo.

    Você vê que o artefato de construção para o site Space Game é publicado como de costume. Observe também a seção Testes e cobertura, que mostra que os testes de carga foram aprovados.

    Uma captura de tela do Azure Pipelines, mostrando o resumo do teste.

  4. Selecione o resumo do teste para ver o relatório completo.

    O relatório mostra que ambos os testes foram aprovados.

    Captura de tela do Azure Pipelines, mostrando o relatório de teste completo.

    Se algum teste falhasse, você veria resultados detalhados da falha. A partir desses resultados, você pode investigar a origem da falha.

    Lembre-se de que o arquivo XSLT produz um arquivo JUnit chamado JUnit.xml. O arquivo JUnit responde a estas duas perguntas:

    • O tempo médio de solicitação é inferior a um segundo?
    • Menos de 10% das solicitações levam mais de um segundo para serem concluídas?

    O relatório prova que estes requisitos estão preenchidos. Para ver mais detalhes, selecione a seta Resultado no relatório. Em seguida, certifique-se de que apenas Passed está selecionado.

    Captura de tela de Filtragem passou nos testes no relatório de teste.

    Você vê que os casos de teste Tempo Médio de Resposta e Tempo de Resposta Máximo foram bem-sucedidos.

    Captura de tela do relatório de teste, mostrando dois casos de teste bem-sucedidos.

Observação

Você está usando o plano de Serviço de Aplicação B1, que é executado na camada Básica . Este plano destina-se a aplicações com baixos requisitos de tráfego, tais como aplicações num ambiente de teste. Devido a esse plano, o desempenho do seu site pode ser menor do que você espera. Na prática, escolherias um plano para o ambiente de preparação que mais se aproximasse do teu ambiente de produção. Por exemplo, os planos Standard e Premium são para cargas de trabalho de produção. Eles são executados em instâncias de máquina virtual dedicadas.