java - 让 Jedis 与 JMeter 引擎一起工作

标签 java maven redis jmeter jedis

我想使用 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 数据集插件,但它对我不起作用,因为它不支持设置命令。

最佳答案

您可以添加 JSR223 Sampler并将你的 Jedis 代码放在那里(只要确保你在类路径中有所有必要的依赖 .jars)

以编程方式将采样器添加到测试计划的相关代码如下所示:

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


    }

}

引用资料:

关于java - 让 Jedis 与 JMeter 引擎一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44666204/

相关文章:

java - 在布局中添加子项时无法将焦点放在 editText 上

java - 从注释中抛出异常

java - 从代码覆盖中排除枚举类?

redis - 如果 master 在给定时间内关闭,则杀死 Redis Slave

ruby - Sidekiq 使作业入队,而不是使它们出队

java - 如何比较非英语字符和重音符号

java - 如何防止 java.awt.List 覆盖 javax.swing.JMenu

java - 无法找到 XML 模式 namespace springframework 上下文的 Spring NamespaceHandler

xml - 在 WebProject 的类路径中找不到任何 META-INF/persistence.xml 文件

database - Redis 是否适合像 Twitter 一样存储和检索针对用户的消息?