2017-06-21 100 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