jmeter支持自定义java脚本的压测。编写java脚本,需要实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写。
pom.xml(jmeter的版本最好和压测用的一致)
<!-- jmeter -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.0</version>
</dependency>
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、打包
<build>
<finalName>jmeterTest</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering><!--这里开启变量替换-->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.json</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.abc.jmeterTest.RpcTest</mainClass>
<classpathPrefix>lib/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
assembly.xml
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>pack</id>
<!-- SNAPSHOT,Base,Alpha,Beta,RC,Release, LATEST -->
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>target</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>jmeterTest.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>target/classes</directory>
<outputDirectory>conf</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.xml</include>
</includes>
</fileSet>
</fileSets>
</assembly>
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