依照市面上目前自动化的测试工具和产品,我们发现它们对常规协议:http、https等协议支持较好,可是对于非常规协议,如:dubbo、rmp等协议或者公司内部协议的支持不太好,基本上是完全不支持的。我们在本文来探讨一下如何支持非常规协议的自动化测试。
很多人会想到将非常规协议转变为常规协议后再做压测,这种方法的适用性不高,我们来举个例子:
我们想对某个dubbo协议的服务进行压测,dubbo协议的另一侧是企业的总线接入服务。这种场景下我们如果将dubbo协议包装一层成为http协议,那么http服务器有可能成为压测的瓶颈,因为企业总线的性能是很强劲的,因此需要使用复杂的http服务集群才能摆脱http服务器的瓶颈。小编就被这种方案害苦过,曾有一次压测集团的总线服务,因为现成的工具不支持dubbo协议,故将dubbo协议转换成http协议使用jmeter集群进行压测,发现性能普遍较低,和预想的性能有十倍之差,而问题还不只出现在http服务器,而是出在http调用dubbo时服务器对连接的承载数目,这种协议转换的方案慎用。
那么我们要使用哪种方法去进行这些非常规协议的自动化测试呢?
jmeter提供了一种java调用,可以直接调用java的类,如果我们将要封装的协议放在java类中,直接调用java类的话,其开销并不大,其一是因为java类的运行在压测机,使用压测机集群可以几乎无限制的消灭掉这种瓶颈,其二是java类的系统开销较低,几乎不会对压测造成影响。下面我们将对其实现方式进行详细的介绍。
我们将首先介绍通用的方法:
一.启动JMeter
下载:
http://jmeter.apache.org/download_jmeter.cgi
启动:
Linux环境下运行 $安装目录/bin/jmeter.sh
Windows下运行 $安装目录/bin/jmeter.bat
二.编写用例
针对"Java请求"类型的测试,需要基于JMeter测试框架编写用例。
1、新建一个普通的Java工程;
2、将 $JMeter安装目录/lib/ 目录引入工程;
3、新建Java Class,如下的"PerformanceTest ",并继承"AbstractJavaSamplerClient";
代码示例:
Java代码
/** * */ packagetest; importorg.apache.jmeter.config.Arguments; importorg.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext; importorg.apache.jmeter.samplers.SampleResult; /** *@author dingjingjing * */ publicclassPerformanceTestextendsAbstractJavaSamplerClient{ /** * */ privatestaticlongstart=0; privatestaticlongend=0; /** *执行runTest()方法前会调用此方法,可放一些初始化代码 */ publicvoidsetupTest(JavaSamplerContextarg0){ //开始时间 start=System.currentTimeMillis(); } /** *执行runTest()方法后会调用此方法. */ publicvoidteardownTest(JavaSamplerContextarg0){ //结束时间 end=System.currentTimeMillis(); //总体耗时 System.err.println("costtime:"+(end-start)/1000); } /** *JMeter界面中可手工输入参数,代码里面通过此方法获取 */ publicArgumentsgetDefaultParameters(){ Argumentsargs=newArguments(); returnargs; } /** *JMeter测试用例入口 */ @Override publicSampleResultrunTest(JavaSamplerContextarg0){ SampleResultsr=newSampleResult(); try{ //Start sr.sampleStart(); /** *Start~End内的代码会被JMeter *纳入计算吞吐量的范围内,为了使 *性能结果合理,无关代码不必放此 */ //TODO /** *True/False可按测试逻辑传值 *JMeter会对失败次数做出统计 */ sr.setSuccessful(true); //End sr.sampleEnd(); }catch(Exceptione){ e.printStackTrace(); } returnsr; } } |
4、导出成Jar并置于 $JMeter安装目录/lib/ext/ 下,若有依赖Jar也置于 $JMeter安装目录/lib/ 下;
5、启动或重启JMeter。