tutorial online jmeter4 features java api automated-tests jmeter

online - ¿Cómo crear y ejecutar las secuencias de comandos de prueba de Apache JMeter desde un programa Java?



jmeter tutorial (4)

Quiero utilizar la API proporcionada por Apache JMeter para crear y ejecutar scripts de prueba desde un programa Java. He entendido los conceptos básicos de ThreadGroup y Samplers. Puedo crear esos en mi clase Java usando la API de JMeter.

ThreadGroup threadGroup = new ThreadGroup(); LoopController lc = new LoopController(); lc.setLoops(5); lc.setContinueForever(true); threadGroup.setSamplerController(lc); threadGroup.setNumThreads(5); threadGroup.setRampUp(1); HTTPSampler sampler = new HTTPSampler(); sampler.setDomain("localhost"); sampler.setPort(8080); sampler.setPath("/jpetstore/shop/viewCategory.shtml"); sampler.setMethod("GET"); Arguments arg = new Arguments(); arg.addArgument("categoryId", "FISH"); sampler.setArguments(arg);

Sin embargo, no tengo idea de cómo crear un script de prueba que combine el grupo de hilos y la muestra y luego lo ejecute desde el mismo programa. ¿Algunas ideas?



Creé un proyecto simple de prueba de concepto utilizando JMeter Java Api con dependencias Maven: https://github.com/piotrbo/jmeterpoc

Puede generar el archivo jmx del proyecto JMeter y ejecutarlo desde la línea de comandos o ejecutarlo directamente desde el código java.

Fue un poco complicado ya que el archivo jmx requiere la existencia del atributo ''guiclass'' para cada TestElement. Para ejecutar jmx, es suficiente agregar guiclass (incluso con un valor incorrecto). Para abrir en la GUI de JMeter se requiere poner el valor correcto para cada guiclass .

Un problema mucho más molesto son los controladores de flujo basados ​​en condiciones. JMeter API no le ofrece mucho más que GUI. Aún necesita pasar una condition por ejemplo, en IfController como String normal. Una cadena debe contener javascript. Entonces tiene un proyecto basado en Java con javascript, por ejemplo, un error de sintaxis y no lo sabrá hasta que ejecute su prueba de rendimiento :-(

Probablemente una mejor alternativa para quedarse con el código y el soporte de IDE, en cambio, JMeter GUI es aprender un poco de Scala y usar http://gatling.io/


Si entiendo correctamente, quiere ejecutar un plan de prueba completo programáticamente desde dentro de un programa Java. Personalmente, me resulta más fácil crear un archivo de plan .JMX de prueba y ejecutarlo en el modo JMeter que no es GUI :)

Aquí hay un ejemplo simple de Java basado en el controlador y la muestra usados ​​en la pregunta original.

import org.apache.jmeter.control.LoopController; import org.apache.jmeter.engine.StandardJMeterEngine; import org.apache.jmeter.protocol.http.sampler.HTTPSampler; import org.apache.jmeter.testelement.TestElement; import org.apache.jmeter.testelement.TestPlan; import org.apache.jmeter.threads.SetupThreadGroup; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.collections.HashTree; public class JMeterTestFromCode { public static void main(String[] args){ // Engine StandardJMeterEngine jm = new StandardJMeterEngine(); // jmeter.properties JMeterUtils.loadJMeterProperties("c:/tmp/jmeter.properties"); HashTree hashTree = new HashTree(); // HTTP Sampler HTTPSampler httpSampler = new HTTPSampler(); httpSampler.setDomain("www.google.com"); httpSampler.setPort(80); httpSampler.setPath("/"); httpSampler.setMethod("GET"); // Loop Controller TestElement loopCtrl = new LoopController(); ((LoopController)loopCtrl).setLoops(1); ((LoopController)loopCtrl).addTestElement(httpSampler); ((LoopController)loopCtrl).setFirst(true); // Thread Group SetupThreadGroup threadGroup = new SetupThreadGroup(); threadGroup.setNumThreads(1); threadGroup.setRampUp(1); threadGroup.setSamplerController((LoopController)loopCtrl); // Test plan TestPlan testPlan = new TestPlan("MY TEST PLAN"); hashTree.add("testPlan", testPlan); hashTree.add("loopCtrl", loopCtrl); hashTree.add("threadGroup", threadGroup); hashTree.add("httpSampler", httpSampler); jm.configure(hashTree); jm.run(); } }

Dependencias

Estos son los mínimos JAR mínimos necesarios en base a JMeter 2.9 y al HTTPSampler utilizado. Probablemente, otros samplers tendrán diferentes dependencias JAR de biblioteca.

  • ApacheJMeter_core.jar
  • jorphan.jar
  • avalon-framework-4.1.4.jar
  • ApacheJMeter_http.jar
  • commons-logging-1.1.1.jar
  • logkit-2.0.jar
  • oro-2.0.8.jar
  • commons-io-2.2.jar
  • commons-lang3-3.1.jar

Nota

  • También conecté la ruta a jmeter.properties en c: / tmp en Windows después de copiarlo primero del directorio de instalación / bin de JMeter.
  • No estaba seguro de cómo configurar un proxy directo para HTTPSampler.

package jMeter; import java.io.File; import java.io.FileOutputStream; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.config.gui.ArgumentsPanel; import org.apache.jmeter.control.LoopController; import org.apache.jmeter.control.gui.LoopControlPanel; import org.apache.jmeter.control.gui.TestPlanGui; import org.apache.jmeter.engine.StandardJMeterEngine; import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui; import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy; import org.apache.jmeter.reporters.ResultCollector; import org.apache.jmeter.reporters.Summariser; import org.apache.jmeter.save.SaveService; import org.apache.jmeter.testelement.TestElement; import org.apache.jmeter.testelement.TestPlan; import org.apache.jmeter.threads.ThreadGroup; import org.apache.jmeter.threads.gui.ThreadGroupGui; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.collections.HashTree; public class JMeterFromScratch { public static void main(String[] argv) throws Exception { String jmeterHome1 = "/home/ksahu/apache-jmeter-2.13"; File jmeterHome=new File(jmeterHome1); // JMeterUtils.setJMeterHome(jmeterHome); String slash = System.getProperty("file.separator"); if (jmeterHome.exists()) { File jmeterProperties = new File(jmeterHome.getPath() + slash + "bin" + slash + "jmeter.properties"); if (jmeterProperties.exists()) { //JMeter Engine StandardJMeterEngine jmeter = new StandardJMeterEngine(); //JMeter initialization (properties, log levels, locale, etc) JMeterUtils.setJMeterHome(jmeterHome.getPath()); JMeterUtils.loadJMeterProperties(jmeterProperties.getPath()); JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level JMeterUtils.initLocale(); // JMeter Test Plan, basically JOrphan HashTree HashTree testPlanTree = new HashTree(); // First HTTP Sampler - open example.com HTTPSamplerProxy examplecomSampler = new HTTPSamplerProxy(); examplecomSampler.setDomain("www.google.com"); examplecomSampler.setPort(80); examplecomSampler.setPath("/"); examplecomSampler.setMethod("GET"); examplecomSampler.setName("Open example.com"); examplecomSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName()); examplecomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName()); // Second HTTP Sampler - open blazemeter.com HTTPSamplerProxy blazemetercomSampler = new HTTPSamplerProxy(); blazemetercomSampler.setDomain("www.tripodtech.net"); blazemetercomSampler.setPort(80); blazemetercomSampler.setPath("/"); blazemetercomSampler.setMethod("GET"); blazemetercomSampler.setName("Open blazemeter.com"); blazemetercomSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName()); blazemetercomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName()); // Loop Controller LoopController loopController = new LoopController(); loopController.setLoops(1); loopController.setFirst(true); loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName()); loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName()); loopController.initialize(); // Thread Group ThreadGroup threadGroup = new ThreadGroup(); threadGroup.setName("Example Thread Group"); threadGroup.setNumThreads(1); threadGroup.setRampUp(1); threadGroup.setSamplerController(loopController); threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName()); threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName()); // Test Plan TestPlan testPlan = new TestPlan("Create JMeter Script From Java Code"); testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName()); testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName()); testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement()); // Construct Test Plan from previously initialized elements testPlanTree.add(testPlan); HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup); threadGroupHashTree.add(blazemetercomSampler); threadGroupHashTree.add(examplecomSampler); // save generated test plan to JMeter''s .jmx file format SaveService.saveTree(testPlanTree, new FileOutputStream(jmeterHome + slash + "example.jmx")); //add Summarizer output to get test progress in stdout like: // summary = 2 in 1.3s = 1.5/s Avg: 631 Min: 290 Max: 973 Err: 0 (0.00%) Summariser summer = null; String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary"); if (summariserName.length() > 0) { summer = new Summariser(summariserName); } // Store execution results into a .jtl file String logFile = jmeterHome + slash + "example.jtl"; ResultCollector logger = new ResultCollector(summer); logger.setFilename(logFile); testPlanTree.add(testPlanTree.getArray()[0], logger); // Run Test Plan jmeter.configure(testPlanTree); jmeter.run(); System.out.println("Test completed. See " + jmeterHome + slash + "example.jtl file for results"); System.out.println("JMeter .jmx script is available at " + jmeterHome + slash + "example.jmx"); System.exit(0); } } System.err.println("jmeter.home property is not set or pointing to incorrect location"); System.exit(1); } }