Tsung测试Tcp协议的应用或接口
利用Tsung模拟基于Tcp的业务流程,实属无奈。因ConnectManager部署在linux下,其中,Loadrunner的winsocket因不支持linux platform而无法使用,而Jmeter 又因本身太耗机器的资源,所以,最后决定探索一下Tsung--这个神奇而又让人感到很无奈的工具。
说它无奈主要是它的易用性,一切设置,一切脚本处理都要在xml文档里编写,对于一个使用loadrunner和Jmeter的人,这是相当的残酷的。原因有以下:
1、user manual是英文版的,虽然对我来说没所谓,但是,相信大部分人都会感到整个人都不好了
2、目前网上的资料,基本都是浅浅的
3、tsung脚本的语法是tsung-1.0.dtd,只有元素和属性的值,但是,没有任何说明
虽然,有各种原因,但是,我还是踏上了这条不归路。下面我主要记录一下,我解决这个问题的路程:
首先,我想到了看tsung-1.0.dtd,因为我相信脚本的正确性绝对是依赖于这个dtd文档的,其实,用过tsung的朋友可以发现,tsung脚本运行起来以后,客户端与服务端建立的连接有三种方式,下面贴一下Tsung脚本的位置和dtd文档中,对这个的定义:
<servers>
<server host="192.168.14.101" port="9284" type="tcp"></server>
</servers>
我们看一下,<server>标签里的type属性在dtd文档里的定义:
<!ATTLIST server
21 host NMTOKEN #REQUIRED
22 port NMTOKEN #REQUIRED
23 weight NMTOKEN "1"
24 type (ssl | tcp | udp | erlang | ssl6 | tcp6 | udp6 |bosh | bosh_ssl | websocket) #REQUIRED>
从而可以看出,客户端与服务端建立的连接方式支持多种,我要建立的是Tcp连接,所以,我选择type="tcp",接下来就是session里建立连接,发消息的业务流程了,而问题也出在了这里,下面贴一下脚本里对session部分的定义:
<session probability="100" name="raw" type="ts_raw">
probability和name属性就不用介绍了,刚才的server标签定义了底层的连接方式,而这里的type要定义的则是通信时使用的协议类型,我们在dtd里看一下这个type属性的定义:
<!ATTLIST session
133 name CDATA #REQUIRED
134 bidi CDATA #IMPLIED
135 persistent (true | false) #IMPLIED
136 probability NMTOKEN #IMPLIED
137 weight NMTOKEN #IMPLIED
138 type (ts_jabber | ts_http | ts_raw | ts_pgsql | ts_ldap | ts_webdav |ts_mysql| ts_fs | ts_shell | ts_job | ts_websocket | ts_amqp | ts_mqtt) #REQUIRED>
从dtd里可以看出,session标签里type属性的值为:ts_jabber | ts_http | ts_raw | ts_pgsql | ts_ldap | ts_webdav |ts_mysql| ts_fs | ts_shell | ts_job | ts_websocket | ts_amqp | ts_mqtt,这里的属性值决定了Tsung可以测试的相关协议的插件,从名称上来看,ts_raw可以作为我查找资料的对象,在user manual里第二章节是介绍tsung的主要功能的,其中2.11章节Raw plugin related features的说明是这样的的:
2.11. Raw plugin related features
- TCP / UDP / SSL compatible
- raw messages
- no_ack, local or global ack for messages
当我看到TCP/UDP/SSL compatible,raw message,我好开心。于是,我决定去github:github.com/processone/tsung上看一下tsung的源码以及tsung目前的bug库https://github.com/processone/tsung/issues,从gihub的examples文件夹处,我看到了:
,进入这个文件夹我看到了

同时,我在bug库里看到了#115bug,于是,我更加坚信Tsung对基于Tcp协议的业务流程的测试。于是,根据开发给的接口设计文档,开始业务流程的第一步:从服务器获取sessionID
<transaction name="open">
<request>
<raw data="00520005150805134521f84409ba6f5f317c6613dc201018caeb" ack="local"></raw>
</request>
从tsung.dump中,成功看到send和recv:其中,recv中这串618...数字是sessionID
开始业务流程的第三步:登录,但是,有一个问题是登录时需要用到刚才的sessionID,这就用到了关联,与loadrunner和Jmeter一样,在Tsung里模拟时,也同样需要用到关联将响应中动态数据取出来,作为下一人请求的请求内容。这里,需要参考user manual的Advanced Feature章节,我在这里第一时间想到的是用正则表达式,从user manual里这句话,“the regexp engine uses the re module, a Perl like regular expressions module for Erlang.”明显觉察出,此处的正则表达式或许跟之前在Linux下用的正则表达式有一些区别。但是,不知道有什么区别,所以,一如既往的用linux下的语法写正则表达式,于是,写成:re="[6][0-9]{18}",具体代码贴下:
<request>
<dyn_variable name="sessionID" re="6[0-9]{18}"/>
<raw data="00520005150805134521f84409ba6f5f317c6613dc201018caeb" ack="local"></raw>
</request>
运行后,无果,取出来的值为空。抓狂,抓狂,抓狂,重要的事情我要说三遍。我一直觉得是因为我把正则表达式放在请求前,正则表达式匹配是字节流,而正则表达式的作用范围是字符串,所以取的值为空(后来,证明我是错误的)。后来,于绝望中看了Erlang,决定利用Erlang函数处理请求,然后利用字符串截取获取我要的sessionID,但是,苦于获取请求这个阶段就很无望。于绝望中,在一个群里说了一下这个问题,一朋友指出有可能是正则表达式的问题,于是,提醒在要匹配的模式用“()”括起来,即:re="(6[0-9]{18})"死马当活马医,但是,奇迹真的发生了,我成功的取到了sessionID.事实证明,此正则表达式非彼表达式。
接下来,进行登录,发消息流程,贴代码说话:
<transaction name="login">
<request subst="true">
<raw data=" 119 1 %%_sessionID%%<iq><sessionid>%%_sessionID%%</sessionid><login>hanhy,hanhy123<login></iq>" ack="local"></raw>
</request>
</transaction>
<transaction name="sendmsg">
<request subst="true">
<raw data=" 124 3 %%_sessionID%%<message><sessionid>%%_sessionID%%</sessionid><content>tsungMsg</content></message>" ack="local"></raw>
</request>
</transaction>
业务流程模拟成功解决。
Tsung测试Tcp协议的应用或接口的更多相关文章
- loadrunner测试TCP协议服务器性能
loadrunner测试TCP协议服务器性能 . 性能loadrunner测试c 最近对服务器的性能感兴趣,于是开始研究了一阵子loadrunner如何做采用TCP协议交互的服务器的性能测试,对loa ...
- Jmeter测试TCP协议
最近做了个项目是TCP协议传输数据,于是马上想试试JMeter测试TCP. 1首先需要下载第三方的TCP插件包ApacheJMeter_tcp.jar,下载步骤请自行百度. 2.下载完重新配置jmet ...
- LR 测试http协议xml格式数据接口
Action() { lr_start_transaction("T1"); web_custom_request("xxxxHTTPRequest", &qu ...
- loadrunner 录制TCP协议脚本操作
测试TCP协议的项目,涉及到登陆.发送实时数据.指令.登出等,直接写报文工作量太大,所以需要录制报文. 操作方法如下: 1.启动服务端程序 2.使用winsocket协议 3.选择应用程序 4.录制选 ...
- JMeter测试TCP服务器遇到的一个奇怪问题
今天工作需要测TCP服务器的压力,因为tsung测试TCP需要写的脚本实在头大,于是换了JMETER来搞压力测试.在实际测试的过程中,遇到了一个很奇怪的问题,就是发了数据包以后,JMeter不停地报5 ...
- 简单测试nginx1.90做TCP协议负载均衡的功能
最近工作中需要做TCP层面的负载均衡,以前网站用的反向代理nginx只支持应用层的负载均衡,对于TCP协议是无能为力的,需要使用LVS(linux虚拟服务器). LVS的特点是高性能和极复杂的配置.对 ...
- ZeroMQ接口函数之 :zmq_tcp – 使用TCP协议的ØMQ网络单播协议
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-tcp zmq_tcp(7) ØMQ Manual - ØMQ/4.1.0 Name zmq_t ...
- SoapUI SoapUI测试WebService协议接口简介
SoapUI测试WebService协议接口简介 by:授客 QQ:1033553122 1. 创建项目,入口:File -> New SOAP Project,或者右键默认项目Project- ...
- 多网卡下对ServerSocket以TCP协议绑定IP和端口的测试
一.引言:之前开发TCP协议的程序(C#里是Socket为主)都是基于主机上只有一个IP的,后来项目里涉及到了主机需要同时连接内外和外网的情况,在该主机上部署着一套WCS系统和一套WMS系统:WCS系 ...
随机推荐
- jdk7jdk8新特性概述
在oracle停止对jdk6更新,jdk8发布之后,公司终于要把生产环境更新到jdk7,下面列一下jdk7,8的可能需要关注的新特性. jdk7 G1垃圾回收 fork-join框架 二进制变量 Sw ...
- codevs1050
题目地址:http://codevs.cn/problem/1050/ 分析: 最開始想直接用状压做,发现怎么都想不出来.就和当年的多行多米诺骨牌(这道题至少最后还是把普通状压做法看懂了). 直到听到 ...
- Struts2.5 伪静态的配置
伪静态 伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息.或者还想运用动态脚本解决一些问题.不能用静态的方式来展示网站内容.但 ...
- linux vi/vim编辑文件显示行号
方法一(最尴尬的方法): 1.显示当前行行号,在VI的命令模式下输入 :nu 2.显示所有行号,在VI的命令模式下输入 :set nu #这是:set number 的简写 方法二(最好的方法): 使 ...
- 自学Zabbix3.8-可视化Visualisation
随着大量数据流入Zabbix,如果用户能够查看正在发生的事情,而不仅仅是数字,那么对于用户来说,这就变得容易得多了.这就是图的所在. 图允许快速地掌握数据流,关联问题,发现什么时候开始,或者做什么事情 ...
- Mac环境下实现alias重命名命令(永久生效)
Mac环境下实现alias重命名命令 iOS Dev在使用Xcode完成代码编写后,可能需要上传至第三方分发应用给测试人员进行相关测试,比如蒲公英.FIR. 效率较高的上传方式是借助于Fastlane ...
- sqlserver 存储过程 带输出参数
CREATE PROCEDURE [dbo].[output] @acctNbr varchar(), --会员卡号 @acctPwd1 nvarchar() OUT, --登录密码 @acctPwd ...
- Linux:如何进行c++编程
不适应美帝的饮食,当一只咸鱼在apartment里Coding一波,学习学习如何在Ubuntu实现C++的编程 正文如下: (预备知识) 学习Vim: http://www.cnblogs.com/ ...
- xamarin android布局
xamarin android布局练习(1) xamarin android布局练习,基础非常重要,首先要学习的就是android的布局练习,xamarin也一样,做了几个xamarin androi ...
- 程序员的自我救赎---1.4.1:核心框架讲解(DAL)
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...