Pré-requisito
Este tutorial contém estratégias e procedimentos para criar e executar um teste de carga dinâmico contra um serviço ArcGIS Server e pressupõe que você esteja familiarizado com alguns dos conceitos básicos do Apache JMeter. Se você é novo no Apache JMeter, por favor veja nosso Teste de Desempenho com Apache JMeter (Uma Introdução).

Estratégias de Teste JMeter
Antes de mergulhar nos detalhes sobre a construção e validação de um teste de carga orientado a dados, é importante primeiro discutir algumas estratégias de teste específicas para o JMeter. Essas dicas são diferentes dos itens listados em nosso Estratégias Recomendadas para Teste de Carga em uma Implantação ArcGIS Server Artigo que é destinado ao uso com qualquer ferramenta de teste (mas também aplicável ao JMeter).
Um Bom Plano de Teste Começa com uma Estrutura de Pastas Adequada
Uma tática que pode ajudar no gerenciamento de múltiplos testes e múltiplos relatórios no JMeter é implementar uma estrutura de pastas simples mas consistente para armazenar os vários elementos de cada teste. O principal motor para um teste JMeter é o arquivo JMX… é onde toda a lógica do teste reside. Mas à medida que você continua adicionando recursos ao seu teste e executando-o várias vezes, você vai expandir além do gerenciamento apenas do arquivo JMX único.
Um pouco de organização ajuda muito… criar manualmente alguns diretórios chave pode ajudar a gerenciar os vários arquivos JMeter que irão povoar o disco rígido ao longo do tempo.
Nota: Esta abordagem é feita a partir do sistema de arquivos do Sistema Operacional e não diretamente do Apache JMeter.
Uma estrutura de pastas recomendada:
- nome_do_projeto (o arquivo JMX deve ser armazenado dentro dele usando o mesmo nome)
- datasets
- Conterá arquivos de dados que tornam nossas requisições dinâmicas a cada iteração do teste
- logs
- Conterá logs de depuração do ambiente de teste JMeter
- reports
- Conterá relatórios gerados pelo JMeter
- results
- Conterá arquivos de resultados dos testes JMeter
- Estes são os arquivos RAW dos resultados e o artefato mais importante do teste
- uploads
- Conterá arquivos que devem ser enviados
Dentro da pasta "projeto", 5 diretórios vazios seriam criados: datasets, logs, reports, results e uploads.
Variáveis Definidas pelo Usuário
Assim como a estrutura de pastas mencionada acima, utilizar Variáveis Definidas pelo Usuário é uma estratégia de construção de teste que favorece portabilidade, reutilização e compartilhamento do Plano de Teste. Algumas variáveis comuns usadas em um teste de serviço ArcGIS são:
- PastaProjeto
- NomeServidorWeb
- NomeInstanciaServidor
- PortaSegura
- NomeServico
No Plano de Teste JMeter, essas variáveis podem ser facilmente referenciadas com a notação como: ${NomeServico} que seria automaticamente substituída pelo nome do serviço na hora da execução. Usar variáveis é menos propenso a erros do que usar valores codificados se você planeja usar o teste em outro ambiente. Quando o teste for executado contra outra implantação, o testador só precisa ajustar a definição da variável. Para Planos de Teste com muitas amostras definidas HTTP Request, isso pode economizar muito tempo.
Escolhendo o Grupo Thread Correto
Existem várias opções quando se trata de definir sua lógica de carga em etapas. Todas são similares e oferecem a mesma funcionalidade básica, mas têm algumas diferenças sutis. Thread Group é uma boa escolha segura que oferece máxima portabilidade do teste pois está incluído no produto core do JMeter.
Dito isso, usar o Gerenciador de Plugins JMeter (instalado como parte do Teste de Desempenho com Apache JMeter (Uma Introdução)) para adicionar os “Custom Thread Groups” pode fornecer ao ambiente de teste algumas outras opções úteis nesta área.
Adicionando Suporte para Custom Thread Groups no JMeter
A partir do Gerenciador de Plugins dentro do JMeter (Opções-->Gerenciador de Plugins):
- Selecione Plugins Disponíveis
- Encontre e selecione Custom Threads Groups
- Selecione Aplicar Alterações e Reinicie o JMeter

Uma vez que o plugin “Custom Thread Groups” está instalado, uma alternativa recomendada ao Thread Group é o bzm – Concurrency Thread Group, pois permite uma configuração direta por etapas que renderiza visualmente a pressão definida, o que é um ótimo recurso de validação do ponto de vista do teste.
Usando Transações para Agrupar Requisições
Adicionar Transações ao seu teste pode ser uma forma útil de agrupar uma ou mais requisições similares que pertencem à mesma “operação”. Por exemplo, o carregamento de uma aplicação, um zoom navegacional no mapa ou busca em formulário. Usar uma transação assim pode ajudar muito na análise pois isola a operação (ex.: busca em formulário) em seu próprio “container” lógico contendo apenas as requisições responsáveis por sua função. Enquanto isso, jogar muitas requisições, para muitas funções ou serviços diferentes em um grande grupo pode tornar o estudo pós-teste muito difícil. Com transações, a análise pode ser conduzida para entender o desempenho de cada operação, respectivamente.
Nota: Aplicações e fluxos de trabalho Map variam; algumas operações terão transações compostas por muitas requisições, outras apenas uma requisição.
Nota: O desempenho das diferentes operações em um teste nem sempre escala da mesma forma; algumas podem ter melhor desempenho que outras; ser capaz de identificar operações com baixo desempenho (por um nome único da transação) é uma boa análise.
Validar se a Resposta Está Sendo Retornada
Garantir que a resposta esperada está retornando do servidor remoto é tão importante quanto enviar a requisição. Por vários motivos, ao testar um recurso ArcGIS como um serviço, confiar apenas no código HTTP status (ex.: HTTP 200) é insuficiente.
Uma forma de validar a resposta é procurar palavras-chave no Header ou Body. Se uma imagem PNG for solicitada mas uma mensagem textual de erro for retornada em vez disso, uma regra Response Assertion procurando por “image/png” no Header marcará a tentativa como falha. Se estiver presente no Header, será considerada uma requisição sucedida .
Nota: Para cada HTTP Request que precisa ser examinada no Plano de Teste JMeter, deve ser adicionada uma regra Response Assertion.
Criando um Teste Export Map Orientado a Dados no JMeter
< P >< SPAN > Usando as estratégias acima , um Plano de Teste flexível e versátil no JMeter pode ser criado que solicita uma área diferente de interesse em um serviço ArcGIS map a cada requisição . Um “teste dinâmico” é ideal pois pode fazer os recursos do servidor trabalharem mais duro do que se os mesmos dados fossem solicitados toda vez . Tal teste é mais representativo das condições reais . </ SPAN ></ P >< P > Como testador de desempenho , queremos pegar algo como a assinatura da requisição export map abaixo e transformá-la em um teste dinâmico load test no JMeter : </ P >< P > </ P >< P > </ P >< P > </ P >< pre class = "lia-code-sample language-markup" >< code >
https://yourwebadaptor.domain.com/server/rest/services/SampleWorldCities/MapServer/export?dpi=96&transparent=true&format=png32&layers=show:0,1,2&bbox=-108.76228873935,31.0409016308382,-88.8526618315487,46.9686031570791&bboxSR=4326&imageSR=4326&size=1477,827&f=image </ code ></ pre >< P > </ P >< P > </ P >< P > </ P >< P >< SPAN > O JMeter oferece várias metodologias para construir payloads HTTP em um Plano de Teste tais como : </ SPAN ></ P >< UL >< LI >< SPAN > Criar as requisições manualmente (ex.: à mão) </ SPAN ></ LI >< LI >< SPAN > Usar o gravador embutido para capturar diretamente as requisições do navegador </ SPAN ></ LI >< LI >< SPAN > Importar de outra fonte
Este Artigo focará no primeiro método de mostrar a prática manual para criar um teste JMeter, como montar os componentes da requisição e como tornar seu comportamento "dinâmico". Este teste orientado por dados chamará o serviço de mapa SampleWorldCities (executando em sua implantação local) através da função de exportação.
Nota: Por muitas medidas, SampleWorldCities é considerado um serviço de mapa pequeno e muito leve, mas dado que é onipresente nas implantações do ArcGIS Server, é ideal para usá-lo para percorrer a criação de um teste de carga.
Criar e Salvar um Novo Plano de Teste
- Do sistema de arquivos crie a estrutura de pastas mencionada acima:
- O nome da pasta do projeto será chamado sampleworldcities1
- Assuma que isso existirá em:
- Crie os diretórios de suporte do projeto:
- Por exemplo: datasets, logs, reports, results, uploads
- Inicie o JMeter
- Salve o novo Plano de Teste que o JMeter cria na pasta sampleworldcities1 que acabou de ser criada
- Chame o Plano de Teste: sampleworldcities1.jmx
- Assuma o caminho completo do Plano de Teste jmx é:
- C:\JMeter Tests\sampleworldcities1\sampleworldcities1.jmx

- Do sistema de arquivos, a pasta do projeto ficaria assim:

Adicionando Variáveis ao Plano de Teste
- Dentro do JMeter, clique no Plano de Teste (ex: sampleworldcities1)
- Na parte inferior da Seção Variáveis Definidas pelo Usuário, clique em Adicionar
- Para Nome digite: ProjectFolder
- Para Valor digite: C:\JMeter Tests\sampleworldcities1
- Para Nome digite: WebServerName
- Para Valor digite: yourwebadaptor.domain.com
- Digite o hostname do seu Web Adaptor ou ArcGIS Server
- Para Nome digite: ServerInstanceName
- Para Valor digite: server
- Algumas implantações usam um valor diferente, ex. arcgis
- Para Nome digite: SecurePort
- Para Valor digite: 443
- Se apontando para uma instância ArcGIS Server, use 6443
- Para Nome digite: ServiceName
- Para Valor digite: SampleWorldCities

Adicionando o bzm – Concurrency Thread Group ao Plano de Teste
- Clique com o botão direito no Plano de Teste sampleworldcities1 e em Adicionar-->Threads (Users), selecione bzm – Concurrency Thread Group

- Sob o Plano de Teste sampleworldcities1, clique em bzm – Concurrency Thread Group
- Configure a lógica de carga em etapas com o seguinte:
- Concorrência Alvo: 10
- Tempo de Ramp Up (min): 20
- Contador de Etapas Ramp-Up: 10

Com o plugin bzm – Concurrency Thread Group, a lógica configurada da carga em etapas pode ser facilmente vista e confirmada visualmente no gráfico acima. Este teste será configurado para rodar por 20 minutos, aumentará a pressão usando 10 etapas diferentes (adicionando 1 thread concorrente por vez a cada 2 minutos), atingirá um máximo de 10 threads concorrentes e então parará.
Adicionando uma Transação a um Plano de Teste
- Clique com o botão direito em bzm – Concurrency Thread Group e em Adicionar-->Controlador Lógico, selecione Transaction Controller

- Uma vez adicionado, dê ao Transaction Controller (ex. a operação do fluxo) um nome significativo para distingui-lo dos outros que possam existir no teste
- Para o nome digite: MapScale_9M
- O 9M representa a escala do mapa de 9 Milhões (ex. 1: 9.244.649)
- Um ou mais HTTP Requests podem agora ser adicionados a este Transaction Controller
- Selecione “Generate parent sample” na seção do Transaction Controller
- Esta opção pode ajudar na validação pois exibe as requisições respectivas sob o objeto Transaction

Adicionando uma Requisição HTTP
Agora queremos criar uma requisição HTTP orientada por dados que pedirá uma extensão espacial diferente a cada requisição. Isso é feito com uma requisição HTTP regular do JMeter.
- Clique com o botão direito no Transaction Controller chamado MapScale_9M, e em Adicionar-->Sampler, selecione HTTP Request

- A nova Requisição HTTP vazia deve se parecer com o seguinte:

Tornando a Requisição HTTP Dinâmica
Uma assinatura da requisição para export map como:
https://yourwebadaptor.domain.com/server/rest/services/SampleWorldCities/MapServer/export?dpi=96&transparent=true&format=png32&layers=show%3A0%2C1%2C2&bbox=-108.76228873935%2C31.0409016308382%2C-88.8526618315487%2C46.9686031570791&bboxSR=4326&imageSR=4326&size=1477%2C827&f=image
contém vários componentes da URL que precisam ir para diferentes lugares na página da Requisição HTTP (para maximizar flexibilidade e manutenção). Vamos começar com os pares chave/valor da requisição separando os parâmetros da URL.
Abaixo a seção dos parâmetros foi modificada para conter várias variáveis JMeter ao invés dos valores originais. Está tudo bem que algumas partes referenciem nomes de variáveis JMeter que ainda não foram criadas no teste.
- Copie o seguinte e cole na Requisição HTTP clicando em Add from Clipboard na parte inferior:
dpi=96&transparent=true&format=png32&layers=show%3A0%2C1%2C2&bbox=${bbox_9244649}&bboxSR=${sr_9244649}&imageSR=${sr_9244649}&size=${width_9244649}%2C${height_9244649}&f=image
Isto ajudará a colocar em prática várias peças necessárias para tornar certas partes da Requisição HTTP dinâmicas.
<\/span><\/P>Na seção Web Server:Para Protocol, insira: https<\/LI>Para Server Name or IP, insira: ${WebServerName}<\/LI>Para Port Number, insira: ${SecurePort}<\/LI><\/UL><\/LI>Na seção HTTP Request:Para Path, insira: \/${ServerInstanceName}\/rest\/services\/${ServiceName}\/MapServer\/export<\/LI><\/UL><\/LI><\/UL>
<\/span><\/P>Adicionando uma Response Assertion<\/SPAN><\/H2>Clique com o botão direito no HTTP Request e em Add-->Assertions, selecione Response Assertion<\/LI><\/UL>
<\/span><\/P>Altere vários dos parâmetros da Response Assertion:Em Field to Test, selecione: Response Headers<\/LI>Em Pattern Matching Rules selecione: Contains<\/LI>Em Patterns to Test, clique em Add e insira: image\/png<\/LI><\/UL><\/LI><\/UL>
<\/span><\/P>Adicionando um CSV Data Set Config<\/H2>Clique com o botão direito no Test Plan (ex.: sampleworldcities1) e em Add-->Config Element, selecione CSV Data Set Config<\/LI><\/UL>
<\/span><\/P>Selecione o CSV Data Set Config e renomeie para CSV Data Set Config -- 9MFornecer um nome único pode ajudar na manutenção/gerenciamento se múltiplos arquivos de dados forem usados dentro de um teste (ex.: um arquivo para bounding box de cada escala de mapa)<\/LI><\/UL><\/LI><\/UL>
<\/span><\/P>Usando um editor de texto, preencha um arquivo CSV vazio com as seguintes 16 linhas de dados:<\/SPAN><\/LI><\/UL>bbox,width,height,mapUnits,sr,scale<\/SPAN><\/FONT><\/P>"-108.76228873935,31.0409016308382,-88.8526618315487,46.9686031570791",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"23.1282001284589,34.337748761293,43.03782703626,50.2654502875339",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"-117.052786808947,35.3545948648786,-97.1431599011459,51.2822963911194",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"-100.83549484975,36.0637839078502,-80.9258679419492,51.991485434091",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"17.7030587822399,34.3302705716379,37.6126856900409,50.2579720978788",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"32.2827904735659,37.2792197897781,52.192417381367,53.2069213160189",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"0.222469446585188,35.0562794764081,20.1320963543862,50.9839810026489",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"100.262489726575,20.8660021309943,120.172116634376,36.7937036572352",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"72.4186084471192,22.1748804724666,92.3282353549203,38.1025819987075",1280,1024,esriDecimalDegrees,4326,9244649<\.SPAN>
-61.2094273153097,-26.7402777397378,-41.2998004075086,-10.812576213497\',1280,
1024,
esriDecimalDegrees,
4326,
9244649
-72.5908131920005,-26.6270515481087,-52.6811862841995,-10.6993500218679\',1280,
1024,
esriDecimalDegrees,
4326,
9244649
99.7474167083529,
20.7088254145549,
119.657043616154,
36.6365269407958
102.59837658124,
20.384726879328,
122.508003489041,
36.3124284055689
80.8239612278688,
23.4521454643548,
100.73358813567,
39.3798469905956
-105.812716128284,
31.0536390717042,
-85.9030892204829,
46.9813405979451
Salve o arquivo CSV em: C:\JMeter Tests\sampleworldcities1\datasets\bbox_9244649.csv
No janela CSV Data Set Config clique em Browse e navegue até o arquivo bbox_9244649.csv que acabou de ser salvo
Configure vários itens da fonte de dados:
Mude Filename de: C:/JMeter Tests/sampleworldcities1/datasets/bbox_9244649.csv
Para: ${ProjectFolder}/datasets/bbox_9244649.csv
Para Variable Names adicione: bbox_9244649,width_9244649,height_9244649,sr_9244649
Mude Ignore first line
Mude Allow quoted data?
imagem src='https://us.v-cdn.net/6038851/uploads/images/14967iE47D78C25DEAC94E/configure_csvdatasetconfig.png'
papel='botão'
título='configure_csvdatasetconfig.png'
alto='configure_csvdatasetconfig.png'/>
h Validando o Plano de Teste < li > Use o ouvinte View Results Tree para ajudar a validar a resposta na GUI do servidor remoto < ul classe = ' lia-list-style-type-circle ' > < li > Clique com o botão direito no Plano de Teste (sampleworldcities1) e em Adicionar --> Ouvinte , selecione View Results Tree </ li > </ ul > </ li > </ ul > < p >< span classe = ' lia-inline-image-display-wrapper lia-image-align-center ' imagem-alt = ' add_viewresultstree.png ' estilo = ' largura:944 px; ' >< img src = ' https://us.v-cdn.net/6038851/uploads/images/14969i9ABAB479A5A40711/add_viewresultstree.png ' papel = ' botão ' título = ' add_viewresultstree.png ' alt = ' add_viewresultstree.png ' / ></ span ></ p > < ul > < li > Selecione View Results Tree , então clique no triângulo verde no topo da GUI do Apache JMeter </ li > </ ul > < p >< span classe = ' lia-inline-image-display-wrapper lia-image-align-center ' imagem-alt = ' play_viewresultstree.png ' estilo = ' largura:945 px; ' >< img src = ' https://us.v-cdn.net/6038851/uploads/images/14973i8FC284BC703DC47B/play_viewresultstree.png ' papel = ' botão ' título = ' play_viewresultstree.png ' alt = ' play_viewresultstree.png ' / ></ span ></ p > < ul > < li > Após a carga configurada passo a passo , JMeter começará enviando solicitações repetidamente , (inicialmente) uma por vez . < ul classe = ' lia-list-style-type-circle '> < li > O escudo verde com uma marca de seleção é um sinal de solicitação bem-sucedida , se isso for visto , aguarde alguns segundos para que algumas solicitações sejam enviadas e respostas retornadas . </ li > < li > Clicar em um dos escudos verdes MapScale_9M mostrará a aba Resultado do Sampler que exibe informações como : < ul classe = " lia-list-style-type-square "> < li > Load tempo (tempo de resposta)<\/LI>- Tamanho em bytes (Cabeçalho e Corpo)<\/LI>
- Contagem de Erros<\/LI>
- Código de Resposta<\/LI>
- ContentType<\/LI><\/UL><\/LI><\/UL><\/LI><\/UL>
Nota: Esta informação é ótima para validar a reprodução do teste, mas também útil para solução de problemas de desempenho<\/FONT><\/STRONG><\/P>
<\/span><\/P>Como este teste está exercitando a função export map, uma visualização da imagem solicitada também ajudaria na validação do Plano de Teste.Clicar na aba Response data e expandir a transação MapScale_9M deve renderizar a imagem solicitada.Repita conforme necessário para outras transações MapScale_9M<\/LI><\/UL><\/LI>Alternar entre várias das solicitações deve mostrar imagens diferentes, o que valida a criação de um teste de carga export map orientado por dados no JMeter<\/LI><\/UL><\/LI><\/UL>
<\/span><\/P> <\/P>
<\/span><\/P>Salvando Alterações Recentes<\/H2>Muitas alterações foram feitas desde o último Salvamento.<\/P>Salve o Plano de TesteArquivo-->Salvar<\/LI><\/UL><\/LI><\/UL>Para baixar o Plano de Teste Apache JMeter usado neste Artigo, veja: sampleworldcities1.zip<\/A><\/P>Para baixar uma versão deste Plano de Teste Apache JMeter com mais detalhes cobrindo escalas de mapa adicionais, veja:
sampleworldcities2.zip<\/A><\/P>