A recent project requires performance testing, which consists of several applications offering services, the framework of which is Alibaba's open source service Framework Dubbo. About the introduction of Dubbo, the Internet also has a lot of information, I just did a rough understanding, there is no in-depth study, the relevant information address is as follows: http://www.iteye.com/magazines/103,http://alibaba.github.io/ dubbo-doc-static/user+guide-zh.htm#userguide-zh-%e6%80%a7%e8%83%bd%e6%b5%8b%e8%af%95%e6%8a%a5%e5%91%8a,http:// Www.oschina.net/p/dubbo, application examples (including source code): http://blog.csdn.net/wilsonke/article/details/39896595,http:// download.csdn.net/detail/u012049463/6338227
Jmeter (official website: http://jmeter.apache.org/download_jmeter.cgi) as an open source of performance testing tools, provides detailed user operation manuals, demo and API documentation, has always been our first choice to do performance testing, However, most of the previous work is the HTTP request test, the interface form of the Java request Test has not been practiced. The quickest way to learn is to find examples from the internet, according to gourd painting gourd, it is true that I did so, although there are a lot of similar posts on the Internet, but here still want to make a record of their own practice process. ^^ Two. Text: 1. How to write Java Test class for JMeter interface test
Package Com.huangjie.dubbo_Service.service.impl;
Import Com.huangjie.dubbo_Service.service.IProcessData;
public class Processdataimpl implements Iprocessdata {
/* * @see com.xxx.bubbo.provider.iprocessdata#deal ( java.lang.String)
*/
@Override public
String setage (string age) {
try {
thread.sleep (1000);
catch (Interruptedexception e) {
e.printstacktrace ();
}
Return ' you are ' + Age + ' years old! ';
}
@Override public
String sayhi (string name) {
try {
thread.sleep (1000);
} catch ( Interruptedexception e) {
e.printstacktrace ();
}
Return "Hi:" + name;
}
Client Javasampler test Case class
Package Com.huangjie.dubbo_Consumer;
Import org.apache.jmeter.config.Arguments;
Import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
Import Org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
Import Org.apache.jmeter.samplers.SampleResult;
Import Org.apache.log.Logger;
Import Org.springframework.context.support.ClassPathXmlApplicationContext;
Import Com.huangjie.dubbo_Service.service.IProcessData; public class Jmeterinterfacetest extends abstractjavasamplerclient{private static String Label_name = "Dubbo_consume R "//define label name, display in JMeter result window private static final Classpathxmlapplicationcontext context = new CLASSPATHXMLAPPL
Icationcontext ("Classpath*:applicationconsumer.xml");
private static Iprocessdata demoservice = null;
Private Logger log = GetLogger ();
@Override public void Setuptest (Javasamplercontext arg0) {log.info ("test case begins executing ..."); Define test initial values, setuptest use Demoservice = (iprocessdata) only before the test starts contExt.getbean ("Demoservice"); @Override public Arguments getdefaultparameters () {//parameter definitions, displayed in the foreground, or Arguments params = new
Arguments ();
Params.addargument ("name", "Tom");
Params.addargument ("Age", "23");
return params;
@Override public Sampleresult runtest (Javasamplercontext arg0) {Boolean success = true;
Sampleresult sr = new Sampleresult ();
Sr.setsamplelabel (Label_name);
Sr.samplestart ()//is used to count execution time--start--try {String name = Arg0.getparameter (' name ');
String msg = demoservice.sayhi (name);
Thread.Sleep (5000);
SYSTEM.OUT.PRINTLN (msg);
Sr.setresponsemessage (msg);
Sr.setresponsecode ("1000");
catch (Exception e) {success = false;
}finally{sr.sampleend ()//To count the execution time--end--sr.setsuccessful (success);
} return SR;
}@Override public void Teardowntest (Javasamplercontext arg0) {log.info ("End of test case execution ..."); }
}
Description
First, the Getdefaultparameters () method is used to define the parameters, where we define the name and age two parameters and assign the default value "Tom" and "23" so that you can see these two parameters in the Java request created by JMeter Selecting the above test class. and the parameter value can be arbitrarily modified.
Then, looking closely, we find that the test class contains only the Sayhi () method, and does not invoke the Setage () method provided by the server, and the reason why we do not call two test methods inside a test case is because our purpose here is to test a single scenario, That is, if you want to test the two methods separately, then you have to build a testing case class, the other parts of the code can be unchanged, as long as the implementation of the method to replace it. Therefore, we will think that if an interface provides n methods, then we will write a similar n classes, although copying and pasting is easy, but this will produce a heap of class files, feel very redundant, here can use the Java reflection mechanism to implement the dynamic invocation of the method. Simply put, in the Runtest () method, the method is not written to kill the specific use case call, but is determined by the Java reflection mechanism by input parameters. Rewrite the above test case class as follows:
Write an abstract class to inherit abstractjavasamplerclient, which writes only the dynamically invoked method, and other methods are overridden in the use case class.
Package Com.huangjie.dubbo_Consumer;
Import java.lang.reflect.InvocationTargetException;
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; Public abstract class Abstractserviceclient extends abstractjavasamplerclient{the public Object invokeruntest (String TestName, Javasamplercontext context, Sampleresult Sampleresult) {method[] methods = This.getclass ()
. GetMethods ();
For (method Method:methods) {if (Method.getname (). Equalsignorecase (testname)) {try {
Return Method.invoke (this, context, sampleresult);
catch (IllegalArgumentException e) {e.printstacktrace ();
catch (Illegalaccessexception e) {e.printstacktrace (); catch (InvocationtargetException e) {e.printstacktrace ();
}} return null; }
}
Test Case class inherits the abstract class of the dynamic method call above
Package Com.huangjie.dubbo_Consumer;
Import org.apache.jmeter.config.Arguments;
Import Org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
Import Org.apache.jmeter.samplers.SampleResult;
Import Org.springframework.context.support.ClassPathXmlApplicationContext;
Import Com.huangjie.dubbo_Service.service.IProcessData; public class Dynamicmethodinvoketest extends abstractserviceclient{private static String Label_name = "Dubbo_consume R "//define label name, displayed in JMeter result window private static final Classpathxmlapplicationcontext CXT = new Classpathxmlapplicat
Ioncontext ("Classpath*:applicationconsumer.xml");
private static Iprocessdata demoservice = null; @Override public void Setuptest (Javasamplercontext context) {//define test initial values, setuptest use Super.setup only before the test starts
Test (context);
Demoservice = (iprocessdata) cxt.getbean ("Demoservice"); @Override public Arguments getdefaultparameters () {//parameter definitions, displayed in the foreground, or undefined Argumentsparams = new Arguments ();
Params.addargument ("name", "Tom");
Params.addargument ("Age", "20");
Params.addargument ("TestName", "setage");
return params; @Override public Sampleresult runtest (Javasamplercontext context) {String testname = context.getpa
Rameter ("testname");
Sampleresult sr = new Sampleresult ();
Super.invokeruntest (testname, Context, SR);
return SR;
public void Setage (Javasamplercontext context, Sampleresult SR) {Boolean success = true;
Sr.setsamplelabel ("Setage");
Sr.samplestart ();
try {String age = context.getparameter (' age ');
String msg = Demoservice.setage (age);
Thread.Sleep (5000);
SYSTEM.OUT.PRINTLN (msg);
Sr.setresponsemessage (msg);
Sr.setresponsecode ("1000");
catch (Exception e) {success = false; }finally{SR.SAMpleend ();
Sr.setsuccessful (Success);
} public void Sayhi (Javasamplercontext context, Sampleresult SR) {Boolean success = true;
Sr.setsamplelabel ("Sayhi");
Sr.samplestart ();
try {String name = Context.getparameter (' name ');
String msg = Demoservice.sayhi ("Hi," +name);
Thread.Sleep (5000);
SYSTEM.OUT.PRINTLN (msg);
Sr.setresponsemessage (msg);
Sr.setresponsecode ("1001");
catch (Exception e) {success = false;
}finally{Sr.sampleend ();
Sr.setsuccessful (Success);
} @Override public void Teardowntest (Javasamplercontext context) {super.teardowntest (context); }
}
Here we have added a parameter testname, which determines which use case method to call specifically. In this way, we realize that in the same class to write different test cases, feel more elegant, haha. two. Create Java Sampler Test plan in JMeter
To perform the test cases written above in JMeter, there are several steps to follow:
1. The project into a jar package, Method 1 with Eclipse or myeclipse export directly exported jar package, Method 2 with MAVEN package or this install instructions packaging, it is recommended to use MAVEN to manage the project, packaging convenient and not error, I tried to export the jar package directly from the IDE, but I did not find the spring bean configuration file in the execution process, and it didn't happen with maven packaging.
2. Put the jar pack into the JMeter lib/ext path, run JMeter, and find the test case class that you wrote in the new Java request sampler.
3. Copy all the jar packages that the project relies on to the JMeter Lib path, because running your own test cases may use the classes in these jars, or you will not be able to find class during execution. If it is a MAVEN project, you can export all the dependent jars in the project to the Target/dependency folder of the project by executing instructions MVN dependency:copy-dependencies, and then copy to the JMeter lib.
4. Run JMeter start creating your test plan according to specific performance metrics and scenarios.