jmeter支持自定义java脚本的压测。编写java脚本,需要实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写。
pom.xml(jmeter的版本最好和压测用的一致)
org.apache.jmeter
ApacheJMeter_core
3.0
org.apache.jmeter
ApacheJMeter_java
3.0
1、编写压测java脚本:
1)新建java工程,编写被压测代码的”客户端”:
假设本例需要压测查询mysql的效率(jmeter自带压测jdbc的功能),写一个压测mysql的代码
public class HelloTest {
public String getMysql() {
String res = "";
String url = "jdbc:mysql://s1h.dbtest3.w.soft.db:8663/_test?"
+ "user=_test&password=123321&useUnicode=true&characterEncoding=UTF8";
try {
Class.forName("com.mysql.jdbc.Driver");// 动态加载mysql驱动
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
String sql = "select name,brief from author where author_id=200040750";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out
.println(res = rs.getString(1));// 入如果返回的是int类型可以用getInt()
}
rs.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return res;
}
public static void main(String... strings) {
HelloTest test = new HelloTest();
test.getMysql();
}
}
2)编写jmeter测试脚本,继承AbstractJavaSamplerClient:
public class AppTest extends AbstractJavaSamplerClient {
// 把测试的一些默认数据在程序运行前显示到JMeter客户端
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("num1", "");
params.addArgument("num2", "");
return params;
}
// 子类用它来 记录log
protected org.apache.log.Logger getLogger() {
return null;
}
// 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行
public void setupTest(JavaSamplerContext context) {
// 获取界面中传递的值
/*String value1 = context.getParameter("num1");
String value2 = context.getParameter("num2");*/
}
// 测试执行的循环体,根据线程数和循环次数的不同可执行多次
public SampleResult runTest(JavaSamplerContext context) {
SampleResult sampleresult = new SampleResult();
//获取界面中传递的值
String value1 = context.getParameter("num1");
String value2 = context.getParameter("num2");
sampleresult.sampleStart();//计时开始
//测试方法
try {
//MqProductor.sendMessage("liuxiao:"+value1+","+value2);
HelloTest test = new HelloTest();
String sum = test.getMysql();
//将结果写入结果树:在jmeter的监听器-查看结果树时即可查看返回结果
sampleresult.setResponseData( "结果是:"+sum+","+value1+","+value2 ,null);
sampleresult.setDataType(SampleResult. TEXT);
sampleresult.setSuccessful( true);
} catch (Exception e) {
sampleresult.setSuccessful( false);//不满足判断条件则判为false,会出现在监听器-聚合报告的Error%列
e.printStackTrace();
} finally {
sampleresult.sampleEnd(); //计时结束
}
//判断测试成功与否的方法:可根据实际进行判断,此处为如果结果非空,则认为改次调用成功
/*if (a.equals("a")) {
sampleresult.setSuccessful( true);
//将结果写入结果树:在jmeter的监听器-查看结果树时即可查看返回结果
sampleresult.setResponseData( "结果是:"+a ,null);
sampleresult.setDataType(SampleResult. TEXT);
} else {
sampleresult.setSuccessful( false);//不满足判断条件则判为false,会出现在监听器-聚合报告的Error%列
}*/
return sampleresult;
}
// 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行
public void teardownTest(JavaSamplerContext context) {
// 获取界面中传递的值
/*String value1 = context.getParameter("key1");
String value2 = context.getParameter("key2");*/
}
// main只是为了调试用,最后打jar包的时候注释掉。
public static void main(String[] args) {
Arguments params = new Arguments();
params.addArgument("num1", "1");//设置参数,并赋予默认值1
params.addArgument("num2", "2");//设置参数,并赋予默认值2
JavaSamplerContext arg0 = new JavaSamplerContext(params);
AppTest test = new AppTest();
test.setupTest(arg0);
test.runTest(arg0);
test.teardownTest(arg0);
}
}
运行main函数,查看输出是否正确。
2、打包
jmeterTest
src/main/resources
true
**/*.xml
**/*.properties
**/*.json
maven-dependency-plugin
package
copy-dependencies
${project.build.directory}/lib
false
org.apache.maven.plugins
maven-jar-plugin
2.5
true
com.abc.jmeterTest.RpcTest
lib/
false
org.apache.maven.plugins
maven-assembly-plugin
2.4
assembly/assembly.xml
make-assembly
package
single
assembly.xml
pack
zip
false
false
lib
runtime
${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
target
/
jmeterTest.jar
target/classes
conf
*.properties
*.xml
1)使用maven,把项目打包成MyTest.jar和lib目录(依赖的各种jar)
2)将MyTest.jar和lib目录拷贝到jmeter的JMETER_HOME\lib\ext目录(因为jmeter运行时需要从ext目录加载需要的第三方类)
3、压测:
1)打开jmeter,创建线程组、simple>java请求;
2)压测:
压测后,会在结果树中显示结果,并且在jmeter的黑屏控制台中把代码中的system.out信息输出。
4、补充:
1)JMeter Java Sampler介绍
Arguments |
getDefaultParameters() 用于获取界面的参数 |
SampleResult |
runTest(JavaSamplerContext context) 类似于LR的Action,result.sampleStart()一个事务开始,result.sampleEnd()一个事务 结束 |
void |
setupTest(JavaSamplerContext context) 初始化方法,类似于LR的init和Junit中的setUp() |
void |
teardownTest(JavaSamplerContext context) 类似于LR的end和Junit中的tearDown() |
执行的先后顺序为:
getDefaultParameters() --> setupTest(JavaSamplerContext context) --> runTest(JavaSamplerContext context) --> teardownTest(JavaSamplerContext context)
常用的方法:
①、addArgument("name", "value") 定义参数
②、sampleStart() 定义事务的开始,类似于LR的lr_start_transaction,和LR一样事务间不要放无关代码
③、sampleEnd() 定义事务的结束,类似于LR的lr_end_transaction
④、setSuccessful(true、false) 设置运行结果的成功或失败,Jmeter统计成功失败的次数,在聚合报告中能够体现。
2)自带Java Request Sampler:
JMeter默认实现了两个Java Request Sampler:SleepTest Sampler和JavaTest Sampler。
JavaTest Sampler不向服务器发送数据请求,一般被用作调试目的使用。
参考:
http://www.cnblogs.com/yangxia-test/p/4019541.html
http://blog.csdn.net/xieyuemin/article/details/51824407