本周使用jmeter进行一个远程dubbo接口的性能测试,因为没有访问页面,本来开发可以写一个页面,进行http请求的调用,不过已经看到jmeter可以直接对java request进行测试,所以尝试了一下。
记录一下过程,写个demo进行下说明1、测试脚本的编写其实这个就是使用jmeter 自己的测试框架,写一个测试用例,实现对被测对象的调用,然后打包即可。a、引入jmeter框架依赖使用eclipse的时候,在工程上右键-》properties-》java build path将jmeter/lib 下的包都进行引入。b、新建一个测试class JavaTestc、引入jmeter的框架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;d、编写用例//新建的class必须继承"AbstractJavaSamplerClient"public class JavaTest extends AbstractJavaSamplerClient { //定义开始和截止的时间,可以在控制台打印出来时间,看响应情况 private static long start = 0; private static long end = 0; Param param; IService<DataModel, Param> service;//setup 开始 public void setupTest(JavaSamplerContext arg0) { start = System.currentTimeMillis(); try { //try中间是你进行调用的代码 } catch (Throwable e) { e.printStackTrace(); } } @SuppressWarnings("unchecked") @Override//jmeter的测试框架 public SampleResult runTest(JavaSamplerContext arg0) { SampleResult results = new SampleResult(); try { results.sampleStart(); //对上面方法的调用,jmeter会对sampleStart和sampleEnd之间的行为进行计时,作为响应时间 results.sampleEnd(); results.setSuccessful(true); } catch (Throwable e) { e.printStackTrace(); } return results; } public void teardownTest(JavaSamplerContext arg0) { end = System.currentTimeMillis();//可以在调试的时候自己打印时间 System.err.println("cost time:" + (end - start) / 1000); }//在eclipse中自行进行调试,新建一个main函数来完成运行 public static void main(String[] args) { JavaSamplerContext arg0 = new JavaSamplerContext(new Arguments()); PerformenceTest test = new JavaTest();//这三步可以很清晰的看出框架执行的方式 test.setupTest(arg0); test.runTest(arg0); test.teardownTest(arg0); }}2、jmeter脚本编写使用jmeter ui客户端,在线程组下添加一个java request,将之前编写的用例放到jmeter的 lib/ext 目录下面,这个时候就可以在类名称下拉菜单中,选择到自己写的用例了。3、本地和远程调试在本地调试的时候,将这个脚本依赖到的全部jar包都放到jmeter的 /lib 下面,只有自己实现的测试用例.jar 放到/lib/ext下面,这样jmeter的启动消耗会小一些;放到远程服务上进行压力的时候,和本地环境一样部署即可写了一个demo,更直观一些已给被测class为:public class HelloWorld { public static int sum = 0; public static void sum(int a, int b) { sum = a + b; // System.out.println(sum); } public static void main(String[] args) { // TODO Auto-generated method stub HelloWorld a = new HelloWorld(); a.sum(1, 2); }}测试上面这个class的性能,只需要实现一个用例,一直调用他,然后进行结果统计。测试case的实现:package TestCase;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 jmeter 的相关外部依赖import TestCase.HelloWorld;//import 被测对象public class PerformenceTest extends AbstractJavaSamplerClient { private static long start = 0; private static long end = 0; public void setupTest(JavaSamplerContext arg0) { start = System.currentTimeMillis();//获取当前系统时间 // System.out.println(start); } public SampleResult runTest(JavaSamplerContext arg0) { SampleResult sr = new SampleResult(); sr.sampleStart();// jmeter 开始统计响应时间标记 try { HelloWorld test = new HelloWorld(); test.sum(1, 1);//被测对象调用 } catch (Throwable e) { sr.setSuccessful(false); } finally { sr.sampleEnd();//jmeter 结束统计响应时间标记 } return sr; } public void teardownTest(JavaSamplerContext arg0) { end = System.currentTimeMillis(); // System.out.println(end); // System.out.println("The cost is"+(end-start)/1000); }//测试本地调试 public static void main(String[] args) { // TODO Auto-generated method stub JavaSamplerContext arg0 = new JavaSamplerContext(new Arguments()); PerformenceTest test = new PerformenceTest(); test.setupTest(arg0); test.runTest(arg0); test.teardownTest(arg0); }}有了上面的case,打包将jar放到jmeter/lib/ext中,可以在新建的jmeter脚本中获取测试方法,然后配置并发和启动延时,就可以了