使用 JMeter API 创建 JMX 并执行测试

一、实现 JavaSamplerClient 接口对 JavaMethod 进行测试

package com.lilith.sampler;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;


public class BravoJavaMethodSampler implements JavaSamplerClient {

    // JMeter GUI界面显示的变量
    private static final String URLNAME = "URL";

    // JMeter GUI界面变量的默认值,测试时可以根据需要自定义参数值
    private static final String DEFAULTURL = "http://www.baidu.com";


    /**
     * 决定在JMeter中要显示的属性/变量,也就是runTest中调用的方法的参数
     * 在组件加载时就会运行
     * @return
     */
    @Override
    public Arguments getDefaultParameters() {
        System.out.println("getDefaultParameters");
        Arguments arguments = new Arguments();
        arguments.addArgument(URLNAME,DEFAULTURL);
        // 也可以直接设置参数
        arguments.addArgument("username","");
        arguments.addArgument("password","");
        // 返回参数
        return arguments;
    }

    /**
     * 初始化方法
     * @param context
     */
    @Override
    public void setupTest(JavaSamplerContext context) {
        System.out.println("setUpTest");
        // 获取GUI界面输入的Value
        String username = context.getParameter("username");
        System.out.println(username);

    }

    /**
     * 这个方法就是实现具体的功能逻辑,也就是在runTest中调用被测的Java方法
     * @param context
     * @return
     */
    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        SampleResult sampleResult = new SampleResult();

        // 1.调用被测方法
        // 1.1开始调用背侧方法
        sampleResult.sampleStart();

        // 1.2调用被测方法

        // 1.3调用结束
        sampleResult.sampleEnd();
        // 2.获取被测方法的返回内容

        // 3.设置Java Sample的返回

        // 设置响应结果,将调用方法返回的结果作为ResponseData
        sampleResult.setResponseData("BravoJavaMethodSampler的响应内容","utf-8");
        // 标记响应为success
        sampleResult.setSuccessful(true);
        // 设置sampler的名字
        sampleResult.setSampleLabel("BravoSampler");

        return sampleResult;
    }

    /**
     * 最后执行,清理
     * @param context
     */
    @Override
    public void teardownTest(JavaSamplerContext context) {

    }
}
复制代码

在 JMeter GUI 界面中添加 Java Request

image.png

image.png

二、使用 JMeter API 执行本地的 JMX 文件

import org.apache.jmeter.JMeter;
import org.apache.jmeter.engine.JMeterEngineException;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.reporters.ResultCollector;
import org.apache.jmeter.reporters.Summariser;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.services.FileServer;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;

public class Demo2 {

    public static void main(String[] args) throws IllegalAccessException, IOException, JMeterEngineException, NoSuchFieldException {
        StandardJMeterEngine standardJMeterEngine=new StandardJMeterEngine();
        System.setProperty(JMeter.JMETER_NON_GUI, "true");
        JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/jmeter.properties");//本机jmeter路径
        JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/system.properties");//本机jmeter路径
        JMeterUtils.loadJMeterProperties("apache-jmeter-5.1.1/bin/user.properties");//本机jmeter路径
        JMeterUtils.setJMeterHome("/apache-jmeter-5.1.1");
        JMeterUtils.initLocale();
        JMeterUtils.initLogging();
        SaveService.loadProperties();
        File file=new File("/June/GitHub API.jmx");
        FileServer.getFileServer().setBase(file);
        FileServer.getFileServer().setScriptName(file.getName());
        Field baseField = FileServer.getFileServer().getClass().getDeclaredField("base");
        baseField.setAccessible(true);//设置允许访问
        baseField.set(FileServer.getFileServer(), file.getAbsoluteFile().getParentFile());
        HashTree scripts=SaveService.loadTree(file);
        Summariser summariser = new Summariser(JMeterUtils.getPropDefault("summariser.name", "summary"));
        ResultCollector logger = new ResultCollector(summariser);
        logger.setFilename("/June/GitHub API.jtl");
        scripts.add(scripts.getArray()[0],logger);
        JMeter.convertSubTree(scripts);
        standardJMeterEngine.configure(scripts);
        standardJMeterEngine.runTest();
    }
}
复制代码

image.png

三、使用 JMeter API 创建 HashTree 并执行

package com.lilith.sampler;

import org.apache.jmeter.assertions.ResponseAssertion;
import org.apache.jmeter.assertions.gui.AssertionGui;
import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.control.gui.TestPlanGui;
import org.apache.jmeter.engine.JMeterEngineException;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.protocol.http.control.Header;
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui;
import org.apache.jmeter.protocol.http.gui.HeaderPanel;
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.jmeter.visualizers.StatVisualizer;
import org.apache.jorphan.collections.HashTree;

import java.io.FileOutputStream;
import java.io.IOException;
//import java.lang.ThreadGroup;

public class JmeterTest2 {

    public static void main(String args[]) throws IOException, JMeterEngineException {

        StandardJMeterEngine standardJMeterEngine = new StandardJMeterEngine();
        // StandardJMeterEngine standardJMeterEngine=new StandardJMeterEngine("127.0.0.1"); //使用远程的jmeter server来进行性能测试,也就是分布式方式,IP地址可以带端口或不带端口
        JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/jmeter.properties");//本机jmeter路径
        JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/system.properties");//本机jmeter路径
        JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/user.properties");//本机jmeter路径
        JMeterUtils.setJMeterHome("/apache-jmeter-5.1.1");
        JMeterUtils.initLocale();//时区
        JMeterUtils.initLogging();//日志
        SaveService.loadProperties();

        // 第一步,新建一个测试计划
        TestPlan testPlan = new TestPlan();
        testPlan.setName("测试计划");
        testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
        testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
        /***********************如下几行testPlan的可以省略*************************************/
        testPlan.setComment("");
        testPlan.setFunctionalMode(false);
        testPlan.setTearDownOnShutdown(true);
        testPlan.setSerialized(false);
        testPlan.setTestPlanClasspathArray(new String[]{});
        testPlan.addParameter(null, null);//测试计划中的用户定义参数

        // 新建一个 controller 控制器
        LoopController loopController = new LoopController();
        loopController.setContinueForever(true);
        loopController.setLoops(-1);
        loopController.initialize();

        // 创建线程组
        ThreadGroup threadGroup = new ThreadGroup();
        threadGroup.setName("ThreadGroup");
        threadGroup.setNumThreads(100);
        threadGroup.setRampUp(10);
        threadGroup.setScheduler(true);
        threadGroup.setDuration(120);
        threadGroup.setSamplerController(loopController);
        threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
        threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());
        HTTPSamplerProxy httpSamplerProxy = new HTTPSamplerProxy();
        httpSamplerProxy.setName("baidu");
        httpSamplerProxy.setDomain("www.baidu.com");
        httpSamplerProxy.setPath("/");
        httpSamplerProxy.setProtocol("https");
        httpSamplerProxy.setMethod("GET");
        httpSamplerProxy.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
        httpSamplerProxy.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());
        HeaderManager headerManager = new HeaderManager();
        headerManager.setName("消息头管理器");
        headerManager.add(new Header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36"));
        headerManager.setProperty(TestElement.TEST_CLASS, HeaderManager.class.getName());
        headerManager.setProperty(TestElement.GUI_CLASS, HeaderPanel.class.getName());
        ResponseAssertion responseAssertion = new ResponseAssertion();
        responseAssertion.setName("响应断言");
        responseAssertion.addTestString("百度一下");
        responseAssertion.setTestFieldResponseData();
        responseAssertion.setToContainsType();
        responseAssertion.setProperty(TestElement.TEST_CLASS, ResponseAssertion.class.getName());
        responseAssertion.setProperty(TestElement.GUI_CLASS, AssertionGui.class.getName());
        Summariser summer = new Summariser(JMeterUtils.getPropDefault("summariser.name", "summary"));
        ResultCollector logger = new ResultCollector(summer);
        logger.setFilename("/tools/create_by_hashtree_api.jtl");
        logger.setName("聚合报告");
        HashTree jmeterTest = new HashTree();
        HashTree testPlanTree = jmeterTest.add(testPlan);
        logger.setProperty(TestElement.TEST_CLASS, ResultCollector.class.getName());
        logger.setProperty(TestElement.GUI_CLASS, StatVisualizer.class.getName());
        HashTree httpSamplerTree = jmeterTest.add(threadGroup, httpSamplerProxy);
        httpSamplerTree.add(responseAssertion);
        httpSamplerTree.add(headerManager);
        jmeterTest.add(jmeterTest.getArray()[0], logger);
        SaveService.saveTree(jmeterTest, new FileOutputStream("/tools/create_by_hashtree_api.jmx"));
        standardJMeterEngine.configure(jmeterTest);
        standardJMeterEngine.runTest();
    }
}
复制代码

执行 main 方法

image.png

四、JDBC Sampler

设置数据库连接信息

image.png

执行 SQL 语句

image.png

执行结果

image.png

五、配置 Grafana 可视化

image.png

猜你喜欢

转载自juejin.im/post/7128278282771890190