【问题标题】:Get Jedis work with JMeter Engine让 Jedis 使用 JMeter 引擎
【发布时间】:2017-11-23 18:34:08
【问题描述】:

我想使用 Apache JMeter 提供的 API 从 Java 程序创建和运行测试脚本,以使用 Jedis 插件测试 Redis 服务器。 我有 2 段代码:创建和运行 JMeter 测试计划和一些我想要实际执行的 Jedis 命令。而且我不知道如何将它们组合在一起。请建议我如何将这些 Jedis 命令包含在 JMeter 测试计划中:

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

==绝地密码==

    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 命令。

【问题讨论】:

    标签: java maven redis jmeter jedis


    【解决方案1】:

    您可以添加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);
    
    
        }
    
    }
    

    参考资料:

    【讨论】:

    • 非常感谢德米特里!试图让这段代码工作:)
    • 嗨德米特里。您对使用 JSR223 Sampler 的建议对我帮助很大!现在我正在努力解决另一个问题。我的目标是将每个事务的延迟和吞吐量记录到文件中,然后对每个场景进行总结,其中包含延迟和吞吐量的平均值和最大/最小值。
    • 目前我有这个代码:String csvLogFile = JMETER_REPORTS_HOME + testName + "-summary.csv"; ResultCollector csvlogger = new ResultCollector(summer); csvlogger.setFilename(csvLogFile); testPlanTree.add(testPlanTree.getArray()[0], csvlogger));
    • 但以这种方式,它只记录每个事务的信息,并且没有吞吐量,报告的延迟只是 0(没有任何小数部分)。你知道有什么办法可以配置吗?
    • 我已经回答了您关于 2 码位集成的问题,接下来要做什么完全取决于您。对于延迟检查SampleResult.setLatency() 方法(您需要自己计算值)。吞吐量应该已经存在,因为 JMeter 会自动计算它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 2015-04-23
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多