java jmeter_使用Jmeter中的Java Request进行性能测试

在使用jmeter进行性能测试的时候,有可能会需要通过一些脚本去测试性能,(比如通过sokeeper的api去测试sokeeper的读写性能)。这时,我们可以通过Java Request实现,以下是操作步骤。

首先创建一个maven project。

因Jmeter的Java Request脚本依赖Jmeter的一些核心jar包,所以我们要maven项目的pom文件中添加Jmeter的一些依赖包:ApacheJMeter_core、ApacheJMeter_java:

ba34ffee0306274b047c19932ed5c040.png

编写Java Sample,继承AbstractJavaSample,并重写以下方法:

public Arguments getDefaultParameters();可选,定义可用参数及默认值;

·  public void setupTest(JavaSamplerContext arg0):可选,测试前执行,做一些初始化工作;

·  public SampleResult runTest(JavaSamplerContext arg0);必选,实现自定义请求;

·  public void teardownTest(JavaSamplerContext arg0):可选,测试结束时调用;

示例代码:

import org.apache.curator.RetryPolicy;

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.retry.ExponentialBackoffRetry;

import org.apache.curator.utils.EnsurePath;

import org.apache.jmeter.config.Arguments;

import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;

import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;

import org.apache.jmeter.samplers.SampleResult;

public class CuratorRequestSample extends AbstractJavaSamplerClient {

protected CuratorFramework client = null;

protected long subCount = 1l;

protected long TOTAL_SUB_COUNT = 100000l;

/**

* 定义可用参数及默认值

*/

public Arguments getDefaultParameters() {

Arguments params = new Arguments();

params.addArgument("connect_str", "192.168.103.136:2181,192.168.103.154:2181");

// 设置参数,并赋予默认值0

return params;

}

/**

* 可选,测试前执行,做一些初始化工作,在Jmeter执行的时候,一个Thread只执行一次setupTest方法

*/

public void setupTest(JavaSamplerContext context) {

String connect_str = context.getParameter("connect_str");

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 4);

client =

CuratorFrameworkFactory.builder().connectString(connect_str)

.connectionTimeoutMs(3000).namespace("curator_sample")

.sessionTimeoutMs(5000).retryPolicy(retryPolicy).build();

client.start();

EnsurePath ensure = new EnsurePath("/curator_sample/setData");

try {

ensure.ensure(client.getZookeeperClient());

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 可选,测试结束时调用,用于资源释放,一个Thread只执行一次

*/

public void teardownTest(JavaSamplerContext context) {

client.close();

}

/**

* 必选,实现自定义请求

*/

public SampleResult runTest(JavaSamplerContext arg0) {

SampleResult resuts = new SampleResult();

resuts.sampleStart();

try {

byte[] bytes = client.getData().forPath("/setData");

resuts.setSuccessful(true);

} catch (Exception e) {

resuts.setSuccessful(false);

}

resuts.sampleEnd();

return resuts;

}

}

然后,把项目打成jar包,并将包放到${jmeter_home}/lib/ext/目录下。如还需要依赖第三方jar,需要将第三方的jar也放到${jmeter_home}/lib/ext/目录下。

启动Jmeter。

创建线程组:

1306bb70bfa968b90b16675e640acd24.png

创建Java Request Sample:

acc33ae8b615aa66476e2d2248275869.png

此时,会在Java请求页面的“类名称”下拉列表中看到我们之前写的Java Request脚本:

6e5f12c136276e5a3e467fb034297b52.png

选中其中一个要测试的脚本,可以看到配置的参数:

aea4a753c6c67ed474b1d4ff93ea79c5.png

然后再添加Summary Report即可,保存测试计划。设置线程组属性,执行测试计划。即可。

优化技巧一

很多情况下我们在编写Java Sample时,需要编写多个Java Sample,且这些Java Sample之间,拥有共同的资源初始化操作、资源释放操作,只是在核心业务不同而已,这时,我们可以封装一个基类。例:

import org.apache.curator.RetryPolicy;

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.retry.ExponentialBackoffRetry;

import org.apache.curator.utils.EnsurePath;

import org.apache.jmeter.config.Arguments;

import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;

import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;

import org.apache.jmeter.samplers.SampleResult;

/**

* Curator的Java请求测试基类

*

* @author majian

* @version 1.0, 2016-2-22

* @since 1.0, 2016-2-22

*/

public abstract class CuratorBaseRequest extends AbstractJavaSamplerClient {

protected CuratorFramework client = null;

protected long subCount = 1l;

protected long TOTAL_SUB_COUNT = 100000l;

/**

* 定义可用参数及默认值

*/

public Arguments getDefaultParameters() {

Arguments params = new Arguments();

params.addArgument("connect_str", "192.168.103.136:2181,192.168.103.154:2181");// 设置参数,并赋予默认值0

return params;

}

/**

* 可选,测试前执行,做一些初始化工作,在Jmeter执行的时候,一个Thread只执行一次setupTest方法

*/

public void setupTest(JavaSamplerContext context) {

String connect_str = context.getParameter("connect_str");

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 4);

client =

CuratorFrameworkFactory.builder().connectString(connect_str)

.connectionTimeoutMs(3000).namespace("curator_sample")

.sessionTimeoutMs(5000).retryPolicy(retryPolicy).build();

client.start();

EnsurePath ensure = new EnsurePath("/curator_sample/setData");

try {

ensure.ensure(client.getZookeeperClient());

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 可选,测试结束时调用,用于资源释放,一个Thread只执行一次

*/

public void teardownTest(JavaSamplerContext context) {

client.close();

}

/**

* 必选,实现自定义请求

*/

public SampleResult runTest(JavaSamplerContext arg0) {

SampleResult resuts = new SampleResult();

resuts.sampleStart();

try {

testHandler();

resuts.setSuccessful(true);

} catch (Exception e) {

resuts.setSuccessful(false);

}

resuts.sampleEnd();

return resuts;

}

/**

* 核心业务执行功能实现,只需实现此接口即可

* @throws Exception

*/

public abstract void testHandler() throws Exception;

}

然后我们可以创建不同的Java请求,继承这个基类,只需实现testHandler()方法即可。如:

curator获取数据的Java Request:

public class GetDataRequest extends CuratorBaseRequest {

public void testHandler() throws Exception {

byte[] bytes = client.getData().forPath("/setData");

}

}

Curaotr设置数据的Java Request:

import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;

public class SetDataRequest extends CuratorBaseRequest {

private byte[] a100 = new byte[100];

public void setupTest(JavaSamplerContext context) {

for (int i = 0; i 

a100[i] = 'A';

}

super.setupTest(context);

}

public void testHandler() throws Exception {

client.setData().forPath("/setData", a100);

}

}

这样,可以避免大量的冗余代码。

优化技巧二

在编写完Java Sample后,每次都需要我们打成jar包,然后再复制jar包到${jmeter_home}\lib\ext下,然后再重起jmeter,这样操作比较繁琐。这时,我们可以通过在maven项目中添加一个maven插件来帮助我们简化操作。

org.apache.maven.plugins

maven-antrun-plugin

copy-files

package

overwrite="true" />

run

如此,我们便可在执行mvn package命令的时候,自动将项目打包,并将包复制到指定的目录下了,我们只需再重启jmeter就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python虚拟环境 pyenv_Python 虚拟环境 pyenv、venv(pyvenv)、virtualenv之间的区别

请参考连接 https://blog.zengrong.net/post/2167.htmlhttps://blog.csdn.net/lanonjj/article/details/51050212为避免链接失效,把原文做了复制黏贴另外在python3.6中,虚拟应该用如下命令创建python3 -m venv /path/to/new/virtual/environment直接用py…

java resources 目录_[Java] 在 jar 文件中读取 resources 目录下的文件

注意两点:1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中。2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取。例子新建一个 maven 目录App.java 用于读取 resources 中的 a.txt 内容…

m.2接口和nvme区别_m.2 nvme和m.2有区别吗?

m2接口有两种,一种走sata的,另外一种走pcie(就是nvme)的。走sata的速度跟传统sata接口的没区别,就是接口变成了m2的了。走pcie的,就是我们说的nvme接口是m2的,性能也强了。M.2接口有SATA也有NVMe PCIe协议。这个是同一…

python编程软件排行榜_Python编程开发工具:这10个对Web开发者最有用的Python包

Python编程一时间成为了开发人员最喜欢的语言之一。无论是专业的,业余的,还是作为一个Python初学者,都可以从Python编程语言及其程序包中受益。Python已经被证明是当今最具活力的面向对象的编程语言之一。这就是为什么即使是一些很优秀的公司…

java excel 字体大小_Java将数据按列写入Excel并设置格式(字体、背景色、自动列宽、对齐方式等)...

/*** 按列写入Excel并设置格式**paramoutputUrl* 输出路径*paramsheetName* 工作薄名称*paramtitles* 表头*paramarrayList* 表头数据*throwsIOException*throwsRowsExceededException*throwsWriteException*/public static voidwriteExcel(String outputUrl, String sheetName…

如何查看cplex的help文档_word查看技巧:如何快速找到文档的修改痕迹

不知道大家在工作中有没有遇到过这类的工作场景:当初步拟好一份合作协议或是项目策划书后,发给老板或其他同事审阅和修订,通常会不断地来回修改文档。此时,如果你想要查看文档哪里被修改过?你会怎么操作?很…

java将数字替换为空_将数字替换为java中正确位置的单词

实际上我正试图用用户给出的句子中的数字替换为单词.本案例日期格式;例如:我的生日是在16/6/2000,我是java的新手 – >成为—>我的生日是七月十六日,我是java的新手这是代码:Scanner reader new Scanner(System.in);System.out.println("Ent…

java重载this_Java的this关键字的使用与方法的重载相关知识

Java this关键字详解this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性。例如:public class Demo{public int x 10;public int y 15;public void sum(){// 通过 this 点取成员变量int z this…

python 类和对象 经常用吗_python基础教程之对象和类的实际运用

我们熟悉了对象和类的基本概念。我们将进一步拓展,以便能实际运用对象和类。调用类的其它信息中提到,在定义方法时,必须有self这一参数。这个参数表示某个对象。对象拥有类的所有性质,那么我们可以通过self,调用类属性…

java get properties_Java.lang.System之getProperties()方法

Environmentjava.vm.version——>25.60-b23java.vm.vendor——>Oracle Corporationjava.vendor.url——>http://java.oracle.com/idea.launcher.port——>7533java.vm.name——>Java HotSpot(TM) 64-Bit Server VMfile.encoding.pkg——>sun.iouser.country—…

mysql set语句_MySQL Prepared语句简介

之前的MySQL版本4.1,查询以文本格式发送到MySQL服务器。 之后,MySQL服务器使用文本协议将数据返回给客户端。MySQL必须完全解析查询,并将结果集转换为字符串,然后再将其返回给客户端。 文本协议具有严重的性能问题。为了解决这个问…

java resultset close_java代码ResultSet is closed

我用的Eclipse开发工具写java代码,连接的是SQLServer2000。提示ResultSetisclosed代码如下:privatestaticvoidgetDBConnection(){try{Class.forName(strName);connDriverManager.ge...我用的Eclipse开发工具写java代码,连接的是SQL Server 20…

三同轴连接器_一种毫米波频段微带同轴转换结构

在微波电路中,同轴电缆和微带线是微波系统中常见的两种微波传输线,同轴电缆以其频带宽、屏蔽性好、结构简单、可弯曲等特性,常被用作模块或系统之间连接的传输线。在高频段,微带线是混合微波集成电路(Hybrid Microwave Integrated…

java rhino 运行 js_Mozilla Rhino :如何从Java调用JS函数

小编典典String script “function abc(x,y) {return xy;}”;Context context Context.enter();try {ScriptableObject scope context.initStandardObjects();Scriptable that context.newObject(scope);Function fct context.compileFunction(scope, script, “script”,…

java getselecteditem_java – 将getSelectedItem()从JComboBox转换为int或任何其他东西

它在这里与对象一起工作得很好.import java.awt.*;import javax.swing.*;class TestCombo {public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {public void run() {Integer[] numbers {1,2,3};String[] names {"Ben", "Ji…

java二叉树合并_Java(树的前中后序遍历构造二叉树题型整合)前序和中序、中序和后序、前序和后序遍历序列构造二叉树算法整合归纳...

前言二叉树各种花里胡哨的算法题真的把我搞晕了,今天特地整理出一类有关二叉树的算法题,希望能帮助阅读到此文章的人,今后不再受此类题型的困扰。一、题目类型已知二叉树的两种遍历序列,请根据该序列构建二叉树;①根据…

nginx https透明代理_Nginx反向代理https,配置lets-encrypt证书教程

前言本站也终于迁移到https了,由于全Docker部署,迁移过程中真是艰难无比(wordpress那块被折腾的想放弃了),也欢迎访问本人博客,(知乎的排版有些乱)Nginx反向代理https,配置lets-encr…

nginx 一个请求发给多台机器_配置Nginx实现负载均衡

企业在解决高并发问题时,一般有两个方向的处理策略,软件、硬件,硬件上添加负载均衡器分发大量请求,软件上可在高并发瓶颈处:数据库web服务器两处添加解决方案,其中web服务器前面一层最常用的的添加负载方案…

怎么用记事本写java_如何用记事本写下第一个Java程序-Fun言

在刚学java的时候,刚开始并未接触类似于Myeclipse这类的编辑器,都是用记事本编写程序,这样虽然很慢,但是能让我们明白其中的原理,所以今天来教大家用记事本来写第一个java程序"Hello World!"准备…

python中list是什么类型_Python中的list数据类型

创建列表sample_list [a,1,(a,b)]Python 列表操作sample_list [a,b,0,1,3]得到列表中的某一个值value_start sample_list[0]end_value sample_list[-1]删除列表的第一个值del sample_list[0]在列表中插入一个值sample_list[0:0] [sample value]得到列表的长度list_length …