最近项目中用到jmeter测试java,跟着学习了下,项目的代码就不在这里阐述了,在网上搜了几个例子,以作备注,以后再做具体的更新:
jmeter支持自定义java脚本的压测。编写java脚本,需要实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写。
pom.xml(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工程,编写被压测代码的”客户端”:
假设本例需要压测查询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 {
- private SampleResult sampleresult = new SampleResult();
- // 把测试的一些默认数据在程序运行前显示到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) {
- //获取界面中传递的值
- 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);
- }
- }
2、打包
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-antrun-plugin</artifactId>
- <version>1.7</version>
- <executions>
- <execution>
- <id>setup</id>
- <phase>package</phase>
- <configuration>
- <tasks>
- <mkdir dir="${pb.outputDirectory}"/>
- <delete includeemptydirs="true">
- <fileset dir="src/main/java" includes="**/*"/>
- </delete>
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- <execution>
- <id>exec</id>
- <phase>package</phase>
- <configuration>
- <tasks>
- <mkdir dir="src/main/java"/>
- <path id="proto.path">
- <fileset dir="src/main/pb">
- <include name="**/*.proto"/>
- </fileset>
- </path>
- <pathconvert pathsep=" " property="proto.files" refid="proto.path"/>
- <exec executable="${pb.executable}">
- <arg value="--java_out=src/main/java"/>
- <arg value="-I${project.basedir}/src/main/pb"/>
- <arg line="${proto.files}"/>
- </exec>
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- <execution>
- <id>clean</id>
- <phase>package</phase>
- <configuration>
- <tasks>
- <copy todir="src/main/java">
- <fileset dir="${pb.outputDirectory}" includes="**/*"/>
- </copy>
- <delete dir="${pb.outputDirectory}"/>
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
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://blog.csdn.net/g695144224/article/details/50992969
http://blog.csdn.net/g695144224/article/details/50994524
jmeter测试dubbo接口: http://blog.csdn.net/zhouhao88410234/article/details/73088056