近期测试产品性能的时候用到好几次tsung这个工具,整理了一下tsung xml文件的基本结构。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="info">
<clients>
<client host="localhost" />
</clients>
<servers>
<server host="127.0.0.1" port="8080" type="tcp"></server>
</servers>
<!-- load用来定义测试压力,用户增长速度以及上限,测试时长等。可以使用多个arrivalphase,每个phase代表一个阶段,每个阶段内可以定义不同的压力,以及要执行的session等 -->
<load>
<arrivalphase phase="1" duration="60" unit="minute">
<users maxnumber="2" arrivalrate="1" unit="second"></users>
</arrivalphase>
</load>
<options>
<!-- file_server option用于给tsung生命文件,每个文件指定一个id,后面设置读取参数时通过id来决定从哪个文件读取 -->
<option name="file_server" value="userfile" id="userfile"></option>
<!-- 配置http请求的客户端类型,注意probability总数一定要是100,不然会报错 -->
<option type="ts_http" name="user_agent">
<user_agent probability="50">
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
</user_agent>
</option>
<option type="ts_http" name="user_agent">
<user_agent probability="50">
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)
</user_agent>
</option>
</options>
<!-- sessions内可以定义多个session,每个session内定义一系列http请求动作。貌似每个用户只能运行一个session,多个session会在加载用户的时候分别得到执行 -->
<sessions>
<!-- session内的probability用于设置多用户情况下,改session被执行的百分比,所有session的probablity总数必须是100 -->
<session probability="100" name="test" type="ts_http">
<!-- 从文件读取变量,iter是顺序读取,这里需要注意的是,每个session只读取一次,既这个session从文件读取一次变量之后,该sesion实例内后续所有对该变量的引用都是本次读取所获取到的value,如果你想在一个session内循环读取这个文件里的变量,那得另想办法啦 -->
<setdynvars sourcetype="file" fileid="userfile" delimiter=";" order="iter">
<var name="username" />
<var name="password" />
</setdynvars>
<!-- 直接定义一个变量并赋值 -->
<setdynvars sourcetype="value" value="this is a test">
<var name="test"/>
</setdynvars>
<!-- for 循环 -->
<for from="1" to="1" var="loop">
<request subst="true">
<http url="/home/main/index.html?name=%%_username%%" version="1.1" method="GET">
<!-- www_authenticate 用于实现httpbasic认证,这个只能用于单个请求,并不会在后续的请求里面自动加上认证的header -->
<www_authenticate userid="%%_username%%" passwd="%%_password%%"/>
</http>
</request>
<!-- thinktime 类似于sleep功能 -->
<thinktime value="3" random="true"></thinktime>
<!-- request subst="true" 用于说明这个请求里面会用到动态参数,否则引用的变量会出问题 -->
<request subst="true">
<!-- match用于从response中匹配字符串,默认匹配范围包含http头和body,还可以指定匹配或不匹配后的动作,这里是匹配上了就记录一个日志 -->
<match do="log" when="match">Unauthorized</match>
<http url="/home/main/index.html?name=%%_username%%" version="1.1" method="GET" />
</request>
<request subst="true">
<http url="/home/main/index.html?name=%%_username%%" version="1.1" method="POST" contents="name=%%_username%%&password=%%_password%%" >
<www_authenticate userid="%%_username%%" passwd="%%_password%%" />
</http>
</request>
<request subst="true">
<http url="/home/main/index.html?name=%%_username%%" version="1.1" method="GET">
<add_cookie key="session" value="%%_test%%"/>
</http>
</request>
</for>
</session>
</sessions>
</tsung>