求助如何确定JMeter分布式httpclient 性能测试试client能承受的最大thr

JMeter&JMeter远程分布式联机性能测试
JMeter远程分布式联机性能测试
apache-jmeter-2.13
Java JDK版本:1.8
JMeter分布式测试简介
当一个JMeter客户端因网络限制等因素,无法模拟足够的用户对服务器施压时,需要用到JMeter分布式测试:用一台控制机,控制多台远程负载机,同时对服务器施压。
选定客户端
选择一台本地机器,当作JMeter客户端(控制器),用于控制远程JMeter实例(也叫JMeter
引擎),即远程负载生成机,并收集来自从这些远程负载机的数据。
在本机上创建并调试脚本,保证脚本可运行。
修改jmeter.properties配置文件
修改$jmeter_home\bin\文件(D:\Program
Files ),打开该文件,找到如下内容,并添加带背景色部分的内容:
# Remote Hosts - comma delimited
remote_hosts=127.0.0.1
remote_hosts=:
#remote_hosts=localhost:1099,localhost:2010
说明:如上,192.168.9.133,192.168.9.66分别为远程负载机的ip地址,端口1099为JMeter用于访问远程负载生成机的端口rmi.port,“ip地址:端口”之间以逗号分隔,按这种方式可以增加多个负载机,具体上限未知。
关于端口更改的说明(参考官方文档):
)更改访问远程负载机的端口(假设改成1234
JMeter客户端:
jmeter.properties,找到如下带背景色内容:
修改为如下:
server.rmi.port=1234
服务器端:
进入cmd控制台操作:
C:\JMETER& SET SERVER_PORT=1234
C:\JMETER& JMETER-SERVER [other options]
$ SERVER_PORT=1664 jmeter-server [other options]
)更改供负载机监听远程请求使用的rmi端口
jmeter.properties,找到如下带背景色内容:
修改为如下
1、client.rmi.localport=0表示随机分配端口,否则使用指定端口
2、个人理解,这里的端口是客户端和负载机建立TCP套socket接字时,分配给客户端的端口
3)为JMeter引擎指定一个固定端口(假设为3000
jmeter.properties,找到如下带背景色内容:
修改成如下:
说明:啥时候需要改这个端口我也不是很懂
说明:以上3点未经过本人实践验证,仅供参考,通常使用默认的即可
启动负载机
双击.bat(形如D:\Program
(x86)\Jmeter\apache-jmeter-2.13\bin\-server.bat)
运行$JMeter_home\bin\jmeter-server
4:验证测试
重新在JMeter客户机上开启Jmeter,载入调试好的脚本
远程启动|远程全部启动,可以选择单独启动某个负载机或者一次性启动全部负载机
1、这里的启动负载机后会立即执行负载测试,我们可以通过
查看结果树等监听器查看请求是否成功,为方便查看是否执行成功(看执行的请求数),
建议开始正式测试前,先把线程组设置为单线程,仅运行一次,等确定没问题以后再改成目标设置
注意:关于线程组中“线程数”的正确理解
举例说明:假设“线程数”设置为1,总的有2台负载机(每台负载机只运行一个JMeter实例),1台客户机,那么启动全部负载机进行负载测试时,总的线程数为
= 2,也就说,每台负载机都会启动线程组中指定的“线程数”来执行负载测试
b)结合菜单“选项-&Log
Viewer”查看运行日志
查看远程负载机输出是否正常,如下
我们可以看到,负载机成功执行了好几次,正常开始(Starting),正常结束(Finished)
2、客户机性能不够好或者网络不够好的情况下,一次性启动全部负载机可能会有点“卡”
步骤5:执行负载测试
说明:提前停止/退出
如果想停止远程负载机的测试,可以选择
远程停止|远程全部停止
如果想远程负载机退出程序,可以选择
远程退出|远程全部退出
注意事项及问题分析
注意事项:
a)客户机上一定要保存并打开一份测试计划脚本
b)不需要复制测试计划脚本到负载机上,客户机会自动把脚本分发到负载机上
每台负载机,客户端上安装的java
jdk版本(至少保持大版本一致),特别是jmeter版本及插件,要保持一致,防止出错和执行效率等问题
如果客户机上测试计划脚本,使用了参数文件,那么需要在负载机上相同路径下,放置对应文件的同名文件拷贝。需要认真检查每个插件使用的数据文件
举例说明:
比如,我的查看结果树监听器,把数据保存到了某个文件:F:\.csv文件,那么我们要负载机器上的F:\路径下,存一份名为“查看结果树.csv”的对应文件拷贝
客户机和负载机最好分开,由于客户机需要发送信息给负载机并且会接收负载机回传回来的测试数据,所以客户机自身会有消耗,所以建议单独用一台机器作为客户机。
避免防火墙阻止对应端口的访问,最好把防火墙都关闭了。
实践中遇到一个问题,就是JMeter可以启动负载机,但是启动后没能执行成功,没看到发起的请求,通过Log
Viewer也没看到错误信息,后面咋办?
找日志,负载机上打开$JMeter_home\bin\jmeter-server.log,查看是否有报错信息,结果发现如下:
20:37:20 ERROR - jmeter.samplers.BatchSampleSender:
sampleOccurred java.rmi.ConnectException:
Connection refused to host: 169.254.82.102; nested exception
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
Caused by: java.net.ConnectException: Connection timed out:
at java.net.DualStackPlainSocketImpl.connect0(Native
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown
at java.net.AbstractPlainSocketImpl.doConnect(Unknown
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown
at java.net.AbstractPlainSocketImpl.connect(Unknown
at sun.rmi.trans
如上,很好奇这个ip是哪里的,打开客户机,cmd命令查看
如上,原因就不用说了吧,解决方法如下:
确保万无一失,把客户机上“本地连接”除外的网卡适配器都禁用,然后重新启动客户机上的JMeter软件(一定要重启),重新打开负载机上的jmeter-server.bat,然后重新执行步骤4,OK
参考连接:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1004人阅读
java(63)
测试工具(79)
 一、核心步骤
  1.创建一个Java工程;
  2.将的lib目录下的jar文件添加进此工程的Build
  3.创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写:
public Arguments getDefaultParameters():设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
public void teardownTest(JavaSamplerContext arg0):测试结束时调用;
4.Export为Runnable Jar File;
  5.将此jar包放入JMETER_HOMElibext目录;
  6.以管理员身份打开JMeter;
  7.创建线程组、Java Request、结果树,进行测试;
  二、实例
  利用JMeter对服务进行,服务为:将输入的两个参数通过IO存入文件;
  1、编写Java代码
  服务:
import java.io.F
import java.io.PrintW
public class OutputService {
public static void output(String filename,int a, int b) throws Exception {
PrintWriter out = new PrintWriter(new File(filename));
out.write(a+&:&+b);
out.close();
  测试类:
import org.apache.jmeter.config.A
import org.apache.jmeter.protocol.java.sampler.JavaSamplerC
import org.apache.jmeter.protocol.java.sampler.JavaSamplerC
import org.apache.jmeter.samplers.SampleR
public class PerformenceTest implements JavaSamplerClient {
private SampleR
// 设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument(&filename&, &0&);//设置参数,并赋予默认值0
params.addArgument(&a&, &0&);//设置参数,并赋予默认值0
params.addArgument(&b&, &0&);//设置参数,并赋予默认值0
// 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行
public void setupTest(JavaSamplerContext arg0) {
results = new SampleResult();
// 测试执行的循环体,根据线程数和循环次数的不同可执行多次
public SampleResult runTest(JavaSamplerContext arg0) {
b = arg0.getParameter(&b&); // 获取在Jmeter中设置的参数值
a = arg0.getParameter(&a&); // 获取在Jmeter中设置的参数值
filename = arg0.getParameter(&filename&); // 获取在Jmeter中设置的参数值
results.sampleStart();// jmeter 开始统计响应时间标记
OutputService test = new OutputService();
test.output(filename,Integer.parseInt(a), Integer.parseInt(b));
results.setSuccessful(true);
// 被测对象调用
} catch (Throwable e) {
results.setSuccessful(false);
e.printStackTrace();
} finally {
results.sampleEnd();// jmeter 结束统计响应时间标记
// 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行
public void teardownTest(JavaSamplerContext arg0) {
public static void main(String[] args) {
// TODO Auto-generated method stub
Arguments params = new Arguments();
params.addArgument(&a&, &0&);//设置参数,并赋予默认值0
params.addArgument(&b&, &0&);//设置参数,并赋予默认值0
JavaSamplerContext arg0 = new JavaSamplerContext(params);
PerformenceTest test = new PerformenceTest();
test.setupTest(arg0);
test.runTest(arg0);
test.teardownTest(arg0);
Export 为 Runnable Jar File;
  2、设置JMeter
  以管理员身份打开JMeter,并创建Java Request后,结构如下图所示:
  在Java请求中发现了自己新建的测试类:
  我们在JMeter中发现参数有三个:
  我们在响应的数值中填入:
  大家一定很奇怪,怎么会有一些看不懂的东西,这是JMeter提供的函数,我们可以在
  因为我们要做的是性能测试,因此我们需要开多个线程并发测试,因此随机数很重要;
  常用的函数为:
  (1)_Random生成随机整数;
  (2)_RandomString生成随机字符串;
  在线程组中设置并发线程数为10000,保存后即可运行;
  图形结果如下所示:
  聚合报告:
  表格查看结果:
  结果成功,成功生成了接近10000个文件:
  3.期间遇到的问题
  3.1 Export为Jar File导致Java Request的类名称无法找到;
  3.2 JMeter java.lang.OutOfMemoryError: PermGen space问题:
  在JMeter.bat 中修改:
  set HEAP=-Xms512m -Xmx1024m
  set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
  set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%
  set TENURING=-XX:MaxTenuringThreshold=2
  set RMIGC=-Dsun.rmi.dgc.client.gcInterval=600000 -Dsun.rmi.dgc.server.gcInterval=600000
  set PERM=-XX:PermSize=256m -XX:MaxPermSize=512m
  3.3 JMeter需要以管理员身份打开,否则会出现:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:244089次
积分:3392
积分:3392
排名:第9884名
原创:44篇
转载:345篇
评论:15条
(12)(9)(13)(3)(22)(49)(14)(7)(1)(2)(10)(7)(1)(3)(41)(3)(1)(1)(2)(3)(25)(14)(33)(28)(29)(8)(13)(7)(6)(8)(9)(7)trackbacks-0
日编写& &日修改1. 线程组,在我们测试方案里面,每个线程模拟一个用户,执行用户的登录、等等等一系列的操作。由于我们的项目是长连接的,如何能实现多个sample公用一个长连接客户端,考虑了很久,最后实现方法如下:&1&package&tea.client.&2&/**&3&&*&@author&Teaey&4&&*&@creation&&5&&*/&6&public&class&NetworkClientHolder&7&{&8&&&&&/**&9&&&&&&*&这里使用ThradLocal存储BaseClient10&&&&&&*&方便一轮测试的每个sample都是由同一个socketChannel发送11&&&&&&*&更真实的模拟用户12&&&&&&*/13&&&&&private&static&ThreadLocal&BaseClient&&clientHolder&=&new&ThreadLocal&BaseClient&();14&&&&&public&static&BaseClient&getClient(String&ip,&String&port)15&&&&&{16&&&&&&&&&BaseClient&client&=&clientHolder.get();17&&&&&&&&&if&(null&==&client)18&&&&&&&&&{19&&&&&&&&&&&&&client&=&new&BaseClient(ip,&port);20&&&&&&&&&&&&&client.connect();21&&&&&&&&&&&&&clientHolder.set(client);22&&&&&&&&&}23&&&&&&&&&return&24&&&&&}25&}26&代码中使用thread_local保存Socket客户端,这样每个sample中发送数据的客户端都是从这里拿的,就可以保证长连接的情况下,socket不会重复创建,很好的模拟了用户。当然不单单是链接可以保存,所有需要在线程中共享的数据都可以通过这种方法来实现。2. 接下来是如何封装发送请求的客户端,这里用的netty,具体可以根据项目情况使用mina或者nio都可以。代码直接明了^_^:& 1&package&tea.client.&&2&&&3&import&java.net.InetSocketA&&4&import&java.util.concurrent.E&&5&import&org.jboss.netty.bootstrap.ClientB&&6&import&org.jboss.netty.channel.C&&7&import&org.jboss.netty.channel.ChannelF&&8&import&org.jboss.netty.channel.ChannelHandlerC&&9&import&org.jboss.netty.channel.ChannelP&10&import&org.jboss.netty.channel.ChannelPipelineF&11&import&org.jboss.netty.channel.ChannelStateE&12&import&org.jboss.netty.channel.C&13&import&org.jboss.netty.channel.ExceptionE&14&import&org.jboss.netty.channel.MessageE&15&import&org.jboss.netty.channel.SimpleChannelH&16&import&org.jboss.netty.channel.socket.nio.NioClientSocketChannelF&17&import&mon.network.ClientD&18&import&mon.network.ClientE&19&import&mon.network.ClientM&20&&21&/**&22&&*&@author&Teaey&23&&*&@creation&&24&&*/&25&public&class&BaseClient&26&{&27&&&&&public&BaseClient(String&ip,&String&port)&28&&&&&{&29&&&&&&&&&this.ip&=&&30&&&&&&&&&this.port&=&&31&&&&&}&32&&&&&private&String&&&&&&&&&&&&33&&&&&private&String&&&&&&&&&&&&34&&&&&private&Channel&&&&&&&&&&&35&&&&&private&ClientBootstrap&&&36&&&&&private&Object&&&&&&&&&&&syn&&&&&&&&&&&&&=&new&Object();&37&&&&&private&static&final&int&Receive_Timeout&=&10000;&&&&&&&//ms&38&&&&&private&ClientMessage&&&&response&&&&&&&&=&null;&39&&&&&public&void&connect()&40&&&&&{&41&&&&&&&&&bootstrap&=&new&ClientBootstrap(new&NioClientSocketChannelFactory(Executors.newCachedThreadPool(),&Executors.newCachedThreadPool()));&42&&&&&&&&&bootstrap.setOption("tcpNoDelay",&true);&43&&&&&&&&&bootstrap.setPipelineFactory(new&ClientPipelineFactory());&44&&&&&&&&&while&(true)&45&&&&&&&&&{&46&&&&&&&&&&&&&ChannelFuture&future&=&bootstrap.connect(new&InetSocketAddress(ip,&Integer.parseInt(port)));&47&&&&&&&&&&&&&future.awaitUninterruptibly(5000);&48&&&&&&&&&&&&&if&(future.isDone())&49&&&&&&&&&&&&&{&50&&&&&&&&&&&&&&&&&channel&=&future.getChannel();&51&&&&&&&&&&&&&&&&&if&(channel&!=&null&&&&channel.isConnected())&52&&&&&&&&&&&&&&&&&{&53&&&&&&&&&&&&&&&&&&&&&break;&54&&&&&&&&&&&&&&&&&}&55&&&&&&&&&&&&&}&56&&&&&&&&&}&57&&&&&}&58&&&&&public&void&disconnect()&59&&&&&{&60&&&&&&&&&if&(channel.isConnected())&61&&&&&&&&&{&62&&&&&&&&&&&&&channel.disconnect();&63&&&&&&&&&}&64&&&&&}&65&&&&&public&boolean&isConnected()&66&&&&&{&67&&&&&&&&&return&channel.isConnected();&68&&&&&}&69&&&&&public&void&close()&70&&&&&{&71&&&&&&&&&if&(this.channel.isOpen())&72&&&&&&&&&{&73&&&&&&&&&&&&&this.channel.close();&74&&&&&&&&&}&75&&&&&&&&&bootstrap.releaseExternalResources();&76&&&&&}&77&&&&&/**&78&&&&&&*&发送消息,无需返回&79&&&&&&*/&80&&&&&public&void&send(ClientMessage&message)&81&&&&&{&82&&&&&&&&&channel.write(message);&83&&&&&}&84&&&&&/**&85&&&&&&*&发送消息,等待返回&86&&&&&&*/&87&&&&&public&ClientMessage&sendWaitBack(ClientMessage&message)&88&&&&&{&89&&&&&&&&&response&=&null;&90&&&&&&&&&try&91&&&&&&&&&{&92&&&&&&&&&&&&&channel.write(message);&93&&&&&&&&&&&&&synchronized&(syn)&94&&&&&&&&&&&&&{&95&&&&&&&&&&&&&&&&&try&96&&&&&&&&&&&&&&&&&{&97&&&&&&&&&&&&&&&&&&&&&syn.wait(Receive_Timeout);&98&&&&&&&&&&&&&&&&&}&catch&(InterruptedException&e)&99&&&&&&&&&&&&&&&&&{100&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();101&&&&&&&&&&&&&&&&&}102&&&&&&&&&&&&&}103&&&&&&&&&&&&&if&(null&==&response)104&&&&&&&&&&&&&{105&&&&&&&&&&&&&&&&&System.err.println("Receive&response&timeout");106&&&&&&&&&&&&&}107&&&&&&&&&}&catch&(Exception&e)108&&&&&&&&&{109&&&&&&&&&&&&&e.printStackTrace();110&&&&&&&&&}111&&&&&&&&&return&112&&&&&}113&&&&&class&ClientPipelineFactory&implements&ChannelPipelineFactory114&&&&&{115&&&&&&&&&public&ChannelPipeline&getPipeline()&throws&Exception116&&&&&&&&&{117&&&&&&&&&&&&&ChannelPipeline&p&=&Channels.pipeline();118&&&&&&&&&&&&&p.addLast("frameDecoder",&new&ClientDecoder());119&&&&&&&&&&&&&p.addLast("fremeEncoder",&new&ClientEncoder());120&&&&&&&&&&&&&p.addLast("logicHandler",&new&ClientMsgHandler());121&&&&&&&&&&&&&return&p;122&&&&&&&&&}123&&&&&}124&&&&&class&ClientMsgHandler&extends&SimpleChannelHandler125&&&&&{126&&&&&&&&&public&void&messageReceived(ChannelHandlerContext&ctx,&MessageEvent&e)&throws&Exception127&&&&&&&&&{128&&&&&&&&&&&&&Object&obj&=&e.getMessage();129&&&&&&&&&&&&&if&(obj&instanceof&ClientMessage)130&&&&&&&&&&&&&{131&&&&&&&&&&&&&&&&&ClientMessage&msg&=&(ClientMessage)&132&&&&&&&&&&&&&&&&&response&=&133&&&&&&&&&&&&&&&&&synchronized&(syn)134&&&&&&&&&&&&&&&&&{135&&&&&&&&&&&&&&&&&&&&&syn.notifyAll();136&&&&&&&&&&&&&&&&&}137&&&&&&&&&&&&&}138&&&&&&&&&}139&&&&&&&&&public&void&channelConnected(ChannelHandlerContext&ctx,&ChannelStateEvent&e)&throws&Exception140&&&&&&&&&{141&&&&&&&&&&&&&System.out.println("connected&server:"&+&ctx.getChannel());142&&&&&&&&&}143&&&&&&&&&public&void&channelDisconnected(ChannelHandlerContext&ctx,&ChannelStateEvent&e)&throws&Exception144&&&&&&&&&{145&&&&&&&&&&&&&System.out.println("disconnected&server:"&+&ctx.getChannel());146&&&&&&&&&}147&&&&&&&&&public&void&exceptionCaught(ChannelHandlerContext&ctx,&ExceptionEvent&e)&throws&Exception148&&&&&&&&&{149&&&&&&&&&&&&&System.out.println("Error&in&exceptionCaught:"&+&e.getCause());150&&&&&&&&&}151&&&&&}152&}153&这段代码展示了我们的客户端,这里所有的请求有两种发送模式,一种是发送并阻塞等待返回(sendWaitBack),第二种就是直接发送(send)。3. 有了发送请求的客户端,那如何能够更简单的实现一个协议好让客户端发送,再贴一段代码^_^:& 1&package&tea.client.&&2&&&3&import&org.apache.jmeter.config.A&&4&import&org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerC&&5&import&org.apache.jmeter.protocol.java.sampler.JavaSamplerC&&6&import&org.apache.jmeter.samplers.SampleR&&7&import&com.google.protobuf.InvalidProtocolBufferE&&8&import&com.google.protobuf.MessageL&&9&&10&/**&11&&*&@author&Teaey&12&&*&@creation&&13&&*/&14&public&abstract&class&BaseSample&extends&AbstractJavaSamplerClient&15&{&16&&&&&public&static&final&String&PARAM_IP&&&=&"ip";&17&&&&&public&static&final&String&PARAM_PORT&=&"port";&18&&&&&public&static&final&String&VAR_IP&&&&&=&"${ip}";&19&&&&&public&static&final&String&VAR_PORT&&&=&"${port}";&20&&&&&protected&BaseClient&&&&&&&&21&&&&&public&void&addParameter(Arguments&params)&22&&&&&{&23&&&&&}&24&&&&&/**&25&&&&&&*&Jmeter获取消息参数,默认配置ip和port两个参数&26&&&&&&*&如果子类有更多参数,调用super.getDefaultParameters()获取Arguments后,继续设置其他方法&27&&&&&&*/&28&&&&&@Override&29&&&&&public&Arguments&getDefaultParameters()&30&&&&&{&31&&&&&&&&&System.out.println("1.getDefaultParameters");&32&&&&&&&&&Arguments&params&=&new&Arguments();&33&&&&&&&&&params.addArgument(PARAM_IP,&VAR_IP);&34&&&&&&&&&params.addArgument(PARAM_PORT,&VAR_PORT);&35&&&&&&&&&addParameter(params);&36&&&&&&&&&return&&37&&&&&}&38&&&&&/**&39&&&&&&*&runTest的前置方法&40&&&&&&*/&41&&&&&@Override&42&&&&&public&void&setupTest(JavaSamplerContext&context)&43&&&&&{&44&&&&&&&&&System.out.println("2.setupTest:"&+&context.containsParameter(PARAM_IP));&45&&&&&&&&&String&ip&=&context.getParameter(PARAM_IP);&46&&&&&&&&&String&port&=&context.getParameter(PARAM_PORT);&47&&&&&&&&&this.client&=&NetworkClientHolder.getClient(ip,&port);&48&&&&&&&&&System.out.println("thread---&"&+&Thread.currentThread().getId()&+&"&client---&"&+&client);&49&&&&&}&50&&&&&/**&51&&&&&&*&Jmeter调用,用于实际的测试&52&&&&&&*/&53&&&&&@Override&54&&&&&public&SampleResult&runTest(JavaSamplerContext&context)&55&&&&&{&56&&&&&&&&&SampleResult&sample&=&getSample();&57&&&&&&&&&sample.sampleStart();&58&&&&&&&&&try&59&&&&&&&&&{&60&&&&&&&&&&&&&MessageLite&response&=&doTest();&61&&&&&&&&&&&&&String&msg&=&response&==&null&?&""&:&response.toString();&62&&&&&&&&&&&&&sample.setResponseMessage(msg);&63&&&&&&&&&&&&&sample.setSuccessful(true);&64&&&&&&&&&}&catch&(Exception&e)&65&&&&&&&&&{&66&&&&&&&&&&&&&sample.setSuccessful(false);&67&&&&&&&&&&&&&e.printStackTrace();&68&&&&&&&&&}&finally&69&&&&&&&&&{&70&&&&&&&&&&&&&sample.sampleEnd();&71&&&&&&&&&}&72&&&&&&&&&return&&73&&&&&}&74&&&&&/**&75&&&&&&*&获取本Sample的标签,子类实现&76&&&&&&*/&77&&&&&public&abstract&String&getLabel();&78&&&&&/**&79&&&&&&*&获取一个带标签的Sample&&80&&&&&&*/&81&&&&&public&SampleResult&getSample()&82&&&&&{&83&&&&&&&&&SampleResult&sample&=&new&SampleResult();&84&&&&&&&&&sample.setSampleLabel(getLabel());&85&&&&&&&&&return&&86&&&&&}&87&&&&&/**&88&&&&&&*&Jmeter调用,用于&89&&&&&&*/&90&&&&&@Override&91&&&&&public&void&teardownTest(JavaSamplerContext&context)&92&&&&&{&93&&&&&&&&&System.out.println("4.teardownTest");&94&&&&&}&95&&&&&/**&96&&&&&&*&需实现,具体测试的方法,调用client的send/sendWithBack发送请求&97&&&&&&*&如无返回,放回null即可&&98&&&&&&*/&99&&&&&public&abstract&MessageLite&doTest()&throws&InvalidProtocolBufferE100&}好的,这里封装了下AbstractJavaSamplerClient,每个消息默认包含ip和port参数,这可以再jmeter的用户变量中定义好。为了方便大家添加消息的参数,这里实现了空的addParameter(Arguments params)方法,这样在具体消息中直接重写这个方法,来添加具体的参数。是不是很方便?^_^,具体协议还需要实现的两个方法分别是:getLabel和doTest。第一个方法时用于报告显示的请求名字,一般定义为消息名字+“Label”就OKay。第二个方法就是我们重点重写的方法,这里再贴段代码,是一个具体消息的实现:&1&package&tea.&2&&3&import&com.google.protobuf.InvalidProtocolBufferE&4&import&com.google.protobuf.MessageL&5&import&tea.client.network.BaseS&6&import&mon.network.ClientM&7&import&mon.network.RPC.HeartBeat_C2S;&8&import&mon.network.RPC.HeartBeat_S2C;&9&10&/**11&&*&@author&Teaey12&&*&@creation&13&&*/14&public&class&HeartBeatSample&extends&BaseSample15&{16&&&&&@Override17&&&&&public&MessageLite&doTest()&throws&InvalidProtocolBufferException18&&&&&{19&&&&&&&&&HeartBeat_C2S.Builder&request&=&HeartBeat_C2S.newBuilder();20&&&&&&&&&request.setTimestamp(System.currentTimeMillis());21&&&&&&&&&ClientMessage&cm&=&new&ClientMessage();22&&&&&&&&&cm.setContent(request.build().toByteArray());23&&&&&&&&&cm.setName("HeartBeat");24&&&&&&&&&ClientMessage&sm&=&client.sendWaitBack(cm);25&&&&&&&&&HeartBeat_S2C&response&=&HeartBeat_S2C.parseFrom(sm.getContent());26&&&&&&&&&return&27&&&&&}28&&&&&@Override29&&&&&public&String&getLabel()30&&&&&{31&&&&&&&&&return&"HeartBeatSample";32&&&&&}33&}34&可以看到doTest的工作就是封装请求,并拿到父类的client发送,然后返回响应(send方式返回null),Okay,大功告成。要说的就是这么多,写得不好但属原创,体量作者转载请标明出处。提意见请留言或者163邮箱:masfay,感谢。
阅读(6240)
&re: Jmeter“Java请求”使用总结
看了你的blog,受益匪浅~! 有个问题请教你:如果是异步的请求,应该怎样设置SampleResult? 比如我在runTest里发一个登陆请求,它的登陆回复应该是在messageReceived里,这时runTest函数要阻塞等待么?还是jmeter根本就不适用这种场景?&&&&&&
&re: Jmeter“Java请求”使用总结
@打杂程序员在登录的Sample里,需要阻塞等待登录返回的,Jmeter可以这么做,一般单独作为一个sample,这样也可以统计出登录所消耗的时间&&&&&&
阅读排行榜
评论排行榜}

我要回帖

更多关于 client 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信