求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
接口性能测试--JMeter
 
作者 lykangjia ,火龙果软件    发布于 2014-1-16
 

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  setupTest( JavaSamplerContext  context)  {
28          super . setupTest( context);
29          personService  = ( PersonService)  ctx . getBean( "personServiceClient");
30      }
31
32      @Override
33      public  void  teardownTest( JavaSamplerContext  context)  {
34          super . teardownTest( context);
35      }
36
37      public  SampleResult  runTest( JavaSamplerContext  arg0)  {
38          SampleResult  result  =  new  SampleResult();
39          PersonResult  personResult  =  null;
40
41          result . setSampleLabel( "result");
42
43          try  {
44              result . sampleStart();
45              personResult  =  personService . getPersonByLongId( siteId ,  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 . setSamplerData( personResult . toString());
54              result . setSuccessful( true);
55          }  else  {
56              result . setSuccessful( false);
57          }
58
59          return  result;
60      }
61
62      static  void  printResult( SampleResult  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  main( String []  args)  {
69          GetPersonByLongId  service  =  new  GetPersonByLongId();
70          JavaSamplerContext  context  =  new  JavaSamplerContext( null);
71          service . setupTest( context);
72          SampleResult  res1  =  service . runTest( context);
73          printResult( res1);
74          service . teardownTest( context);
75          System . exit( 0);
76      }
77
78  }

2.多接口性能测试

按照上面的方法进行测试,每个需要测试的接口和场景都需要写一个这样的测试类,对于有些具有相似初始化,清理等工作,只有具体的那行事务代码不一样的情况,会有很多重复的工作。如下:可以考虑采用反射的方式来解决这个问题,尤其是业务非常类似的接口和场景。当然,反射会带来压力机的性能消耗,但是这个可以通过调整JMeter的JVM参数和增加JMeter实例来解决。

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

2)AbstractServiceClient是一个抽象基类

package  com . xxx . yyy . perf . base;
import  java.lang.reflect.Method;
import  org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import  org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import  org.apache.jmeter.samplers.SampleResult;
/**
* Comment of AbstractServiceClient
*  @author flynewton
*/
public  abstract  class  AbstractServiceClient  extends  AbstractJavaSamplerClient {
public  Object  invokeTest( String  testName ,  JavaSamplerContext  context ,SampleResult  sample)  {
Method []  methods  =  this . getClass (). getMethods();
for ( Method  m  :  methods)  {
if ( m . getName (). equalsIgnoreCase( testName))  {
try  {
return  m . invoke( this ,  context , sample);
}  catch ( Throwable  t)  {
this . getLogger (). error( "execute method:"  +  testName  +  " falied" ,  t);
}
}
}
return  null;
}
}

3)GetPersonTest为某一类具有相似业务场景的测试类

其中 getDefaultParameters方法设置默认参数:test传入具体要执行的测试方法;info传入日志级别,利用main方法进行调试时设置为true,真正进行性能测试的时候设置为false

package  com . xxx . yyy . perf;
import  org.apache.jmeter.config.Argument;
import  org.apache.jmeter.config.Arguments;
import  org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import  org.apache.jmeter.samplers.SampleResult;
import  org.springframework.context.ApplicationContext;
import  org.springframework.context.support.ClassPathXmlApplicationContext;
import  com.xxx.udb.client.PersonService;
import  com.xxx.udb.client.result.MultiPersonResult;
import  com.xxx.udb.client.result.PersonResult;
import  com.xxx.udb.perf.base.AbstractServiceClient;
/**
* Test get person
* @author flynewton
*/
public  class  GetPersonTest  extends  AbstractServiceClient  {
private  static  final  ApplicationContext  ctx  =  new ClassPathXmlApplicationContext(
"spring-udb.xml");
private  static  PersonService  personService  =  null;
private  static  String  loginIdCache  =  "00000sb";
private  static  String  loginIdWithoutCache  =  "01haytham";
private  static  String  siteIdCache  =  "CN";
private  static  String  siteIdWithoutCache  =  "IN";
private  static  String  alimailCn  =  "gchg2008@zzgcchen.cn";
private  static  String  alimailUdb  =  "000001@lvcuinm.com.cn";
private  static  String  uidCache  =  "300113578";
private  static  String  uidWithoutCache  =  "in5002997";
private  static  String  emailCache  =  "00000sb@alibaba-test.com";
private  static  String  emailWithoutCache  =  "5002997@alibaba-inc.com";
@Override
public  void  setupTest( JavaSamplerContext  context)  {
super . setupTest( context);
personService  = ( PersonService)  ctx . getBean( "personServiceClient");
}
public  Arguments  getDefaultParameters()  {
Arguments  params  =  new  Arguments();
params . addArgument( "test" ,  "testMethod");
params . addArgument( "info" ,  "false");
return  params;
}
@Override
public  void  teardownTest( JavaSamplerContext  context)  {
super . teardownTest( context);
}
public  Object  testGetPersonByLongIdViaCache( JavaSamplerContext  arg0 ,
SampleResult  sample)  {
PersonResult  personResult  =  null;
try  {
sample . sampleStart();
personResult  =  personService . getPersonByLongId( siteIdCache , loginIdCache);
sample . sampleEnd();
}  catch ( Throwable  t)  {
this . getLogger (). error( "Exception:"  +  t);
return  null;
}
return  personResult;
}
public  Object  testGetPersonByLongIdWithoutCache( JavaSamplerContext  arg0 ,
SampleResult  sample)  {
PersonResult  personResult  =  null;
try  {
sample . sampleStart();
personResult  =  personService . getPersonByLongId( siteIdWithoutCache , loginIdWithoutCache);
sample . sampleEnd();
}  catch ( Throwable  t)  {
this . getLogger (). error( "Exception:"  +  t);
return  null;
}
return  personResult;
}
public  Object  testGetPersonByAlimailCN( JavaSamplerContext  arg0 ,
SampleResult  sample)  {
PersonResult  personResult  =  null;
try  {
sample . sampleStart();
相关文章

微服务测试之单元测试
一篇图文带你了解白盒测试用例设计方法
全面的质量保障体系之回归测试策略
人工智能自动化测试探索
相关文档

自动化接口测试实践之路
jenkins持续集成测试
性能测试诊断分析与优化
性能测试实例
相关课程

持续集成测试最佳实践
自动化测试体系建设与最佳实践
测试架构的构建与应用实践
DevOps时代的测试技术与最佳实践
 
分享到
 
 
     


LoadRunner性能测试基础
软件测试结果分析和质量报告
面向对象软件测试技术研究
设计测试用例的四条原则
功能测试中故障模型的建立
性能测试综述
更多...   


性能测试方法与技术
测试过程与团队管理
LoadRunner进行性能测试
WEB应用的软件测试
手机软件测试
白盒测试方法与技术


某博彩行业 数据库自动化测试
IT服务商 Web安全测试
IT服务商 自动化测试框架
海航股份 单元测试、重构
测试需求分析与测试用例分析
互联网web测试方法与实践
基于Selenium的Web自动化测试
更多...