2017-06-21 98 views
0

我想使用Apache JMeter提供的API来创建和运行来自Java程序的测试脚本,以使用Jedis插件测试Redis服务器。 我有两块代码:创建并运行一个JMeter测试计划和一些我想实际执行的Jedis命令。我不知道如何将它们结合在一起。请指点我如何可以将这些命令Jedis在JMeter测试计划执行:获取Jedis与JMeter Engine的合作

== JMeter的代码==

 // 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(); 

== Jedis代码==

private static final String LOCAL_HOST = "localhost"; 
    private static final int PORT = 6379; 

    private final JedisPool m_jedisPool; 
    private Jedis m_jedis; 

    m_jedisPool = new JedisPool(new JedisPoolConfig(), LOCAL_HOST, PORT) 

    void test() { 
      m_jedis = m_jedisPool.getResource(); 
      m_jedis.flushAll(); 

      // Run test 
      Jedis jedis = getExistingJedisInstance(); 
      jedis.set(TEST_KEY, TEST_VALUE).equals("OK"); 

      // After test; 
      m_jedis.close(); 
      m_jedisPool.destroy(); 
     } 

附:我知道Redis Data Set插件,但它不适用于我,因为它不支持set命令。

回答

0

您可以添加JSR223 Sampler,把你的Jedis代码存在(只要确保你拥有所有在类路径中需要依赖.jar文件)

相关的代码添加到采样测试计划编程看起来会像:

import java.io.File; 
import java.io.FileOutputStream; 
import java.util.UUID; 
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.java.sampler.JSR223Sampler; 
import org.apache.jmeter.reporters.ResultCollector; 
import org.apache.jmeter.reporters.Summariser; 
import org.apache.jmeter.save.SaveService; 
import org.apache.jmeter.testbeans.gui.TestBeanGUI; 
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.jmeter.util.ScriptingTestElement; 
import org.apache.jorphan.collections.HashTree; 


public class JedisExample { 

    public static void main(String[] argv) throws Exception { 

     File jmeterHome = new File("c:/apps/jmeter"); 
     String slash = System.getProperty("file.separator"); 

     File jmeterProperties = new File(jmeterHome.getPath() + slash + "bin" + slash + "jmeter.properties"); 

     //JMeter Engine 
     StandardJMeterEngine jmeter = new StandardJMeterEngine(); 

     //JMeter initialization (properties, log levels, locale, etc) 
     JMeterUtils.setJMeterHome(jmeterHome.getPath()); 
     JMeterUtils.loadJMeterProperties(jmeterProperties.getPath()); 
     JMeterUtils.initLocale(); 

     // JMeter Test Plan, basically JOrphan HashTree 
     HashTree testPlanTree = new HashTree(); 

     JSR223Sampler jedisSampler = new JSR223Sampler(); 
     jedisSampler.setName("Jedis Sampler"); 
     jedisSampler.setProperty("script", "def LOCAL_HOST = \"localhost\"\n" 
       + "def PORT = 6379\n" 
       + "\n" 
       + "\n" 
       + "def m_jedisPool = new JedisPool(new JedisPoolConfig(), LOCAL_HOST, PORT)\n" 
       + "\n" 
       + "\n" 
       + "def m_jedis = m_jedisPool.getResource()\n" 
       + "m_jedis.flushAll()\n" 
       + "\n" 
       + "// Run test\n" 
       + "def jedis = getExistingJedisInstance()\n" 
       + "jedis.set(TEST_KEY, TEST_VALUE).equals(\"OK\")\n" 
       + "\n" 
       + "// After test\n" 
       + "m_jedis.close()\n" 
       + "m_jedisPool.destroy()"); 
     jedisSampler.setProperty("scriptLanguage", ScriptingTestElement.DEFAULT_SCRIPT_LANGUAGE); 
     jedisSampler.setProperty("cacheKey", UUID.randomUUID().toString()); 
     jedisSampler.setProperty(TestElement.TEST_CLASS, JSR223Sampler.class.getName()); 
     jedisSampler.setProperty(TestElement.GUI_CLASS, TestBeanGUI.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("Jedis 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("Jedis Test Plan"); 
     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(jedisSampler); 

     // save generated test plan to JMeter's .jmx file format 
     SaveService.saveTree(testPlanTree, new FileOutputStream(jmeterHome + slash + "jedis.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 + "jedis.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 + "jedis.jtl file for results"); 
     System.out.println("JMeter .jmx script is available at " + jmeterHome + slash + "jedis.jmx"); 
     System.exit(0); 


    } 

} 

参考文献:

+0

谢谢你这么多德米特里!试图让这个代码工作:) – SeraphimaTW

+0

嗨德米特里。你的建议使用JSR223取样器帮助了我很多!现在我正在努力解决另一个问题。我的目标是将延迟和吞吐量记录到每个事务的文件中,然后针对每个方案对延迟和吞吐量的平均值和最大/最小值进行汇总。 – SeraphimaTW

+0

目前我有这样的代码:String csvLogFile = JMETER_REPORTS_HOME + testName +“-summary.csv”; ResultCollector csvlogger = new ResultCollector(summer); csvlogger.setFilename(csvLogFile); testPlanTree.add(testPlanTree.getArray()[0],csvlogger)); – SeraphimaTW