Thursday, August 08, 2013

Como executar testes no JMeter (remoto) a partir do ANT

Dica útil para projetos aonde os builds são realizados pelo ANT. O projeto jmeter-ant-task define uma task customizada do ANT, para executar testes (stress / carga / ...) com o JMeter.

Na task jmeter existem diversos atributos utilizados para indicar qual é o diretório de instalação do JMeter, qual é o diretório com os planos de testes (arquivos jmx), qual diretório deve conter resultados dos testes devem ser armazenados e outros.

O trecho de build.xml a seguir demonstra como utilizar a task para executar o plano de testes MyTest.jmx. 
<project name="MyProject" basedir=".">

  <!-- define uma var que guarda a url de app qualquer -->
  <property name="app.url" value="htpp://localhost:8080/myapp" />

  <!-- vars utilizadas pelo jmeter -->
  <property name="jmeter-home" value="/opt/jmeter" />
  <property name="jmeter-lib-dir" value="${jmeter-home}/lib" />
  <property name="jmeter-results" value="/home/app/jmeter-results" />
  <property name="jmeter-tests" value="/home/app/jmeter-tests" />

  <!-- Carrega a task do JMeter -->
  <taskdef name="jmeter" classpathref="apache.ant.ext.lib.classpath" 
    classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
  
  <target name="jmeter.run" depends="" >
    <echo>Acionando o JMeter local p/ os testes de stress</echo>
    <jmeter jmeterhome="${jmeter-home}" testplan="${jmeter-tests}/MyTest.jmx"
     resultlogdir="${jmeter-results}/jtl" jmeterlogfile="${jmeter-results}/log">
     
      <property name="app.url" value="${app.url}"/>

      <!-- passa argumentos p/ a vm do jmeter -->
      <jvmarg value="-Xincgc"/>
      <jvmarg value="-Xmx128m"/>
    </jmeter>
  </target>

  ...
</project>

No inicio do build são definidas variáveis utilizadas pelo o script, boa parte delas na task jmeter. Um detalhe sobre o plano de teste é que ele depende de uma variável que indica a url da aplicação, app.urlNote o uso da tag property, nela eu repasso a variável definida no build ANT, a ${app.url} com o endereço da aplicação. Dessa é possível enviar informações para o JMeter, sem manipular o arquivo jmeter.propertiesNa tag jvmarg você pode indicar parâmetros para a VM do JMeter.

O target a seguir simila a execução do Jmeter remoto, em outro servidor. Para executar o JMeter remoto, é necessário pelo menos dois nós (instâncias) do JMeter, uma cliente e outra servidor, veja mais na documentação do projeto. O próximo target aciona o JMeter cliente, na mesma máquina que o build está sendo executado, indicando a propriedade remote_hosts. Dessa forma a instância cliente irá acionar o JMeter servidor nesse endereço indicado.
...
  <!-- host/ip para o jmeter remoto -->
  <property name="jmeter-host" value="192.168.1.18"/>
  <property name="jmeter-port" value="1099"/>

  <target name="jmeter.run.remote">
    <echo>Acionando o JMeter remoto p/ os testes de stress</echo>
    <jmeter jmeterhome="${jmeter-home}" jmeterlogfile="${jmeter-results}/log" resultlogdir="${jmeter-results}/jtl" runremote="true">
      <!-- outra forma de definir os planos de testes -->
      <testplans dir="test/jmeter/jmx" includes="MyTest.jmx"/>

      <!-- indica que essa property deve ser enviada ao jmeter server -->
      <property name="app.url" remote="true" value="${app.url}"/>

      <!-- indica a url do jmeter server -->
      <property name="remote_hosts" value="${jmeter-host}:${jmeter-port}"/>
    </jmeter>
  </target>
...

Note que a propriedade app.url foi marcada como remote="true", dessa forma o JMeter cliente repassa o valor para o JMeter servidor. Mais informações sobre essa task foram disponibilizadas na página do projeto.

http://twitter.com/edermag
http://www.yaw.com.br

2 comments:

Blogger said...

Are you looking for free Twitter Re-tweets?
Did you know you can get them AUTOMATICALLY & ABSOLUTELY FREE by getting an account on Add Me Fast?

juliano said...

Opa, muito interessante, o fera é que pode ser executado com um processo de integração contínua, usando Jenkins.