漫游测试之性能测试(3.4.5.Tsung的脚本增强配置 二)
3.4.5.Tsung的脚本增强配置
3.4.5.1 Tsung事务的配置
如官方文档中的示例,transaction标签定义事务的名称。
<sessions>
<session name="http-example" probability="70" type="ts_http">
<request> <http url="/" method="GET" version="1.1"></http> </request>
<request> <http url="/images/logo.gif" method="GET" version="1.1"
if_modified_since="Fri, 14 Nov 2003 02:43:31 GMT"></http></request>
<thinktime value="20" random="true"></thinktime>
<transaction name="index_request">
<request><http url="/index.en.html" method="GET" version="1.1" ></http> </request>
<request><http url="/images/header.gif" method="GET" version="1.1">
</http> </request>
</transaction>
<thinktime value="60" random="true"></thinktime>
<request>
<http url="/" method="POST" version="1.1" contents="bla=blu"></http> </request>
<request>
<http url="/bla" method="POST" version="1.1" contents="bla=blu&name=glop">
<www_authenticate userid="Aladdin" passwd="open sesame"/></http>
</request>
</session>
thinktime 用来设置思考时间。
3.4.5.2 Tsung检查点的配置
使用match节点用来描述匹配情况。注意,match需要在request标签内。否则可能报以下错误。
<request>
<match do="continue" when="match">Welcome !</match>
<http url="/login.php" version="1.0" method="POST"
contents="username=nic&user_password=sesame"
content_type="application/x-www-form-urlencoded" >
</request>
根据官方文档描述,do字段可以为continue、log、abort、restart、loop、dump值。When字段值可以为nomatch。
3.4.5.3 Tsung的关联配置
主要使用dyn_variable标签来标注是用来关联的。dyn_variable需要在request标签内,否则可能报以下错误。
方法一,从Html中直接获取某个ID 或Name的值。
假如,某HTML源码中包含如下描述,
<form action="go.cgi" method="POST">
<hidden name="random_num" value="42"></form>
</form>
我们想在Tsung中获取random_num的值,只需要增加dyn_variable变量定义,将name的名称与HTML源码中的name相等即可。
<request>
<dyn_variable name="random_num"></dyn_variable>
<http url="/testtsung.html" method="GET" version="1.0"></http>
</request>
然后在接下来的请求中%%_random_num%%标注使用,注意_random_num中的_是必须要加上的。
<request subst="true">
<http url="/go.cgi" version="1.0"
contents="username=nic&random_num=%%_random_num%%&op=login"
content_type="application/x-www-form-urlencoded" method="POST">
</http></request>
当然,可以在httl标签组中增加包头,毕竟有时候可能会用到包头传递某些参数。
方法二,使用Regexp的方式获取动态值。注意一些特殊符号,比如<、>等需要转换成Html编码。
<request>
<dyn_variable name="mytitlevar"
regexp="<title>\(.*\)</title>"/>
<http url="/testtsung.html" method="GET" version="1.0"></http>
</request>
方法三,使用xpath获取Html源码中的内容。这种方式非常便捷,使用了GUI自动化测试工具中的概念,也算其特点之一。其它工具,比如Loadrunner是没有这个方法的。
<dyn_variable name="field1_value" xpath="//input[@name='field1']/@value"/>
<dyn_variable name="title" xpath="/html/head/title/text()"/>
方法四,读取JSON中的内容。这个方法非常方便,因为现在很多HTTP请求其实都是JSON格式的了。
<dyn_variable name="array3_value" jsonpath="field.array[3].value"/>
如果检查点和关联对同一个请求要起作用,如果dyn_variable在match前,启动后会报错。
报element_unauthorize_in_choice错误。
正确的方法是,先进行检查后进行动态关联。
运行后就正确了
3.4.5.4 Tsung的参数化配置
参数化的标识,使用setdynvars来进行识别。
方法一,调用erlang的函数(前提是比较了解erlang)
<setdynvars sourcetype="erlang" callback="ts_user_server:get_unique_id">
<var name="id1" />
方法二,调用文件
<setdynvars sourcetype="file" fileid="userdb" delimiter=";" order="iter">
<var name="user" />
<var name="user_password" /></setdynvars>
Delimiter可以为任意分割字符;order可以为iter或者random
方法三,随机数字或者字符串
<setdynvars sourcetype="random_number" start="3" end="32">
<var name="rndint" /></setdynvars>
<setdynvars sourcetype="random_string" length="13">
<var name="rndstring1" /></setdynvars>
方法四,直接使用erlang脚本
<setdynvars sourcetype="eval"
code="fun({Pid,DynVars})-> {ok,Val}=ts_dynvars:lookup(md5data,DynVars), ts_digest:md5hex(Val) end.">
<var name="md5sum" />
</setdynvars>
Tsung也支持IF、Foreach等条件控制,详细可以看其官方文档。