首先创建一个maven project。
因Jmeter的Java Request脚本依赖Jmeter的一些核心jar包,所以我们要maven项目的pom文件中添加Jmeter的一些依赖包:ApacheJMeter_core、ApacheJMeter_java:
编写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。
创建线程组:
创建Java Request Sample:
此时,会在Java请求页面的“类名称”下拉列表中看到我们之前写的Java Request脚本:
选中其中一个要测试的脚本,可以看到配置的参数:
然后再添加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.length; 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插件来帮助我们简化操作。
<
plugin
>
<
groupId
>org.apache.maven.plugins</
groupId
>
<
artifactId
>maven-antrun-plugin</
artifactId
>
<
executions
>
<
execution
>
<
id
>copy-files</
id
>
<
phase
>package</
phase
>
<
configuration
>
<
tasks
>
<!--将生成的项目jar拷贝到jmeter的lib/ext目录下 -->
<
copy
file
=
"${project.build.directory}/yss_curator-0.0.1-SNAPSHOT.jar"
tofile
=
"D:\apache-jmeter-2.13\lib\ext\yss_curator-0.0.1-SNAPSHOT.jar"
overwrite
=
"true"
/>
</
tasks
>
</
configuration
>
<
goals
>
<
goal
>run</
goal
>
</
goals
>
</
execution
>
</
executions
>
</
plugin
>
|
如此,我们便可在执行mvn package命令的时候,自动将项目打包,并将包复制到指定的目录下了,我们只需再重启jmeter就可以了。