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; } } |
原文轉自:http://www.uml.org.cn/Test/201401163.asp