- 打开http_simple.xml,下面来讲解几个关键配置。
loglevel
<tsung loglevel="notice" version="1.0">
clients
用户产生的方式:
<clients>
<client host="localhost" weight="1" maxusers="1000" use_controller_vm="true"/>
</clients>
- host: 配置客户端地址(eg: 192.168.1.1:8080)
- use_controller_vm: 是否使用虚拟控制器设置客户端最大连接数。
- maxusers:客户端最大连接数。为false时,达到上限就不再创建连接。
- weight: clients也可以配置成集群,根据weight值来随机选择发起请求的clients。
tsung运行时可以由很多的虚拟机(VM)组成,client配置指明这个client机器上最多生成的用户数,如果use_controller_vm为true的话,那么当用户数达到maxusers,tsung会自动生成新的虚拟机。
但是,前提是要打开操作系统的limits-最大进程数(limits.conf中修改),大多操作系统默认最大进程数为1024。
servers
<servers>
<server host="myserver" port="80" type="tcp"></server>
</servers>
server段可以配置被测服务器的相关信息,也可以配置成集群,如下
<servers>
<server host="server1" port="80" type="tcp" weight="4"></server>
<server host="server2" port="80" type="tcp" weight="1"></server>
</servers>
tsung会根据weight值来随机选择接收请求的server。
monitoring
<monitoring>
<monitor host="garden" type="erlang">
<mysqladmin port="3306" username="root" />
</monitor>
</monitoring>
系统监控服务,配置完后可获取被测server的CPU、内存、负载、数据库等相关信息。
可以配置成erlang的监控服务和snmp的监控服务。
load
<load>
<arrivalphase phase="1" duration="3" unit="minute">
<users maxnumber="100" interarrival="0.02" unit="second" ></users>
</arrivalphase>
<arrivalphase phase="2" duration="5" unit="minute">
<users maxnumber="100" arrivalrate="2" unit="second" ></users>
</arrivalphase>
</load>
- load段可配置访问的负载,访问可以配成多个阶段,由phase值指定。
- duration是测试持续时间,unit是单位。
- users段的maxnumber限制了生成的最大用户数。
- interarrival="0.02"表示0.02秒产生一个新用户,用户按照session的配置顺序执行session中的request。
- arrivalrate="2"表示每秒产生多少个新用户
options
<options>
<option type="ts_http" name="user_agent">
<user_agent probability="80">Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Galeon/1.3.21</user_agent>
<user_agent probability="20">Mozilla/5.0 (Windows; U; Windows NT 5.2; fr-FR; rv:1.7.8) Gecko/20050511 Firefox/1.0.4</user_agent>
</option>
</options>
options段可配置一些请求的信息,如agent信息。
TCP连接超时
<option name="connect_timeout" value="5000">
<set_option name="connect_timeout" value="1000" />
</option>
- 1.6.0新属性。指定尽力TCP连接超时毫秒值,缺省值无限制。
- set_option: 为每一个会话连接设置超时时间
<option name=”tcp_reuseaddr” value=”true” />
- 开启TCP地址重复绑定
重连次数与超时
<option name="max_retries" value="5">
<set_option name="retry_timeout" value="1000" />
</option>
- 1.6.0新属性。默认重连次数为3,设置为0时,代表禁止重连
- 重连超时:默认为10毫秒
超时消息确认
<option name="idle_timeout" value="300000"></option>
<option name="global_ack_timeout" value="6000000"></option>
- 设置idle超时,默认10min和全局ack超时,默认无穷
Hibernate
- 在thinktimes阶段中模拟用户降低内存消耗,默认值为10s
Rate_limit
<option name="rate_limit" value="1024"></option>
现在每个客户端(令牌桶算法)的带宽需求,单位为KB/s,默认值为1024。
Ports_range
<option name="ports_range" min="1025" max="65535"/>
当要在同一客户端下产生30000个连接,必须限制TCP端口号
设置随机数种子
<option name="seed" value="42"/>
设置BOSH路径
<option name="bosh_path" value="/http-bind/"/>
sessions
<sessions>
<session name="http-example" probability="70" type="ts_http">
<setdynvars sourcetype="random_number" start="1" end ="100">
<var name="itemid" />
</setdynvars>
<transaction name='getlist'>
<request subst="true">
<http url="/comment/getList" method="POST" contents = "item_type=image&item_id=%%_itemid%%"></http>
</request>
</transaction>
</session>
<session name="http-example" probability="30" type="ts_http">
<setdynvars sourcetype="random_number" start="20" end="5000000">
<var name="content" />
</setdynvars>
<transaction name='getlist'>
<request subst="true">
<http url="/comment/addComment" method="POST" contents = "item_type=image&item_id=%%_itemid%%&content=%%_content%%"></http>
</request>
</transaction>
</session>
<session name="event_list" probability="70" type="ts_http">
<setdynvars sourcetype="random_number" start="0" end ="1">
<var name="source" />
</setdynvars>
<request subst="true">
<http url="/payment/inside/pay" method="POST" contents="{"channelId":2001,"type":%%_type%%,"currency":1000,"source":%%_source%%,"refererId":%%_refid%%,"clientId":15137449663879284,"amount":0}" version="1.1">
<http_header name="Content-Type" value="application/json"/>
</http>
</request>
</session>
</sessions>
probability:可配置多个子session,进而可测试多个api,可以设置请求概率。session的probability之和是100。
type: 类型是ts_http,表示请求类型。
for循环
<for from="1" to="@loop" incr="1" var="counter">
for: sessions里可用for来设定请求循环次数,在里面可以设置请求的具体信息。
setdynvars
<setdynvars sourcetype="random_number" start="20" end="5000000">
<var name="xxx" />
</setdynvars>
<setdynvars sourcetype="random_string" length="10">
<var name="xxx" />
</setdynvars>
setdynvars: 元素及相关属性指定动态内容产生的方式。
设置请求参数的随机数,以%%_xxx%%的形式来调用。随机数也可从文件读取,如csv。
var: 指定变量的名称,变量用于存储产生的动态内容,供后续使用替换。
在request中使用这个变量完成动态替换。
变量的使用方式:下划线加变量名,以%%_xxx%%的形式来调用。
request必须指定为需要进行动态替换(即subst="true"),否则不会进行动态替换。
1. 随机数:
<setdynvars sourcetype="random_number" start="20" end="5000000">
<var name="itemid" />
</setdynvars>
<request subst="true">
<http url="/comment/addComment" method="POST" contents="item_id=%%_itemid%%"></http>
</request>
sourcetype为 random_number,start表示开始最小数,end表示最大数
setdynvars与for循环:若是在for循环之前,每次循环数字都相同;建议放置在for循环内。
2. 随机字符:
<setdynvars sourcetype="random_string" length="10">
<var name="content" />
</setdynvars>
<request subst="true">
<http url="/comment/addComment" method="POST" contents="content=%%_content%%"></http>
</request>
sourcetype为 random_string,length代表字符的长度,生成的字符包含中英文数字特殊字符。
3. 从函数中获取随机内容:
<setdynvars sourcetype="erlang" callback="ts_user_server:get_unique_id">
<var name="uid" />
</setdynvars>
<request subst="true">
<http url="/comment/addComment" method="POST" contents="content=%%_uid%%"></http>
</request>
唯一id,根据session来的,一次session产生一个uid,所有不管for在什么位置,for多少次,uid就会重复多少次;
4. 从文件中获取随机内容:
<options>
<option name="file_server" id="userdb" value="./user.csv" />
</options>
<setdynvars sourcetype="file" fileid="userd" delimiter=";">
<var name="user" />
<var name="passwd" />
</setdynvars>
<request subst="true">
<http url="login?user=%%_user%%&passwd=%%_passwd%%" version="1.1" method="POST">
</request>
sourcetype为 file,
5. 从响应信息中获取随机内容:
<request>
<dyn_variable name="date" header="date" />
<http url="/test" method="GET" version="1.1" />
</request>
<request subst="true">
<http url="/home/?date=%%_date%%" method="GET" version="1.1" />
</request>
<request>
<dyn_variable name="mytitlevar" re=<title>(.*)</title>"/>
<http url="/testtsung.html" method="GET" version="1.0" />
</request>
<request>
<dyn_variable name="title" xpath="/html/head/title/text()" />
<http url="/testtsung.html" method="GET" version="1.0" />
</request>
<request>
<dyn_variable name="title" jsonpath="field.array[3].value" />
<http url="/testtsung.html" method="GET" version="1.0" />
</request>
request
<request subst="true">
<http url="/comment/addComment" method="POST" contents = "item_type=image&item_id=%%_itemid%%&content=%%_content%%">
<http_header name="Authorization" value="111"/>
<http_header name="Cookie" value="authToken=%%_auth_token%%; Path=/"/>
<!-- content-Type:POST请求参数的格式,如果是json格式可以这样写 -->
<http_header name="Content-Type" value="application/json"/>
</http>
</request>
subst="true": 调用随机数;若是不设置,随机数引用失败。
http_header:内部可以定义header参数。
1. HTTP GET
<request subst="true">
<http url="/comment/get?commentId=111&username=test" method="GET" version="1.1"></http>
</request>
url: HTTP请求的域名后面的路径+?+parameters. &符号必须转义成 & .
2. HTTP POST
<request>
<http url="/contest/placeOrder?device_id=djiunhwersxerijn&property=" method="POST" version="1.1" contents='{"contestId":156002,"orderVOList":[%%_selection%%]}'>
<http_header name="Content-Type" value="application/json"/>
</http>
</request>
url: HTTP请求的域名后面的路径+?+parameters. &符号必须转义成 & .
contents: HTTP POST请求提交的内容。“”符号必须转义成 " ,括号和逗号不用转义
若是json,必须添加http_header。
thinktime:
- 用于定义两个请求的间隔时间。
transaction:
- 事务,事务中可以包含多个请求。