Loadrunner11中webservice协议脚本总结
简介
webservices协议是建立可交互操作的分布式应用程序的新平台,它通过一系列的标准和协议来保证程序之间的动态连接,其中最基本的协议包括soap,wsdl,uddi
1)SOAP(simple object access protocl)
SOAP是消息传递协议,它规定了web services之间如何传递消息。SOAP基于xml和xsd,xml是soap的数据编码方式,简单说soap规定了:
a.传递信息的格式为xml,用于描述信息的内容和处理方法;
b.远程对象方法调用的格式;
c.异常处理以及其他的相关信息;
2)WSDL(web services Description Language)
WSDL是web services的定义语言,和soap一起构成web服务的核心结构单元。wsdl协议规定了有关webservices描述的标准
3)UDDI(Universal Description,Discovery,and Intergration)
UDDI是访问登记的标准,它建立了一个平台独立,开放的框架,通过英特网来描述服务,发现业务并整合业务服务。简单来说
UDDI用于集中存放和查找wsdl描述文件,起着目录服务器的作用
脚本开发:
简单介绍使用Loadrunner11来开发webservices协议的脚本三种方法,以天气预报接口为例
1.当我们从开发那边知道接口的wsdl地址,可以使用 web_service_call()函数,具体操作如下:(http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl)
1)打开LR,新建web service协议脚本(使用该协议,菜单栏就会出现SOA Tool选项)
2) 选择菜单栏中SOA Tool---->Mangae Services,点击对话框中的import
3)在Import Service 对话框中的URL中输入wsdl地址,点击import,之后点击OK
4)选择菜单栏中SOA Tool----> Add Service Call
5)输入具体值之后点击OK按钮,等到如下脚本
web_service_call( "StepName=getWeatherbyCityName_101", //步骤名称
"SOAPMethod=WeatherWebService|WeatherWebServiceSoap|getWeatherbyCityName",//服务名称,soap,获取的接口
"ResponseParam=response",//返回参数信息
"Service=WeatherWebService", //webservice的服务
"ExpectedResponse=SoapResult", //请求的返回
"Snapshot=t1555551364.inf", //快照
BEGIN_ARGUMENTS, //开始输入
"theCityName=南京", //输入的参数值
END_ARGUMENTS, //结束输入
BEGIN_RESULT, //开始输出
"getWeatherbyCityNameResult=Param_getWeatherbyCityNameResult",
"getWeatherbyCityNameResult/*[2]=Param_cityname",//返回的城市
END_RESULT,//结束输出
LAST);
6)加入事务,参数化与if,对脚本进行判断(加了一个今日天气实况信息,发现该函数可以输出多个值)
lr_start_transaction("getWeatherbyCityName");
web_service_call( "StepName=getWeatherbyCityName_101", //步骤名称
"SOAPMethod=WeatherWebService|WeatherWebServiceSoap|getWeatherbyCityName",//服务名称,soap,获取的接口
"ResponseParam=response",//返回参数信息
"Service=WeatherWebService", //webservice的服务
"ExpectedResponse=SoapResult", //请求的返回
"Snapshot=t1555551364.inf", //快照
BEGIN_ARGUMENTS, //开始输入
"theCityName={cityname}", //输入的参数值
END_ARGUMENTS, //结束输入
BEGIN_RESULT, //开始输出
"getWeatherbyCityNameResult=Param_getWeatherbyCityNameResult",
"getWeatherbyCityNameResult/*[2]=Param_cityname",//返回的城市
"getWeatherbyCityNameResult/*[11]=TodayWeather", //返回的对应城市信息
END_RESULT,//结束输出
LAST);
if(strcmp(lr_eval_string("{Param_cityname}"),lr_eval_string("{cityname}"))==0)
{
lr_end_transaction("getWeatherbyCityName", LR_PASS);
lr_output_message("成功查询出%s的今日天气情况:%s",lr_eval_string("{Param_cityname}"),lr_eval_string("{TodayWeather}"));
}
else
{
lr_end_transaction("getWeatherbyCityName", LR_FAIL);
lr_output_message("返回的城市信息为:%s",lr_eval_string("{Param_string}"));
}
7)脚本执行结果如下
2.当我们从开发那边知道接口的接口报文信息,可以使用soap_request()函数,接口文档地址为 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName:
以下是 SOAP 1.2 请求和响应示例
1)先将请求xml保存为xml文件,如放置到F:\getWeatherbyCityName.xml
2)点击菜单栏SOA Tool----> Add Import SOAP,在输入框中输入刚保存文件地址信息
3)点击Manage Services,输入url,SOAP Action 以及Response Parameter值,具体如下
4)点击OK按钮等到的脚本如下
soap_request("StepName=SOAP Request", //步骤名称
"URL=http://www.webxml.com.cn/WebServices/WeatherWebService.asmx", //url地址
"SOAPEnvelope=" //发送到服务器的XML
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
"<soap:Body>"
"<getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"
"<theCityName>南京</theCityName>"
"</getWeatherbyCityName>"
"</soap:Body>"
"</soap:Envelope>",
"SOAPAction=http://WebXml.com.cn/getWeatherbyCityName",
"ResponseParam=response", //存储服务器响应返回参数
"Snapshot=t1555556002.inf",
LAST);
5)加入事务,参数化与if,对脚本进行判断(注意输入参数为中文时,需要将NULL编码转换为utf-8,输出内容为乱码是需要将utf-8编码转换为NULL,使用lr_convert_string_encoding函数)
lr_convert_string_encoding(lr_eval_string("{cityname}"),NULL,"utf-8","city");
lr_save_string(lr_eval_string("{city}"),"city_name");
//添加事务
lr_start_transaction("getcityname");
soap_request("StepName=SOAP Request", //步骤名称
"URL=http://www.webxml.com.cn/WebServices/WeatherWebService.asmx", //url地址
"SOAPEnvelope=" //发送到服务器的XML
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
"<soap:Body>"
"<getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"
"<theCityName>{city_name}</theCityName>"
"</getWeatherbyCityName>"
"</soap:Body>"
"</soap:Envelope>",
"SOAPAction=http://WebXml.com.cn/getWeatherbyCityName",
"ResponseParam=response", //存储服务器响应返回参数
"Snapshot=t1555556002.inf",
LAST);
//返回的信息乱码转译,并高亮打印
lr_convert_string_encoding(lr_eval_string("{response}"),"utf-8",NULL,"msg");
lr_error_message(lr_eval_string("{msg}"));
//返回值为xml文件格式,该函数自动将返回值转变为中文的了,不需要使用lr_convert_string_encoding,本例获取城市信息
lr_xml_get_values(
"XML={response}",//查看的xml
"Query=/Envelope/Body/getWeatherbyCityNameResponse/getWeatherbyCityNameResult/string[2]", //查看返回内容路径在,指定元素或者属性
"ValueParam=getcityname", //存储返回的值
LAST);
//本例获取城市天气信息,与脚本判断无关,实际脚本中可以不需要,这边是强化记忆来着
lr_xml_get_values(
"XML={response}",//查看的xml
"Query=/Envelope/Body/getWeatherbyCityNameResponse/getWeatherbyCityNameResult/string[11]", //查看返回内容路径在,指定元素或者属性
"ValueParam=getWeatherby", //存储返回的值
LAST);
//断言判断
if(strcmp(lr_eval_string("{getcityname}"),lr_eval_string("{cityname}"))==0)
{
lr_end_transaction("getcityname", LR_PASS);
lr_output_message("成功查询出%s的今日天气情况:%s",lr_eval_string("{cityname}"),lr_eval_string("{getWeatherby}"));
}
else
{
lr_end_transaction("getcityname", LR_FAIL);
lr_output_message("查询失败,输入的城市与返回的城市信息不一致,输入城市信息为%s,返回城市信息为%s",lr_eval_string("{cityname}"),lr_eval_string("{getcityname}"));
}
6)脚本执行结果如下(实测无问题)
3.可以使用web_custom_request()函数,也可以做web service协议:
1)将鼠标放置到需要插入脚本的地方,右击,选择增加步骤,输入 web_custom_request,弹出对应设置框
2)点击OK得到的脚本如下
web_custom_request("web_custom_request",
"Method=POST",
"TargetFrame=",
"Resource=0",
"Referer=",
"Mode=HTTP",
"EncType=text/xml; charset=utf-8",
"Body=<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getWeatherbyCityName xmlns="http://WebXml.com.cn/">
<theCityName>string</theCityName>
</getWeatherbyCityName>
</soap:Body>
</soap:Envelope>",
LAST);
3)需要将body中的“”进行转译,且Body都需要加上引号,优化之后如下
web_custom_request("web_custom_request",
"Method=POST",
"TargetFrame=",
"Resource=0",
"Referer=",
"Mode=HTTP",
"EncType=text/xml; charset=utf-8",
"Body=<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"
" <soap12:Body>"
"<getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"
"<theCityName>string</theCityName>"
"</getWeatherbyCityName>"
"</soap12:Body>"
"</soap12:Envelope>",
LAST);
4)加入事务,加关联,if,对脚本进行判断(注意使用lr_convert_string_encoding函数转码)
lr_convert_string_encoding(lr_eval_string("{cityname}"),NULL,"utf-8","city");
lr_save_string(lr_eval_string("{city}"),"city_name");
web_reg_save_param_ex(
"ParamName=weather_city",
"LB=<string>",
"RB=</string>",
"Ordinal=2",
SEARCH_FILTERS,
LAST);
lr_convert_string_encoding(lr_eval_string("{weather_city}"),NULL,"utf-8","weather_city1");
lr_error_message(lr_eval_string("{weather_city1}"));
lr_start_transaction("weather");
web_custom_request("web_custom_request",
"Method=POST",
"TargetFrame=",
"Resource=0",
"Referer=",
"Mode=HTTP",
"EncType=text/xml; charset=utf-8",
"Body=<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"
" <soap12:Body>"
"<getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"
"<theCityName>{city_name}</theCityName>"
"</getWeatherbyCityName>"
"</soap12:Body>"
"</soap12:Envelope>",
LAST);
if(strcmp(lr_eval_string("{weather_city1}"),lr_eval_string("{cityname}"))==0)
{
lr_end_transaction("weather", LR_PASS);
}
else
{
lr_end_transaction("weather", LR_FAIL);
}
SOAP工具的简单实用
当我们只知道wsdl地址时,我们可以使用该工具知道具体的请求体,具体如下
1)打开工具,点击页面上的SOAP
2)点击ok,成功项目,点击其他具体的接口,可查看到请求体信息,输入参数,即可得到返回信息(左边请求信息,右边返回信息)