字符集编码发送请求报文。
[attach]131647[/attach]
图4 定制化的TCP取样器界面(发送文本字符报文)
2定制化的TCP取样器(发送16进制字符报文)
在实际性能测试项目中,有时会遇到基于TCP协议的8583报文格式(银联基于ISO报文国际标准包格式的通讯协议,用于金融系统之间的报文交换,例如POS交易、ATM交易等)的测试场景。在这样的测试场景下,JMeter的原生TCP取样器除了服务器返回报文长度判断问题以外,还存在由于返回的8583报文中可能存在多个3030,导致交易结果返回码(3030)校验判断不便的问题。
通过分析,开发实现定制化的TCP取样器(发送16进制字符报文)插件,除了实现AbstractConfigGui抽象类和AbstractSamplerGui抽象类创建定制化的TCP取样器(发送16进制字符报文)界面之外,还需要在扩展实现AbstractSampler抽象类中实现自动校验指定位返回报文内容判断的处理逻辑(见图5)。
[attach]131648[/attach]
图5 setupSampleResult2方法的实现
定制化的TCP取样器(发送16进制字符报文)界面(见图6)在“End of line(EOL) byte value”之后除了添加“Length of Receive”参数设置项以外,增加了“Auto Assertion”勾选项、“StartPosition”和“FindValue”参数设置项。如果勾选了“Auto Assertion”自动校验选项,并设置了“StartPosition”和“FindValue”参数,不用手工添加新的响应断言就可以自动对返回报文指定起始位的返回码进行校验判断,判断返回码是否与预期一致,一致的话交易成功,否则交易失败。
[attach]131649[/attach]
图6 定制化的TCP取样器界面(发送16进制字符报文)
3定制化的SSH取样器和SFTP取样器
测试人员在实际性能测试过程中,经常会登录到远程Linux服务器上进行一系列的操作(例如执行nmon命令,下载nmon监控结果文件等)。有些nmon操作命令基本上是固定的,但每次登录到服务器上重复操作会显得较为繁琐。尤其是当监控的服务器数量较多时,这些重复操作就显得十分费时。开发定制化的SSH取样器插件和SFTP取样器插件,利用JMeter支持并发发送请求,编写一个JMeter自动化监控脚本,用来代替手工执行nmon命令可以很大程度上提高监控操作效率。
开发实现定制化的SSH取样器插件和SFTP取样器插件,除了实现AbstractConfigGui抽象类和AbstractSamplerGui抽象类创建定制化的SSH取样器界面和SFTP取样器界面之外,还需要扩展实现AbstractSampler抽象类负责命令执行的处理逻辑,而处理逻辑的实现依赖于Jsch。Jsch是一种支持SSH2协议的纯Java实现,可以满足通过SSH2协议连接到服务器并执行命令,进而执行文件传输和文件下载。实现了SSH取样器处理逻辑的类中编写了doCommand方法(见图7)负责处理命令操作。实现了SFTP取样器处理逻辑的类中编写了doFileTransfer方法(见图8)负责处理文件上传下载操作。
[attach]131650[/attach]
图7 doCommand方法的实现
[attach]131655[/attach]
图8 doFileTransfer方法的实现
开发实现了定制化的SSH取样器和SFTP取样器之后,可以编写一个JMeter自动化监控脚本来代替手工执行nmon命令操作。执行JMeter脚本就可以自动实现在设置的监控时段一次性的将多个服务器的nmon监控结果文件下载到本地。在这个JMeter脚本中,配置项在用户定义变量中设置(见图9),将监控的服务器地址、操作系统用户、密码,以及nmon文件目录等参数值放到参数文件中,通过CSV数据文件设置定义变量(见图10),将对应的nmon命令通过SSH取样器(见图11)执行,对应的下载操作通过SFTP取样器(见图11)执行。
[attach]131656[/attach]
图9 用户定义变量的设置
[attach]131657[/attach]