接口性能测试--JMeter

主要内容有:

1.JMeter Java Sampler介绍

2.多接口性能测试

=================================================================================================

1.JMeter Java Sampler介绍

setupTest做些初始化的工作,每个线程只执行一次

teardownTest做些清理工作,每个线程只执行一次

runTest具体的测试执行工作,每个并发每次循环都将执行一次

SampleResult记录测试结果,result.sampleStart()一个事务开始,result.sampleEnd()一个事务结束

main方法用于调试

01   package   com  .  xxx  .  yyy  .  perf
02  
03   import   org.apache.jmeter.config.Argument
04   import   org.apache.jmeter.config.Arguments
05   import   org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient
06   import   org.apache.jmeter.protocol.java.sampler.JavaSamplerContext
07   import   org.apache.jmeter.samplers.SampleResult
08   import   org.springframework.context.ApplicationContext
09   import   org.springframework.context.support.ClassPathXmlApplicationContext
10  
11   import   com.xxx.udb.client.PersonService
12   import   com.xxx.udb.client.result.PersonResult
13  
14   /** 
15    
16   * @author flynewton
17   */ 
18   public   class   GetPersonByLongId   extends   AbstractJavaSamplerClient   { 
19       private   static   final   ApplicationContext   ctx   =   new  ClassPathXmlApplicationContext
20               "spring-udb.xml"); 
21       private   static   PersonService   personService   =   null
22       private   static   final   String   loginId   =   "00000sb"
23       private   static   final   String   siteId   =   "CN"
24  
25  
26       @Override 
27       public   void   setupTestJavaSamplerContext   context)   { 
28           super  .  setupTestcontext); 
29           personService   = (  PersonService)   ctx  .  getBean"personServiceClient"); 
30       } 
31  
32       @Override 
33       public   void   teardownTestJavaSamplerContext   context)   { 
34           super  .  teardownTestcontext); 
35       } 
36  
37       public   SampleResult   runTestJavaSamplerContext   arg0)   { 
38           SampleResult   result   =   new   SampleResult(); 
39           PersonResult   personResult   =   null
40          
41           result  .  setSampleLabel"result"); 
42          
43           try   { 
44               result  .  sampleStart(); 
45               personResult   =   personService  .  getPersonByLongIdsiteId  ,   loginId); 
46               result  .  sampleEnd(); 
47           }   catch (  Throwable   t)   { 
48               this  .  getLogger  ().  error"Exception:"   +   t); 
49               return   null
50           } 
51          
52           if (  personResult   !=   null   &&   personResult  .  getCode()   ==   0)   { 
53               result  .  setSamplerDatapersonResult  .  toString()); 
54               result  .  setSuccessfultrue); 
55           }   else   { 
56               result  .  setSuccessfulfalse); 
57           } 
58          
59           return   result
60       } 
61  
62       static   void   printResultSampleResult   res)   { 
63           System  .  out  .  println"test is success:"   +   res  .  isSuccessful()   +   " used:" 
64                   + (  res  .  getEndTime()   -   res  .  getStartTime())   +   "ms "   +   " result:" 
65                   +   res  .  getSampleLabel()   +   ":"   +   res  .  getSamplerData()); 
66       } 
67  
68       public   static   void   mainString  []   args)   { 
69           GetPersonByLongId   service   =   new   GetPersonByLongId(); 
70           JavaSamplerContext   context   =   new   JavaSamplerContextnull); 
71           service  .  setupTestcontext); 
72           SampleResult   res1   =   service  .  runTestcontext); 
73           printResultres1); 
74           service  .  teardownTestcontext); 
75           System  .  exit0); 
76       } 
77  
78   }

 

2.多接口性能测试

按照上面的方法进行测试,每个需要测试的接口和场景都需要写一个这样的测试类,对于有些具有相似初始化,清理等工作,只有具体的那行事务代码不一样的情况,会有很多重复的工作。如下:

可以考虑采用反射的方式来解决这个问题,尤其是业务非常类似的接口和场景。当然,反射会带来压力机的性能消耗,但是这个可以通过调整JMeter的JVM参数和增加JMeter实例来解决。

1)利用反射后的结构如下:

 

2)AbstractServiceClient是一个抽象基类
16   package   com  .  xxx  .  yyy  .  perf  .  base
17  
18   import   java.lang.reflect.Method
19  
20   import   org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient
21   import   org.apache.jmeter.protocol.java.sampler.JavaSamplerContext
22   import   org.apache.jmeter.samplers.SampleResult
23  
24   /** 
25   * Comment of AbstractServiceClient 
26     @author flynewton 
27   */ 
28  
29   public   abstract   class   AbstractServiceClient   extends   AbstractJavaSamplerClient  { 
30  
31       public   Object   invokeTestString   testName  ,   JavaSamplerContext   context  , SampleResult   sample)   { 
32           Method  []   methods   =   this  .  getClass  ().  getMethods(); 
33           for (  Method   m   :   methods)   { 
34               if (  m  .  getName  ().  equalsIgnoreCasetestName))   { 
35                   try   { 
36                       return   m  .  invokethis  ,   context  ,  sample); 
37                   }   catch (  Throwable   t)   { 
38                       this  .  getLogger  ().  error"execute method:"   +   testName   +   " falied"  ,   t); 
39                   } 
40               } 
41  
42           } 
43           return   null
44       } 
45   }
3)GetPersonTest为某一类具有相似业务场景的测试类
其中  getDefaultParameters方法设置默认参数:test传入具体要执行的测试方法;info传入日志级别,利用main方法进行调试时设置为true,真正进行性能测试的时候设置为false

016   package   com  .  xxx  .  yyy  .  perf
017  
018   import   org.apache.jmeter.config.Argument
019   import   org.apache.jmeter.config.Arguments
020   import   org.apache.jmeter.protocol.java.sampler.JavaSamplerContext
021   import   org.apache.jmeter.samplers.SampleResult
022   import   org.springframework.context.ApplicationContext
023   import   org.springframework.context.support.ClassPathXmlApplicationContext
024  
025   import   com.xxx.udb.client.PersonService
026   import   com.xxx.udb.client.result.MultiPersonResult
027   import   com.xxx.udb.client.result.PersonResult
028   import   com.xxx.udb.perf.base.AbstractServiceClient
029  
030   /** 
031   * Test get person 
032   * @author flynewton 
033   */ 
034   public   class   GetPersonTest   extends   AbstractServiceClient   { 
035       private   static   final   ApplicationContext   ctx   =   new  ClassPathXmlApplicationContext
036               "spring-udb.xml"); 
037       private   static   PersonService   personService   =   null
038       private   static   String   loginIdCache   =   "00000sb"
039       private   static   String   loginIdWithoutCache   =   "01haytham"
040       private   static   String   siteIdCache   =   "CN"
041       private   static   String   siteIdWithoutCache   =   "IN"
042       private   static   String   alimailCn   =   "gchg2008@zzgcchen.cn"
043       private   static   String   alimailUdb   =   "000001@lvcuinm.com.cn"
044       private   static   String   uidCache   =   "300113578"
045       private   static   String   uidWithoutCache   =   "in5002997"
046       private   static   String   emailCache   =   "00000sb@alibaba-test.com"
047       private   static   String   emailWithoutCache   =   "5002997@alibaba-inc.com"
048  
049       @Override 
050       public   void   setupTestJavaSamplerContext   context)   { 
051           super  .  setupTestcontext); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值