Java jmeter集成测试

最近项目中用到jmeter测试java,跟着学习了下,项目的代码就不在这里阐述了,在网上搜了几个例子,以作备注,以后再做具体的更新:

jmeter支持自定义java脚本的压测。编写java脚本,需要实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写。

pom.xml(jmeter的版本最好和压测用的一致)

  1. <dependency>  
  2.         <groupId>org.apache.jmeter</groupId>  
  3.         <artifactId>ApacheJMeter_core</artifactId>  
  4.         <version>3.0</version>  
  5.     </dependency>  
  6.     <dependency>    
  7.         <groupId>org.apache.jmeter</groupId>    
  8.         <artifactId>ApacheJMeter_java</artifactId>    
  9.         <version>3.0</version>    
  10.     </dependency>  
1、编写压测java脚本:

1)新建java工程,编写被压测代码的”客户端”:

假设本例需要压测查询mysql的效率(jmeter自带压测jdbc的功能),写一个压测mysql的代码

  1. public class HelloTest {  
  2.       
  3.       
  4.     public String getMysql() {  
  5.         String res = "";  
  6.         String url = "jdbc:mysql://s1h.dbtest3.w.soft.db:8663/_test?"  
  7.                 + "user=_test&password=123321&useUnicode=true&characterEncoding=UTF8";  
  8.           
  9.         try {  
  10.             Class.forName("com.mysql.jdbc.Driver");// 动态加载mysql驱动  
  11.             Connection conn = DriverManager.getConnection(url);  
  12.             Statement stmt = conn.createStatement();  
  13.             String sql = "select name,brief from author where author_id=200040750";  
  14.             ResultSet rs = stmt.executeQuery(sql);  
  15.             while (rs.next()) {  
  16.                 System.out  
  17.                         .println(res = rs.getString(1));// 入如果返回的是int类型可以用getInt()  
  18.             }  
  19.             rs.close();  
  20.             conn.close();  
  21.         } catch (SQLException e) {  
  22.             e.printStackTrace();  
  23.         } catch (ClassNotFoundException e) {  
  24.             e.printStackTrace();  
  25.         }   
  26.           
  27.         return res;  
  28.     }  
  29.   
  30.     public static void main(String... strings) {  
  31.         HelloTest test = new HelloTest();  
  32.                   
  33.         test.getMysql();  
  34.     }  
  35. }  

2)编写jmeter测试脚本,继承AbstractJavaSamplerClient:

  1. public class AppTest extends AbstractJavaSamplerClient {  
  2.     private SampleResult sampleresult = new SampleResult();  
  3.   
  4.     // 把测试的一些默认数据在程序运行前显示到JMeter客户端  
  5.     @Override  
  6.     public Arguments getDefaultParameters() {  
  7.         Arguments params = new Arguments();  
  8.         params.addArgument("num1""");  
  9.         params.addArgument("num2""");  
  10.         return params;  
  11.     }  
  12.   
  13.     // 子类用它来 记录log  
  14.     protected org.apache.log.Logger getLogger() {  
  15.         return null;  
  16.     }  
  17.   
  18.     // 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行  
  19.     public void setupTest(JavaSamplerContext context) {  
  20.         // 获取界面中传递的值  
  21.         /*String value1 = context.getParameter("num1"); 
  22.         String value2 = context.getParameter("num2");*/  
  23.     }  
  24.   
  25.     // 测试执行的循环体,根据线程数和循环次数的不同可执行多次  
  26.     public SampleResult runTest(JavaSamplerContext context) {  
  27.         //获取界面中传递的值    
  28.         String value1 = context.getParameter("num1");    
  29.         String value2 = context.getParameter("num2");  
  30.           
  31.         sampleresult.sampleStart();//计时开始  
  32.         //测试方法  
  33.         try {  
  34.             //MqProductor.sendMessage("liuxiao:"+value1+","+value2);  
  35.             HelloTest test = new HelloTest();  
  36.             String sum = test.getMysql();  
  37.             //将结果写入结果树:在jmeter的监听器-查看结果树时即可查看返回结果   
  38.             sampleresult.setResponseData( "结果是:"+sum+","+value1+","+value2 ,null);  
  39.             sampleresult.setDataType(SampleResult. TEXT);  
  40.             sampleresult.setSuccessful( true);  
  41.         } catch (Exception e) {  
  42.             sampleresult.setSuccessful( false);//不满足判断条件则判为false,会出现在监听器-聚合报告的Error%列  
  43.             e.printStackTrace();  
  44.         } finally {  
  45.             sampleresult.sampleEnd();  //计时结束  
  46.         }  
  47.           
  48.         //判断测试成功与否的方法:可根据实际进行判断,此处为如果结果非空,则认为改次调用成功  
  49.         /*if (a.equals("a")) { 
  50.             sampleresult.setSuccessful( true); 
  51.             //将结果写入结果树:在jmeter的监听器-查看结果树时即可查看返回结果  
  52.             sampleresult.setResponseData( "结果是:"+a ,null); 
  53.             sampleresult.setDataType(SampleResult. TEXT); 
  54.         } else { 
  55.             sampleresult.setSuccessful( false);//不满足判断条件则判为false,会出现在监听器-聚合报告的Error%列 
  56.         }*/  
  57.         return sampleresult;  
  58.     }  
  59.   
  60.     // 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行  
  61.     public void teardownTest(JavaSamplerContext context) {  
  62.         // 获取界面中传递的值  
  63.         /*String value1 = context.getParameter("key1"); 
  64.         String value2 = context.getParameter("key2");*/  
  65.     }  
  66.       
  67.     // main只是为了调试用,最后打jar包的时候注释掉。  
  68.     public static void main(String[] args) {   
  69.         Arguments params = new Arguments();   
  70.         params.addArgument("num1""1");//设置参数,并赋予默认值1   
  71.         params.addArgument("num2""2");//设置参数,并赋予默认值2  
  72.         JavaSamplerContext arg0 = new JavaSamplerContext(params);   
  73.         AppTest test = new AppTest();   
  74.         test.setupTest(arg0);   
  75.         test.runTest(arg0);  
  76.         test.teardownTest(arg0);   
  77.     }  
  78. }  
运行main函数,查看输出是否正确。

2、打包

  1. <build>  
  2.     <plugins>  
  3.     <plugin>  
  4.         <artifactId>maven-antrun-plugin</artifactId>  
  5.            <version>1.7</version>  
  6.            <executions>  
  7.             <execution>  
  8.                 <id>setup</id>  
  9.                 <phase>package</phase>  
  10.                 <configuration>  
  11.                     <tasks>  
  12.                         <mkdir dir="${pb.outputDirectory}"/>  
  13.                            <delete includeemptydirs="true">  
  14.                                <fileset dir="src/main/java" includes="**/*"/>  
  15.                            </delete>  
  16.                         </tasks>  
  17.                     </configuration>  
  18.                    <goals>  
  19.                     <goal>run</goal>  
  20.                     </goals>  
  21.                 </execution>  
  22.                   
  23.                 <execution>  
  24.                 <id>exec</id>  
  25.                 <phase>package</phase>  
  26.                    <configuration>  
  27.                     <tasks>  
  28.                         <mkdir dir="src/main/java"/>  
  29.                         <path id="proto.path">  
  30.                             <fileset dir="src/main/pb">  
  31.                                 <include name="**/*.proto"/>  
  32.                             </fileset>  
  33.                         </path>  
  34.                         <pathconvert pathsep=" " property="proto.files" refid="proto.path"/>  
  35.                         <exec executable="${pb.executable}">  
  36.                             <arg value="--java_out=src/main/java"/>  
  37.                             <arg value="-I${project.basedir}/src/main/pb"/>  
  38.                             <arg line="${proto.files}"/>  
  39.                         </exec>  
  40.                     </tasks>  
  41.                    </configuration>  
  42.                 <goals>  
  43.                     <goal>run</goal>  
  44.                 </goals>  
  45.                 </execution>  
  46.                   
  47.                 <execution>  
  48.                 <id>clean</id>  
  49.                 <phase>package</phase>  
  50.                    <configuration>  
  51.                        <tasks>  
  52.                            <copy todir="src/main/java">  
  53.                                <fileset dir="${pb.outputDirectory}" includes="**/*"/>  
  54.                            </copy>  
  55.                            <delete dir="${pb.outputDirectory}"/>  
  56.                        </tasks>  
  57.                    </configuration>  
  58.                    <goals>  
  59.                        <goal>run</goal>  
  60.                    </goals>  
  61.                 </execution>  
  62.               
  63.            </executions>  
  64.        </plugin>  
  65.    </plugins>  
  66.  </build>  
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://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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值