07 tsung 参数化
很多时候,我们希望客户端发送的请求带有不同的参数,或者同样的请求带有不同的消息内容,这样能更加真实的模拟实际的使用场景。Tsung的动态替换能很好的帮助我们完成这样的测试。
1、Tsung中最常用的方式是将动态产生的内容保存在一个变量中,后续需要用到的地方引用这个变量完成动态替换。例如:
<setdynvars sourcetype="random_number" start="3" end="100">
<var name="id" />
</setdynvars>
<request subst="true">
<http url="/push?id=%%_id%%" version="1.1" method="POST" />
</request>
setdynvars元素及相关属性指定动态内容产生的方式,子元素var指定变量的名称,变量用于存储产生的动态内容,供后续使用替换。在request中使用这个变量完成动态替换,注意使用变量的方式是:下划线加变量名,并且包含在一对%%中。另外,request必须指定为需要进行动态替换(即subst="true"),否则不会进行动态替换。
上面的例子中在3到100中随机产生一个数字,并保存在变量id中,请求URL的参数中使用这个变量达到每次请求带有随机的参数。
实践:
<session name="http-example" probability="100" type="ts_http">
<!-- full url with server name, this overrides the "server" config value -->
<setdynvars sourcetype="random_number" start="1" end="100">
<var name="id" />
</setdynvars>
<for from="1" to="10" var="i">
<transaction name="drmTest">
<request subst="true">
<match do="continue" when="match">22222</match>
<http url='http://192.168.38.46/post/request.php?username=%%_id%%&name=1&pwd=1&email=1&submit=submit' met
hod="GET" version="1.1" ></http>
</request>
</transaction>
</for>
</session>
结果每每10个数都相同,现在调整for循环位置!
每次取的值都不一样;
2、除了产生随机的数字,还可以产生随机的字符串,或者自己编写函数产生随机的内容,甚至从文件中获取。随机产生长度为10的字符串:
<setdynvars sourcetype="random_string" length="10">
<var name="param" />
</setdynvars>
3、从函数中获取随机内容:
<setdynvars sourcetype="erlang" callback="ts_user_server:get_unique_id">
<var name="uid" />
</setdynvars>
唯一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="GET"
>
</request>
=====以下为user.csv文本的内容=====
Curry;123456;
Park;123;
Paul;111;
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>
在第一个请求中,从服务器响应信息的http头部中取出date对应的内容,保存在名为date的变量中,在下一个请求的参数中完成动态替换。
我们还可以使用正则表达式,XPATH,JSONPATH对响应消息的内容进行匹配获取我们所需要的数据。
<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>