文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

在TCP协议服务里,客户端向服务端发送文本或二进制信息,并从服务端接收响应。 Apache JMeter™的TCP取样器和TCP取样配置项对这类型服务进行负载测试。

这篇文章将解释如何测试一个通过回传的简单的TCP服务(服务端响应时直接回传请求的数据)。对应的TCP服务的JAR文件和java源码可以在这里下载。在我们的JMeter脚本中,我们将通过TCP取样发送数据到服务器,从服务器获取响应并分析它们。同时,我们将添加一个TCP采样配置。

第 1 段(可获 1.44 积分)

让我们开始吧。

TCP取样器

在JMeter测试计划中添加一个线程组:右键点击 > Add > Threads > Thread Group.

在线程组下添加一个 TCP Sampler 的子线程:右键点击 > Sampler > TCP Sampler.

add the tcp sampler to jmeter

在JMeter中有三种TCP取样实现方式:在被测服务中,一种通过文本数据进行交互,另外两种通过二进制数据进行交互。

每个实现都由某个特定类提供,这是一个“模板”或一组对象的属性。 在TCP取样器中,TCPClient class name 字段里输入类名。

第 2 段(可获 1.3 积分)

tcp sampler class name jmeter

类名, JMeter文档中有给出:

  • TCPClientImpl。这是实现文本消息交换的基本类。在TCP取样器中,Text to send字段提供不同字符集的文本常量或可变字符串信息。
  • BinaryTCPClientImpl。这是一个用于实现文本信息交互的类。Text to send字段中提供十六进制编码的二进制文本常量或变量信息。
  • LengthPrefixedBinaryTCPClientImpl。这个类跟上一个的类似,但是在发送数据之前会加一个二进制的字节长度数据前辍。 
第 3 段(可获 1.34 积分)

基本实现

让我们在脚本中实现基本的TCP服务。

TCPclient class name 字段填写类名。在该例子中,它是TCPClientImpl。因为是默认类名, 所以可以忽略。

server name or IP 是要登录的TCP服务器。 Port 字段是TCP服务器监听端口。

text to send 信息包含了要向服务器发送的文本。 为了证明Text to send 字段可以处理JMeter变量和函数,我将把线程组循环次数改为2,并且添加 ${__iterationNum()}函数到TCP取样文本中。这个函数方法将打印出当前所执行的线程组的迭代次数。

第 4 段(可获 1.7 积分)

tcp sampler configuration jmeter

添加一个 View Results Tree 监听器 到线程组监听来自TCP服务器的响应: 右键点击 > Add > Listener > View Results Tree。

保存脚本, 启动一个简单的TCP服务器应用程序,该端口参数要与脚本中配置的端口参数相同,并且启动脚本。

打开 View Results Tree 监听器。 如上文所述, 被测 TCP 服务工作在回传模式,但在每个请求中添加了一个包编号信息字符串的处理。在下面的截图中,您可以看到TCP采样器的响应:

view results tree listener jmeter for tcp sampler

这些都是应用到TCP采样器的必要配置设置。 但在某些情况下, 当我们必须考虑到某些特定参数的网络或测试服务器时, 我们需要用到附加设置:

第 5 段(可获 1.66 积分)
  • Connect timeout 参数决定了特定的TCP取样器等待从服务器建立连接的最长时间,以毫秒为单位。
  • Response timeout 参数决定了特定的TCP取样器等待服务器的响应的最长时间。 如果你需要考虑网络传播时间或服务器的响应时间, 你可以调整这些采样器参数,以避免收到太多的超时采样。
  • Re-use connection 参数表示脚本使用相同的连接发送数据;否则,在前面建立的连接会话将被使用。
  • Close connection 参数表示脚本在每次发送新数据时会关闭连接并打开一个新连接。
  • 如果设置了 Set NoDelay 参数,小的信息,即使只有 1 个字节, 都会以一个单独的包发送。 否则, 如果清除此参数, 一些小的信息会合并到一个包里发送。
  • 可以在套接字中启用 SO_LINGER 选项,使脚本阻止关闭连接几秒。 借此使所有数据最终可以传输到目的地。
第 6 段(可获 2.58 积分)

二进制类实现 

如果我们需要与TCP服务器交换二进制数据,我们需要在TCP取样的 TCPclient class name 字段中指定BynaryTCPClientImpl 类。 二进制数据以十六进制的编码格式填入到 Text to send 字段,如下图所示。

让我们添加一个额外的TCP采样器,它向TCP服务器发送二进制数据。采样器显示在下面的截图中:

tcp sampler for binary data, jmeter

Text to send 字段中,让我们发送两位十六进制数字表示一个字节序列, 并查看TCP采样响应是如何表示的。 字节序列应该以小于20的值结束。在这个例子中,发送到TCP服务器的十六进制编码格式的二进制数据是: 63646f0a。

第 7 段(可获 1.83 积分)

View Result Tree 监听器显示了从TCP取样接收到的没有转成字符的十六进制编码格式的数据:

view results tree listeter jmeter hex 

这里十六进制响应数据是 5061636b657420333a200a63646f0a。 发送到TCP服务器的数据在结尾处并加下划线。在出现十六进制编码序列之前, 表示分组号的信息—— 每2位为十六进制格式的ACSII码。

带长度前辍的二进制类实现 

带长度前辍的二进制TCP客户端实现类似二进制类实现,不同点在于字节数会插入到每个发送信息中。JMeter 在发送每个信息到TCP服务器之前会自动插入这个数值。TCP服务器,返回时,计算发到JMeter响应中的字节数并插入到信息中。这一点应该要考虑的。

第 8 段(可获 1.84 积分)

TCP 取样配置

就像HTTP请求会在脚本中默认配置选项定义通用的HTTP参数到所有的HTTP取样器中,TCP取样配置选项会在脚本中定义通用的参数应用到所有的TCP取样器中。 

线程组之前把TCP取样器配置添加到脚本并放置通用参数, 例如服务器名称和端口号,并从之前的TCP采样中删除这些参数。

tcp sampler config jmeter

 

TCP取样器可以同时使用前置处理器,后置处理和断言选项配置脚本,并提供响应分析。

第 9 段(可获 1.23 积分)

修改脚本,以便它可以从文件中读取文本数据, 将数据添加到TCP取样器, 从响应中提取一些数据,并针对一些值进行断言。要做到这一点,添加 BeanShell 前置处理可以从文件中读取数据并提供给TCP取样器。

添加前置处理如下图所示:

add preprocessor to tcp sampler jmeter

 前置处理代码:

import java.io.*;
import org.apache.jmeter.protocol.tcp.sampler.*;

String textToSend = "";
String fline = "";

     FileReader fR = new FileReader("${fname}");
     BufferedReader bR = new BufferedReader(fR);

     while((fline = bR.readLine())!= null){
     textToSend = textToSend + fline;
     }
sampler.setRequestData(textToSend);
第 10 段(可获 0.75 积分)

要将TCP响应包数输出到系统日志,并在每个响应中对文件进行断言,可以添加一个 BeanShell 后置处理,正则表达式提取和断言。 

To output the TCP Response packet number to the system log and to assert against the text ‘Packet’ in each response, add a BeanShell PostProcessor, Regular Expression Extractor elements and an assertion.

正则表达式提取器, 提取包数量, 使用 Packet (.+) 模式: 并存放到变量 packNum中。 

The regular expression extractor, extracts the packet number, using the pattern Packet (.+): and places it to the variable packNum.

BeanShell 后置处理打印变量输出到系统日志,使用函数 print(${packNum})。

The BeanShell postprocessor prints this variable out to the system log, using function print(${packNum}).

对每个响应进行断言是否包含包数量字符串。所使用的模式是 Packet \d\d。

第 11 段(可获 1.08 积分)

正如你所看到的, 你可以通过JMeter提供的实现进行TCP取样。如果你需要用特殊的处理算法进TCP通讯,你可以用你自己的类来实现。你所要做的就是继承已有的类,如  BinaryTCPClientImpl 类, 实现你需要的功能并将创建的类添加到TCP取样器的TCP client class name 字段中。

第 12 段(可获 0.96 积分)

文章评论