jmeter接口java二次开发五步走

jmeter接口java二次开发五步走

第一步:了解jmeter处理java请求的流程

​ Jmeter处理请求的流程:

  1. Jmeter会读取用户传入的数据,把数据初始化到Jmeter中。

  2. 调用Java请求时,jmeter会运行内部的runTest函数,调用封装的JAVA接口,获取到返回数据

  3. 获取到返回数据后,Jmeter可以把返回数据写入到结果树中,这样就能使用查看结果树来观察返回的数据了。

  4. 在这个过程中,JMeter内部是使用什么类来进行处理的呢?我们一起来看一下:

    • Arguments:

      位于:org.apache.jmeter.config.Arguments

      Jmeter初始化时,会把用户的参数数据通过Arguments类来加载到内存当中。

    • JavaSamplerContext:

      位于:org.apache.jmeter.protocol.java.sampler.JavaSamplerContext

      JavaSamplerContext用于向JavaSamplerClient实现提供上下文信息。比如加载Arguments中的用户数据

    • JavaSamplerClient:

      这个接口定义了JavaSampler和外部Java程序之间的交互,这些程序可以由JMeter执行。任何想要作为JMeter测试执行的Java类都必须实现这个接口(直接或间接地通过AbstractJavaSamplerClient)。 JMeter将为测试中的每个用户/线程创建一个JavaSamplerClient实现实例。可以创建额外的实例供JMeter内部使用(例如,了解客户机支持哪些参数)。当测试启动时,将在每个线程的JavaSamplerClient实例上调用setupTest()来初始化客户机。然后在测试的每次迭代中调用runTest()。最后,将调用teardownTest()来允许客户机进行任何必要的清理。

JavaSamplerClient包括以下4个函数(必须实现这4个函数) 
  void setupTest(JavaSamplerContext var1);
  SampleResult runTest(JavaSamplerContext var1);
  void teardownTest(JavaSamplerContext var1);
  Arguments getDefaultParameters();
   
void setupTest(JavaSamplerContext var1):
     加载类时初始化调用的方法,一般获取参数,建立连接等功能写在这里。
SampleResult SrunTest(JavaSamplerContext var1)
     实现接口调用的逻辑代码主要写在runTest函数下。一般在这里通过SampleResult类定义在Jmeter GUI界面    中请求和返回结果数据。
void teardownTest(JavaSamplerContext var1)
     类运行结束时,运行这个函数下面的语句,主要用来释放资源,关闭连接等请求后的操作。
Arguments getDefaultParameters()
     提供测试时支持的参数列表。一般参数的初始化放在这里进行,避免在runTest中执行。可以提高执行效率。
SampleResult
     主要用于控制展示每次迭代的测试结果。
综上,用户数据初始化时,会初始化到Config中,由config模块的Arguments管理参数,然后我们实现的java请求会通过runTest方法调用封装的API接口,并根据返回数据在JMeter设置要展示的返回结果。所以我们二次开发jmeter的JAVA接口请求,需要继承JavaSamplerClient接口,并实现其中的4个函数。

第二步:通过实现jmeter中的接口JavaSamplerClient编写自定义JAVA接口

新建一个Maven项目

新建 如上图的几个类

package api;

import utils.HTTPRequestUtils;
import com.alibaba.fastjson.JSONObject;
//测试类测试post请求是否成功
public class IHRMLogin {
    public JSONObject headers = new JSONObject();
    public JSONObject login_data = new JSONObject();
    public String url;

    public IHRMLogin() {
        url = "http://182.92.81.159/api/sys/login";
    }

    public String loginIHRM(String mobile, String password) {
        login_data.put("mobile", mobile);
        login_data.put("password", password);
        headers.put("Content-Type", "application/json");
        return HTTPRequestUtils.postDemo(this.url, login_data, headers);
    }

    public static void main(String[] args) {
        IHRMLogin ihrmLogin = new IHRMLogin();
        String response = ihrmLogin.loginIHRM("13800000002", "123456");
        System.out.println(response);
    }
}
package utils;

import com.alibaba.fastjson.JSONObject;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
//工具类,post-get方法
public class HTTPRequestUtils {

    public static String getDemo(String url) {
        HttpURLConnection connection = null;
        InputStream inputStream = null;
        BufferedReader br = null;
        // 返回结果字符串
        String result = null;
        try {
            // 创建远程url连接对象
            URL url_obj = new URL(url);
            // 通过远程url连接对象打开一个连接,强转成httpURLConnection类
            connection = (HttpURLConnection) url_obj.openConnection();
            // 设置连接方式:get
            connection.setRequestMethod("GET");
            // 连接服务器的超时时间:10000毫秒
            connection.setConnectTimeout(10000);
            // 读取返回的数据时间:30000毫秒
            connection.setReadTimeout(30000);
            // 发送请求
            connection.connect();
            // 通过connection连接,获取输入流
            if (connection.getResponseCode() == 200) {
                inputStream = connection.getInputStream();
                // 封装输入流is,并指定字符集
                br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
                // 存放数据
                StringBuffer stringBuffer = new StringBuffer();
                String temp;
                temp = null;
                while (null != (temp = br.readLine())) {
                    stringBuffer.append(temp);
                    stringBuffer.append("rn");
                }
                result = stringBuffer.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            // 关闭连接
            if (null != connection) {
                connection.disconnect();
            }
        }

        return result;
    }

    public static String postDemo(String url, JSONObject param, JSONObject headers) {

        HttpURLConnection connection = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        BufferedReader br = null;
        String result = null;
        try {
            URL url_obj = new URL(url);
            // 通过远程url连接对象打开连接
            connection = (HttpURLConnection) url_obj.openConnection();
            // 连接请求方式
            connection.setRequestMethod("POST");
            // 设置连接主机服务器超时时间:10000毫秒
            connection.setConnectTimeout(10000);
            // 设置读取主机服务器返回数据超时时间:30000毫秒
            connection.setReadTimeout(30000);

            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
            connection.setDoOutput(true);
            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
            connection.setDoInput(true);
            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
            if (null != headers.get("Content-Type")) {
                connection.setRequestProperty("Content-Type", (String) headers.get("Content-Type"));
            } else {
                connection.setRequestProperty("Content-Type", "application/json");
            }
            // 通过连接对象获取一个输出流
            outputStream = connection.getOutputStream();
            // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
            outputStream.write(param.toJSONString().getBytes());
            // 通过连接对象获取一个输入流,向远程读取
            if (connection.getResponseCode() == 200) {

                inputStream = connection.getInputStream();
                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
                br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

                StringBuffer stringBuffer = new StringBuffer();
                String temp;
                temp = null;
                // 循环遍历一行一行读取数据
                while ((temp = br.readLine()) != null) {
                    stringBuffer.append(temp);
                    stringBuffer.append("rn");
                }
                result = stringBuffer.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != outputStream) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 断开与远程地址url的连接            // 关闭连接
            if (null != connection) {
                connection.disconnect();
            }
        }
        return result;
    }

    public static void main(String[] args) {
        String url = "http://182.92.81.159/api/sys/login";
        JSONObject loginParams = new JSONObject();
        loginParams.put("mobile", "13800000002");
        loginParams.put("password", "123456");
        JSONObject headers = new JSONObject();
        headers.put("Content-Type", "application/json");
        String result = HTTPRequestUtils.postDemo(url, loginParams, headers);
        System.out.println(result);
    }
}
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;
import api.IHRMLogin;
//实现JavaSamplerClient
public class TestIHRMLogin implements JavaSamplerClient {
    private String mobile;
    private String password;
    @Override
    public void setupTest(JavaSamplerContext javaSamplerContext) {
        // 从JavaSamplerConext中读取用户传入的参数:mobile和password
        this.mobile = javaSamplerContext.getParameter("mobile");
        this.password = javaSamplerContext.getParameter("password");
    }

    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        SampleResult result = new SampleResult();
        IHRMLogin loginApi = new IHRMLogin();
        // 获取当前线程编号
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName);
        // 设置返回结果标签的名称
        result.setSampleLabel("ihrm-" + threadName);
        // 在Jmeter的GUI中展示请求数据
        result.setSamplerData("请求的mobile为:" + this.mobile + "n请求的密码为:"+ this.password);

        // 开始事务,开始计算时间
        result.sampleStart();
        try {
            // 调用登陆接口,并获取返回数据
            String response = loginApi.loginIHRM(this.mobile, this.password);
            // 把返回结果设置到SampleResult中
            result.setResponseData(response, null);
            // 设置返回结果的为Text类型
            result.setDataType(SampleResult.TEXT);
            result.setSuccessful(true);
            // 输出结果到控制台
            System.out.println(response);
        } catch (Throwable e) {
            // 如果出现异常,则判断调用失败
            result.setSuccessful(false);
            e.printStackTrace();
        } finally {
            // 结束事务,计算请求时间
            result.sampleEnd();
        }
        return result;
    }

    @Override
    public void teardownTest(JavaSamplerContext javaSamplerContext) {
    }

    @Override
    public Arguments getDefaultParameters() {
        // 定义Jmeter GUI中java请求的参数:目前在代码中添加了两个参数分别是mobile和password
        Arguments arguments = new Arguments();
        arguments.addArgument("mobile", "");
        arguments.addArgument("password", "");
        return arguments;
    }


}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>JmeterDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
    </dependencies>

</project>

开发JavaSamplerClient 时需要进入两个jar包ApacheJmeter_code和ApacheJmeter_java,可以通过引入jar包的方式或者是添加libs的方式。


TestIHRMLogin 说明

编写代码,步骤有4步:

  1. 实现的JavaSamplerClient中的4个接口。
  2. 实现Arguments函数
  3. 实现setupTest
  4. 实现runTest,runTest是逻辑调用部分,实现调用登陆接口,获取返回数据,设置返回结果等功能

第三步:打包

maven

手动

第四步:将jar包放在jmeter 的第三方库目录

第五步:运行jmeter,添加java请求,进行测试

总结:

  • 使用IDE工具IDE开发了jmeter的java请求。
  • 通过jmeter对暴露的api接口JavaSamplerClient来实现编写能内嵌到jmeter的java请求。
  • 封装了IHRM项目中的登陆接口
  • 封装了HTTP协议中的GET请求和Post请求
  • 使用IDEA构建jar包
  • 使用maven的pom文件添加依赖包Json
  • 使用IDEA添加了外部依赖包ApacheJmeter_code.jar和ApacheJmeter_java.jar

参考 官方KPI:https://jmeter.apache.org/api/index.html

原文地址:https://www.cnblogs.com/jojo0212/p/14312928.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Jmeter:Authenticationcredentialswerenotprovided上次在使用Jmeter对手机app进行录制后,使用查看结果树对脚本进行回放,出现了{“detail”:“Authenticationcredentialswerenotprovided.”}的问题上次的链接地址:https://blog.csdn.net/Test20201990/article/details/
初次使用jmeter时,结果树中返回的数据为未转码内容,如下:  1、在后置处理器中增加beanshellpreprocessor,如下:  Strings=newString(prev.getResponseData(),"UTF-8");charaChar;intlen=s.length();StringBufferoutBuffer=newString
jmeter默认语言设置: 1、临时设置:进入options--ChooseLanguage-- 选择中文简体,设置后语言 切换成中文,重启失效 2、永久设置:进入jmeter目录下的bin目录,用文本编辑工具ue或notepad++等 打开jmeter.properties文件,进行编辑: 找到行: #language=en 修改为: language=
第一步:打开jmeter工具。 第二步:点击鼠标右击,点击添加_线程_线程组,新增线程组。 第三步:添加HTTP请求 第四步:点击页面调试器(以谷歌浏览器为例F12)填写协议,IP,请求,路径 第五步:1.填写参数2.若页面里面没有token可以拿authorization替代,则需要创建HTTP信息头管理器,并进行
在之前的博文中,Jmeter二次开发——基于Java请求,已介绍了Jmeter二次开发的基础情况,上次分享的是java请求开发,今天来分享下Jmeter中的函数开发。聊到Jmeter的函数,知道Jmeter使用的博友肯定很熟悉。Jmeter自带一个函数库,有很多的函数,比如:__P,__Random,函数助手给我们提供了很多的方便
打开虚拟机然后用远程连接工具SSH连接到数据库将serveragent.zip放到Linux环境中在虚拟机中复制路径进入到/opt/目录解压serveragent.zip修改端口为4444永久保存到防火墙中运行startAgent.sh连接虚拟环境里面的数据库更改地址切换路径修改SQL语句点击
jmeter断言之Beanshell断言(判断数据库结果是否符合预期)该篇文章主要讲一下beanshell断言处理数据库结果。(一)首先需要添加配置原件JDBCConnectionConfiguration连接数据库信息,然后发送jdbc请求获取预期结果。我现在使用得是result_variable_name获取得是响应结果集。接下来对数
《jmeter连接MSQL数据库指导》**一、**首先安装msql服务器。在桌面安装,过程中选择认证方式为之前的认证方式,新的认证可能会导致后面连接失败,报错认证问题。其次:打开安装好的数据库,新建一个database----例如:lhd然后再这个database里面新建一个表,例如:table01,然后表中可以自
前言本章主要讲述Windows环境下实现Jmeter+Ant+Jenkins自动化持续集成注:Jmeter+Ant+Jenkins实现集成的前提是这三者环境都已安装部署好关于Jmeter及Jenkins的下载安装我已在其他篇blog已讲述,这里主要讲一下Ant的部署配置传送门1)Jmeter:https://blog.csdn.net/Makasa/art
接口类型rest接口:通过http的get和post方式得到数据,返回报文为json格式soap接口:通过soap协议得到数据,相比httpservice更能处理复杂的数据,请求和返回报文都为xml格式接口测试作用1.在后端程序完成后,可尽早进行系统测试,发现bug2.解决系统测试复杂度,测试脚本运行速度快,节省
目录 一、Jmeter简介二、Jmeter安装三、设置Jmeter语言为中文环境四、Jmeter主要元件五、Jmeter元件的作用域和执行顺序六、Jmeter进行接口测试流程七、Jmeter进行接口测试流程步骤详解 八、总结如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、
在使用cookie管理器时,没有选择对应的策略会导致cookie传递不了下面来讲一讲这些用法 作用:用于管理Testplan运行时的所有的cookie。可以手动存储,也可以自动存储;每次反复清除cookie?:勾选后将每次请求结束后都会将本次请求产生的cookie进行清除,下次请求时重新获取。CookieP
接口测试及常用接口测试工具解析一、常见接口:二、前端和后端:三、什么是接口测试:四、接口组成五、为什么要做接口测试:六、接口测试怎么测:七、用什么工具测那些关于接口测试的二三事,首先大家要搞清楚,什么是接口,其次是前后端,之后逐一抽丝剥茧让它明朗起来,没有一蹴而就的事
jmeter接口java二次开发五步走第一步:了解jmeter处理java请求的流程​ Jmeter处理请求的流程:Jmeter会读取用户传入的数据,把数据初始化到Jmeter中。调用Java请求时,jmeter会运行内部的runTest函数,调用封装的JAVA接口,获取到返回数据获取到返回数据后,Jmeter可以把返回数据
1、添加断言1)先根据“结果树”中的“HTML”中的“响应数据”,找到需要检查的网页中的文本   2)复制上述内容,根据“结果树”中的“Text”中的“响应数据”,确定最终确定要检查的文本(可能含有标签)3)在线程组下找到需要检查的url,右击“添加”→断言→响应断言    
了解需求:1、性能测试过程中,我们经常需要对流程化的业务进行性能测试,其中涉及到很多接口,这时候问开发拿接口和参数就会降低工作效率,直接用jmeter的录制功能就能提高工作效率2、开发接口案例中,我们也经常会碰到一些上传、下载、导入等等一些接口功能,这些脚本如果直接问开发
 随机数https://blog.csdn.net/qq19970496/article/details/101027184随机日期https://blog.csdn.net/qq19970496/article/details/101027813随机字符串https://blog.csdn.net/qq19970496/article/details/101027925随机变量https://blog.csdn.net/qq19970496/article/details/1
JmeterP1性能测试关键指标1,这些指标大家看到后有什么感觉呢?对于功能测试,一般结果就两种,成功的或者是不通过的,有问题的和没问题的,有毛病的和没毛病的,比如打开网页,能打开就打开,打不开就打不开2,性能测试要更复杂一点,不能直接说行还是不行,要有一个参数,一个多维度的指标,来衡量他,比
  jmeter录制脚本示例  jmeter手工脚本编写与调试  业务逻辑实现之逻辑控制器  业务脚本参数化实现  jmeter处理cookie  beanshell脚本  jmeter脚本录制badboy:        
压力测试压力测试是考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在使用压力测试,我们希望找出其他测试方法更难发现的错误,其中有主要有两种错误类型:内存泄漏,并发和同步1.性能指标响应时间:响应时间是指客户端发起请求开始到客户端接收到从服务器返回的响应