使用LoadRunner对Web Services进行调用--Import Soap

利用LoadRunner对Web Services进行测试时,通常有三种可供采用的方法:

  • 在LoadRunner的Web Services虚拟用户协议中,【Add Service Call】
  • 在LoadRunner的Web Services虚拟用户协议中,【Import SOAP】
  • 在LoadRunner的Web(HTTP/HTML)虚拟用户协议中, 利用web_custom_request函数构造WebService请求

在前一篇文章中,已经对第一种方法【Add Service Call】进行了详细介绍。然而,这种方法在实际项目中往往不适合测试人员。

在实际性能测试项目中,由于性能测试对象通常只是在众多Services中选取的少数典型Service,因此作为测试人员没有必要对所有Services的调用方式进行研究,也就没有必要利用WSDL来加载所有Service的调用方式;另一方面,对于新接触一个Service的测试人员,对其调用方式及其合法参数可能不是很清楚,这种情况下通常需要开发人员为测试人员提供待测Service的调用方式,而SOAP报文便是调用方式的一种常用载体。

因此,掌握LoadRunner对SOAP报文的调用方式,对性能测试的项目实施具有重要意义。本文将对第二种方法,即【Import SOAP】进行详细讲解。

为了方便与第一种方法形成对比,本文采用上次使用到的Web Services作为演示案例

1. 获取SOAP报文

在性能测试项目中,我们可以直接向开发人员获取待测Service的请求报文,这可以极大地缩短测试准备工作的时间。

对于提供Web Services的服务商,通常会在其网站上详细地对SOAP调用方式进行介绍,在本演示案例的介绍页面中,可以看到服务商为getWeatherbyCityName提供了四种调用方式:SOAP 1.1、SOAP 1.2、HTTP GET和HTTP POST,本案例采用SOAP 1.1的形式进行演示。

采用SOAP 1.1的请求报文如下所示:

POST /WebServices/WeatherWebService.asmx HTTP/1.1
Host: webservice.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/getWeatherbyCityName"

<?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>

将上面这段xml代码保存至一个xml文件,如getWeatherbyCityName.xml,即得到测试所需的SOAP报文。

在报文头中,我们还获取到两个重要信息:

  • Service的URL为/WebServices/WeatherWebService.asmx,加上服务商域名后得到完整的URL为http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx
  • SOAPAction: "http://WebXml.com.cn/getWeatherbyCityName"

2. 在LoadRunner中导入SOAP报文

在LoadRunner的Web Services协议中,点击【Import SOAP】,加载之前准备好的SOAP报文,即xml文件;加载完成后,在URL和SOAP Action中分别填入获取得到的地址信息;在Response Parameter中填写存储返回内容的参数名称;如下图所示。

Image Title

点击【OK】后,便能在脚本界面中生成一个soap_request函数,如下图所示。

Image Title

通过上图可知,SOAP报文中的全部内容已成功转换为LoadRunner的soap_request函数。

3. 回放脚本,查看结果

将脚本中的字段theCityName赋值为“广州”;在“Run-time Settings”中打开日志“Extended log”,勾选“Parameter substitution”和“Data returned by server”。运行脚本后,查看“Replay Log”,如下图所示。

Image Title

详细结果如下所示。

theWeatherInfo = <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><getWeatherbyCityNameResponse xmlns="http://WebXml.com.cn/"><getWeatherbyCityNameResult><string>鐩磋緰甯\x82</string><string>鍖椾含</string><string>54511</string><string>54511.jpg</string><string>2013-8-5 13:17:17</string><string>23鈩\x83/34鈩\x83</string><string>8鏈\x885鏃\xa5 闃磋浆澶氫簯</string><string>鏃犳寔缁鍚戝井椋\x8e</string><string>2.gif</string><string>1.gif</string><string>浠婃棩澶╂皵瀹炲喌锛氭皵娓╋細29鈩冿紱椋庡悜/椋庡姏锛氬崡椋\x8e 2绾э紱婀垮害锛\x9a58%锛涚┖姘旇川閲忥細杈冨樊锛涚传澶栫嚎寮哄害锛氬己</string><string>绌胯。鎸囨暟锛氱値鐑紝寤鸿绌跨煭琛\x80佺煭瑁ょ瓑娓呭噳澶忓鏈嶈銆\x82\n杩囨晱鎸囨暟锛氳緝鏄撳彂锛屽鍑洪渶杩滅杩囨晱婧愶紝閫傚綋閲囧彇闃叉姢鎺柦銆\x82\n杩愬姩鎸囨暟锛氳緝閫傚疁锛屾埛澶栬繍鍔ㄨ娉ㄦ剰闃叉檼銆\x82\n娲楄溅鎸囨暟锛氫笉瀹滐紝浠婂ぉ鏈夐洦锛岄洦姘村拰娉ユ按浼氬紕鑴忕埍杞︺\x80\x82\n鏅炬檼鎸囨暟锛氭瀬閫傚疁锛屽ぉ姘斾笉閿欙紝鎶撶揣鏃舵満璁╄。鐗╂檼澶槼鍚с\x80\x82\n鏃呮父鎸囨暟锛氳緝閫傚疁锛屽ぉ姘旂暐鐑紝澶栧嚭璇锋敞鎰忛槻鏅掑摝锛\x81\n璺喌鎸囨暟锛氬共鐕ワ紝澶╂皵杈冨ソ锛岃矾闈㈡瘮杈冨共鐕ワ紝璺喌杈冨ソ銆\x82\n鑸掗\x80傚害鎸囨暟锛氬緢涓嶈垝閫傦紝鐑堟棩鐐庣値鐨勬櫞澶╋紝寰堢儹銆\x82\n绌烘皵姹℃煋鎸囨暟锛氳緝宸紝姘旇薄鏉′欢杈冧笉鍒╀簬绌烘皵姹℃煋鐗╂墿鏁c\x80\x82\n绱绾挎寚鏁帮細寮猴紝娑傛摝SPF澶т簬15銆丳A+闃叉檼鎶よ偆鍝併\x80\x82</string><string>24鈩\x83/31鈩\x83</string><string>8鏈\x886鏃\xa5 闆烽樀闆ㄨ浆闃甸洦</string><string>鏃犳寔缁鍚戝井椋\x8e</string><string>4.gif</string><string>3.gif</string><string>22鈩\x83/28鈩\x83</string><string>8鏈\x887鏃\xa5 涓洦杞ぇ闆\xa8</string><string>鏃犳寔缁鍚戝井椋\x8e</string><string>8.gif</string><string>9.gif</string><string>鍖椾含浣嶄簬鍗庡寳骞冲師瑗垮寳杈圭紭锛屽競涓績浣嶄簬鍖楃含39搴︼紝涓滅粡116搴︼紝鍥涘懆琚渤鍖楃渷鍥寸潃锛屼笢鍗楀拰澶╂触甯傜浉鎺ャ\x80傚叏甯傞潰绉竴涓囧叚鍗冨骞虫柟鍏噷锛岃緰12鍖\xba6鍘匡紝浜哄彛1100浣欎竾銆傚寳浜负鏆栨俯甯﹀崐婀挎鼎澶ч檰鎬у椋庢皵鍊欙紝澶忓鐐庣儹澶氶洦锛屽啲瀛e瘨鍐峰共鐕ワ紝鏄ャ\x80佺鐭績锛屽勾骞冲潎姘旀俯10-12鎽勬皬搴︺\x80傚寳浜槸涓栫晫鍘嗗彶鏂囧寲鍚嶅煄鍜屽彜閮戒箣涓\x80銆傛棭鍦ㄤ竷鍗佷竾骞村墠锛屽寳浜懆鍙e簵鍦板尯灏卞嚭鐜颁簡鍘熷浜虹兢閮ㄨ惤鈥滃寳浜汉鈥濄\x80傝\x80屽寳浜缓鍩庝篃宸叉湁涓ゅ崈澶氬勾鐨勫巻鍙诧紝鏈\x80鍒濊浜庤杞界殑鍚嶅瓧涓衡\x80滆摕鈥濄\x80傚叕鍏冨墠1045骞村寳浜垚涓鸿摕銆佺嚂绛夎渚浗鐨勯兘鍩庯紱鍏厓鍓\x8d221骞寸Е濮嬬殗缁熶竴涓浗浠ユ潵锛屽寳浜竴鐩存槸涓浗鍖楁柟閲嶉晣鍜屽湴鏂逛腑蹇冿紱鑷叕鍏\x83938骞翠互鏉ワ紝鍖椾含鍙堝厛鍚庢垚涓鸿窘闄兘銆侀噾涓婇兘銆佸厓澶ч兘銆佹槑娓呭浗閮姐\x80\x821949骞\xb410鏈\x881鏃ユ寮忓畾涓轰腑鍗庝汉姘戝叡鍜屽浗棣栭兘銆傚寳浜叿鏈変赴瀵岀殑鏃呮父璧勬簮锛屽澶栧紑鏀剧殑鏃呮父鏅偣杈\xbe200澶氬锛屾湁涓栫晫涓婃渶澶х殑鐨囧绱鍩庛\x80佺キ澶╃搴欏ぉ鍧涖\x80佺殗瀹惰姳鍥寳娴枫\x80佺殗瀹跺洯鏋楅鍜屽洯锛岃繕鏈夊叓杈惧箔銆佹厱鐢板唱銆佸徃椹彴闀垮煄浠ュ強涓栫晫涓婃渶澶х殑鍥涘悎闄㈡伃鐜嬪簻绛夊悇鑳滃彜杩广\x80傚叏甯傚叡鏈夋枃鐗╁彜杩\xb97309椤癸紝鍏朵腑鍥藉鏂囩墿淇濇姢鍗曚綅42涓紝甯傜骇鏂囩墿淇濇姢鍗曚綅222涓\x80傚寳浜殑甯傛爲涓哄浗妲愬拰渚ф煆锛屽競鑺变负鏈堝鍜岃強鑺便\x80傚彟澶栵紝鍖椾含鍑轰骇鐨勮薄鐗欓洉鍒汇\x80佺帀鍣ㄩ洉鍒汇\x80佹櫙娉拌摑銆佸湴姣瓑浼犵粺鎵嬪伐鑹哄搧椹拌獕涓栫晫銆\x82</string></getWeatherbyCityNameResult></getWeatherbyCityNameResponse></soap:Body></soap:Envelope>

通过IE浏览器访问该Web Service,查询“广州”时得到结果如下图所示。

Image Title

通过对比LoadRunner的Replay Log和浏览器的返回页面可知:LoadRunner回放得到的结果与查询条件不一致。在LR脚本中将theCityName更改为“深圳”、“上海”等城市后重新回放脚本,仍然得到相同的结果。

观察返回结果的结构可知,第三个string字段为城市编码,在LR中采用不同城市名称进行回放脚本时,查询得到的城市编码均为54511。在WeatherWebService的服务商网页中,可查询得到城市编码“54511”对应的城市为“北京”。

回顾报文中的Content-Type信息可知,请求报文与响应报文的编码均为UTF-8。因此可以猜想该问题是由于LR脚本中的编码不为UTF-8造成的,从而使得脚本中的设置的汉字theCityName不被服务商所识别。

对LR脚本中需传送的汉字进行编码转换,即将脚本中的汉字转换为UTF-8,转换方法如下图所示:

Image Title

重新回放脚本,查看Replay Log。

theWeatherInfo = <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><getWeatherbyCityNameResponse xmlns="http://WebXml.com.cn/"><getWeatherbyCityNameResult><string>骞夸笢</string><string>骞垮窞</string><string>59287</string><string>59287.jpg</string><string>2013-8-5 21:58:50</string><string>25鈩\x83/34鈩\x83</string><string>8鏈\x886鏃\xa5 鏅\xb4</string><string>鏃犳寔缁鍚戝井椋\x8e</string><string>0.gif</string><string>0.gif</string><string>浠婃棩澶╂皵瀹炲喌锛氭皵娓╋細26鈩冿紱椋庡悜/椋庡姏锛氫笢鍖楅 1绾э紱婀垮害锛\x9a93%锛涚┖姘旇川閲忥細杈冨樊锛涚传澶栫嚎寮哄害锛氬緢寮\xba</string><string>绌胯。鎸囨暟锛氱値鐑紝寤鸿绌跨煭琛\x80佺煭瑁ょ瓑娓呭噳澶忓鏈嶈銆\x82\n杩囨晱鎸囨暟锛氫笉鏄撳彂锛岄櫎鐗规畩浣撹川锛屾棤闇\x80鎷呭績杩囨晱闂銆\x82\n杩愬姩鎸囨暟锛氳緝閫傚疁锛屾埛澶栬繍鍔ㄨ娉ㄦ剰闃叉檼銆\x82\n娲楄溅鎸囨暟锛氳緝閫傚疁锛屾棤闆ㄤ笖椋庡姏杈冨皬锛屾槗淇濇寔娓呮磥搴︺\x80\x82\n鏅炬檼鎸囨暟锛氭瀬閫傚疁锛屽ぉ姘斾笉閿欙紝鎶撶揣鏃舵満璁╄。鐗╂檼澶槼鍚с\x80\x82\n鏃呮父鎸囨暟锛氳緝閫傚疁锛屽ぉ姘旂暐鐑紝澶栧嚭璇锋敞鎰忛槻鏅掑摝锛\x81\n璺喌鎸囨暟锛氬共鐕ワ紝澶╂皵杈冨ソ锛岃矾闈㈡瘮杈冨共鐕ワ紝璺喌杈冨ソ銆\x82\n鑸掗\x80傚害鎸囨暟锛氬緢涓嶈垝閫傦紝鐑堟棩鐐庣値鐨勬櫞澶╋紝寰堢儹銆\x82\n绌烘皵姹℃煋鎸囨暟锛氳緝宸紝姘旇薄鏉′欢杈冧笉鍒╀簬绌烘皵姹℃煋鐗╂墿鏁c\x80\x82\n绱绾挎寚鏁帮細寰堝己锛屾秱鎿PF20浠ヤ笂锛孭A++鎶よ偆鍝侊紝閬垮己鍏夈\x80\x82</string><string>26鈩\x83/34鈩\x83</string><string>8鏈\x887鏃\xa5 闆烽樀闆ㄨ浆鏅\xb4</string><string>鏃犳寔缁鍚戝井椋\x8e</string><string>4.gif</string><string>0.gif</string><string>26鈩\x83/34鈩\x83</string><string>8鏈\x888鏃\xa5 闆烽樀闆ㄨ浆鏅\xb4</string><string>鏃犳寔缁鍚戝井椋\x8e</string><string>4.gif</string><string>0.gif</string><string>骞垮窞鏄箍涓滅渷鐨勭渷浼\x9a,鏄腑鍥藉崡鏂规渶澶х殑娴锋花鍩庡競锛屽箍宸炰綅浜庝笢缁\x8f113銆\x8217`锛屽寳绾\xac23銆\x828`锛屽湴澶勪腑鍥藉ぇ闄嗗崡閮紝骞夸笢鐪佸崡閮紝鐝犳睙涓夎娲插寳缂樸\x80傚箍宸炰复鍗楁捣锛岄偦杩戦娓壒鍒鏀垮尯锛屾槸涓浗閫氬線涓栫晫鐨勫崡澶ч棬锛屽箍宸炲睘涓橀櫟鍦板甫銆備腑鍥界殑绗笁澶ф渤----鐝犳睙浠庡箍宸炲競涓績绌挎祦鑰岃繃銆傚箍宸炴槸涓\x80搴у巻鍙叉枃鍖栧悕鍩庛\x80傜浉浼犲湪杩滃彜鏃跺\x80欙紝鏇炬湁浜斾綅浠欎汉锛岃韩绌夸簲鑹插僵鏈嶃\x80侀獞鐫\x80鍢磋绋荤鐨勪簲鑹蹭粰缇婇檷涓存鍦帮紝鎶婄ɑ绌楄禒缁欑櫨濮擄紝绁濇効杩欓噷姘告棤楗ヨ崚銆備粠姝わ紝骞垮窞渚挎湁鈥滅緤鍩庘\x80濄\x80佲\x80滅鍩庘\x80濈殑缇庣О锛屸\x80滀簲缇娾\x80濅篃鎴愪负骞垮窞鐨勮薄寰併\x80傚箍宸炴棦鏄腑鍥戒篃鏄笘鐣屽悕鍩庯紝鍙堟槸涓\x80搴у彜鍩庯紝鍥犲巻鍙蹭笂鏈変簲缇婁粰瀛愰檷涓寸尞绋荤鐨勬晠浜嬶紝骞垮窞鍙堢О涓衡\x80滅緤鍩庘\x80濆拰鈥滅鍩庘\x80濓紝绠\x80绉扳\x80滅鈥濓紱骞垮窞涓\x80骞村洓瀛e鏄ャ\x80佺箒鑺变技閿︼紝闄ゅ杩庢槬鑺卞競闂诲悕娴峰唴澶栵紝鏁呭張鏈夆\x80滆姳鍩庘\x80濈殑缇庤獕銆傚箍宸炲湴澶勪綆绾\xac,灞炲崡浜氱儹甯﹀椋庢皵鍊欏尯銆傚湴琛ㄦ帴鍙楀お闃宠緪灏勯噺杈冨锛屽悓鏃跺彈瀛i鐨勫奖鍝\x8d,澶忓娴锋磱鏆栨皵娴佸舰鎴愰珮娓┿\x80侀珮婀裤\x80佸闆ㄧ殑姘斿\x80欙紱鍐鍖楁柟澶ч檰鍐烽褰㈡垚浣庢俯銆佸共鐕ャ\x80佸皯闆ㄧ殑姘斿\x80欍\x80傚勾骞冲潎姘旀俯涓\xba21.4-21.9搴︼紝骞撮檷闆ㄩ噺骞冲潎涓\xba1623.6-1899.8mm锛屽寳閮ㄥ浜庡崡閮ㄣ\x80\x821982骞达紝骞垮窞琚浗鍔¢櫌閫夊畾涓哄叏鍥介鎵瑰巻鍙叉枃鍖栧悕鍩庝箣涓\x80锛屾槸鎴戝浗閲嶇偣鏃呮父鍩庡競銆\x821999骞\xb41鏈堬紝骞垮窞琚瘎涓轰紭绉\x80鏃呮父鍩庡競銆傛櫙瑙傦細鐧戒簯灞便\x80佽幉鑺卞北銆佸崡娴风搴欍\x80佷經灞辩搴欍\x80佸箍宸炲姩鐗╁洯绛夈\x80\x82</string></getWeatherbyCityNameResult></getWeatherbyCityNameResponse></soap:Body></soap:Envelope>

再次对比LoadRunner的Replay Log和浏览器的返回页面可知,LoadRunner对Web Service实现了正确的调用。

虽然LoadRunner获取得到的结果中汉字显示为乱码,但从性能测试的角度来看,该问题对性能测试结果没有影响,可暂时忽略。

posted @ 2013-08-05 22:30  龙佛热  阅读(433)  评论(0编辑  收藏  举报