# JMeter

JMeter é uma ferramenta que realiza testes de carga e de estresse em recursos estáticos ou dinâmicos oferecidos por sistemas computacionais. Além disso, é parte do projeto Jakarta, da Apache Software Foundation.
Para a realização de testes, a ferramenta JMeter disponibiliza diversos tipos de requisições e assertions (para validar o resultado dessas requisições), além de controladores lógicos como loops (ciclos) e controles condicionais para serem utilizados na construção de planos de teste, que correspondem aos testes funcionais.
O JMeter disponibiliza também um controle de threads, chamado Thread Group, no qual é possível configurar o número de threads, a quantidade de vezes que cada thread será executada e o intervalo entre cada execução, que ajuda a realizar os testes de estresse. E, por fim, existem diversos listeners que, baseando-se nos resultados das requisições ou dos assertions, podem ser usados para gerar gráficos e tabelas.
Componentes no JMeter são recursos que podem ser utilizados para criar rotinas de testes para aplicações.

## Test Plan

Para qualquer teste que venha a ser feito utilizando o JMeter, é necessário criar um Test Plan incluindo os elementos do teste. Tais elementos podem ser:
* Thread Group — É o ponto de início, sob o qual devem estar todos os outros elementos do Test Plan. Como o próprio nome ressalta, ele controla as threads que serão executadas pelo teste.
* Controllers — São divididos em dois grupos: samplers e logic controllers.
* Samplers — São controladores pré-definidos para requisições específicas. Podem ser personalizados com a inserção de configurações (configurations), asserções (assertions) etc.
* Logic Controllers — São controladores mais genéricos. Podem ser personalizados com a inserção de outros controllers, configuration elements, assertions etc.
* Listeners — São elementos que fornecem acesso às informações obtidas pelo JMeter durante os testes.
* Timers — Por padrão, o JMeter faz requisições sem pausas entre elas. Os timers são utilizados para incluir pausas entre as requisições.
* Assertions — Usado para verificar se a resposta obtida na requisição é a esperada. Expressões regulares (Perl-style regular expression) podem ser usadas na comparação.
* Configuration Elements — Embora não faça requisições (exceto para HTTP Proxy Server), este elemento pode adicionar ou modificar as requisições.
* Pre-Processor Elements — Executa alguma ação antes de fazer a requisição. É mais usado para pré-configurações das requisições.
* Post-Processor Elements — Executa alguma ação depois de fazer a requisição. É mais usado para processar as respostas da requisição.

## Tipos de serviços

O JMeter suporta requisições dos seguintes tipos de serviços em suas rotinas de testes:
* FTP — Permite criar requisições usando o protocolo FTP (com autenticação ou não) e executa o comando de retrieve em um arquivo específico.
* HTTP — Permite criar requisições usando o protocolo HTTPS ou HTTP (com ou sem autenticação, respectivamente), podendo incluir parâmetros ou arquivos de requisição, escolher o método usado (GET ou POST) e manipular Cookies. Este sampler possui dois tipos de implementação: Java HTTP ou Commons HTTPClient.
* JDBC — Com esta requisição é possível executar queries em um banco de dados específico.
* Objeto Java — Auxilia no teste de carga de classes Java, exigindo que se implemente uma classe do tipo JavaSamplerClient para executar o método a ser testado. A estrutura deste objeto é similar à usada pelo JUnit.
* SOAP/XML-RPC — Permite enviar requisições SOAP para um WebService, ou enviar XML-RPC através do protocolo HTTP.
* LDAP — Permite enviar requisições para um servidor LDAP. Possui uma implementação simplificada e outra estendida.
* Testes JUnit — Usado para fazer teste de carga em testes de unidade que utilizam o framework JUnit.
Existem outros tipos de requisições que, até a atual versão do JMeter, estão em versão alpha. São eles: Web service (SOAP), Access Log, BeanShell, BSF, TCP, JMS Publisher, JMS Subscriber, JMS Point-to-Point.