用winsock来服务webservice(原创)
如何用LoadRunner来测试webservice协议?我相信大家可以在网上找到很多资料。今天我要说的是如何用winsock来服务webservice。我刚刚完成的这个项目采用的是webservice协议。步骤很简单,首先加载试卷,然后答题,提交答案。
用LoadRunner来测试webservice协议,第一步是要知道用到哪些函数。在我的项目中,我用到了2个函数,一个是加载试卷:GetQuizSetting。一个是提交考试成绩:TrackUserQuizDetail。怎么知道这2个函数呢?这个可以问开发。然后开发会告诉你在这个项目中用到了哪些函数。选择“Add Service Call”,在“Operation”中找到这2个函数,点”OK”,添加成功。
脚本如下:
Action()
{
web_service_call( "StepName=GetQuizSetting_101",
"SOAPMethod=Train.TrainSoap.GetQuizSetting",
"ResponseParam=response",
"Service=Train",
"Snapshot=t1247551033.inf",
BEGIN_ARGUMENTS,
"UserCode=",
"TimeStamp=",
"GUID=",
"QuizID=",
END_ARGUMENTS,
BEGIN_RESULT,
END_RESULT,
LAST);
web_service_call( "StepName=TrackUserQuizDetail_101",
"SOAPMethod=Train.TrainSoap.TrackUserQuizDetail",
"ResponseParam=response",
"Service=Train",
"Snapshot=t1247551058.inf",
BEGIN_ARGUMENTS,
"UserCode=",
"TimeStamp=",
"GUID=",
"TrainLogID=",
"QuizID=",
"QuizNo=",
"UserAnswer=",
"IsRight=",
"Score=",
"IsSubmit=",
"IsServerScroe=",
"ExamType=",
"IsAllAnswer=",
END_ARGUMENTS,
BEGIN_RESULT,
END_RESULT,
LAST);
return 0;
}
第二步就是要填充函数中相关参数的数值。如何获得这个数值呢?有一种最简单的方法就是问开发。还有另一种方法,我们不求开发,自己来获得这些参数的数值。这就用到了winsock协议。
大家都知道,winsock协议是最底层的协议。我们采用winsock协议可以捕获客户端发送的所有数据。我用winsock协议录制了脚本,然后在data.ws中搜索关键字“TrackUserQuizDetail”找到关键字所在的buf。
send buf345 4771
"POST /services/TrainSoap HTTP/1.1"r"n"
"Accept: */*"r"n"
"Accept-Language: zh-CN"r"n"
"Referer: http://172.16.120.224:8088/exam/Quiz_SXPT.swf"r"n"
"x-flash-version: 10,0,22,87"r"n"
"Content-Type: text/xml; charset=utf-8"r"n"
"SOAPAction: ""http://tempuri.org/TrackUserQuizDetail"""r"n"
"Content-Length: 4234"r"n"
"UA-CPU: x86"r"n"
"Accept-Encoding: gzip, deflate"r"n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1."
"1.4322; CIBA)"r"n"
"Host: 172.16.120.224:8088"r"n"
"Connection: Keep-Alive"r"n"
"Cache-Control: no-cache"r"n"
"Cookie: JSESSIONID=27A48E3961C562E7C711B90D07E96E03"r"n"
""r"n"
"<?xml version=""1.0"" encoding=""utf-8""?>"r<SOAP-ENV:Envelope xmlns:xsi="""
"http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/"
"2001/XMLSchema"" xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope"
"/""><SOAP-ENV:Body><TrackUserQuizDetail xmlns=""http://tempuri.org/""><Use"
"rCode>13031</UserCode><TimeStamp>1</TimeStamp><GUID>2009071401343413031.xm
"l</GUID><TrainLogID>456</TrainLogID><QuizID>216</QuizID><QuizNo>0</QuizNo>"
"<UserAnswer><?xml version="1.0" ?><Quiz id="{F0857"
"219-7DF2-46A0-A7A4-A610D0F6C2C7}%13031%00000006:DEVT01000100000183:12.5;00"
"000007:DEVT01000100000185:12.5;00000008:DEVT01000100000181:12.5;00000009:D"
"EVT01000100000180:12.5;00000010:DEVT01000100000186:12.5;00000011:DEVT01000"
"100000187:12.5;00000012:DEVT01000100000184:12.5;00000013:DEVT0100010000018"
"2:12.5;"><table><ItemId>1</ItemId><ItemType&g"
"t;2</ItemType><UserName>undefined</UserName><ItemDesc"
"><![CDATA[ 鏈夊摢浜涗笉鏄疦etOA缃戠粶鍔炲叕绯荤粺鐨勭壒鑹诧紵]]>&"
"lt;/ItemDesc><ItemScore>12.5</ItemScore><StandardAnswer&"
"gt;3</StandardAnswer><UserAnswer>3</UserAnswer><RealS"
"core>12.5</RealScore></table><table><ItemId>2&l"
"t;/ItemId><ItemType>2</ItemType><UserName>undefined&l"
"t;/UserName><ItemDesc><![CDATA[ 閽堝缃戠粶鍔炲叕绯荤粺鐨勫彂"
"灞曡秼鍔匡紝浠ヤ笅鍝彞璇濇槸涓嶅鐨勶紵]]></ItemDesc><ItemS"
"core>12.5</ItemScore><StandardAnswer>3</StandardAnswer&g"
"t;<UserAnswer>3</UserAnswer><RealScore>12.5</RealScor"
"e></table><table><ItemId>3</ItemId><ItemType"
">2</ItemType><UserName>undefined</UserName><ItemDe"
"sc><![CDATA[ 鏈」鐩缓璁功鐢辫皝鏉ヨ繘琛岀紪鍐欙紵]]></It"
"emDesc><ItemScore>12.5</ItemScore><StandardAnswer>3&l"
"t;/StandardAnswer><UserAnswer>3</UserAnswer><RealScore&g"
"t;12.5</RealScore></table><table><ItemId>4</Ite"
"mId><ItemType>2</ItemType><UserName>undefined</Use"
"rName><ItemDesc><![CDATA[ 鏈」鐩缓璁功鐨勭洰鐨勬槸锛焆]&"
"gt;</ItemDesc><ItemScore>12.5</ItemScore><StandardAns"
"wer>2</StandardAnswer><UserAnswer>2</UserAnswer><R"
"ealScore>12.5</RealScore></table><table><ItemId>"
";5</ItemId><ItemType>3</ItemType><UserName>undefin"
"ed</UserName><ItemDesc><![CDATA[ NetOA鐨勬妧鏈"
""x80"
"夊瀷锛焆]></ItemDesc><ItemScore>12.5</ItemScore><S"
"tandardAnswer>1,2,4</StandardAnswer><UserAnswer>1,2,4</U"
"serAnswer><RealScore>12.5</RealScore></table><tabl"
"e><ItemId>6</ItemId><ItemType>3</ItemType><U"
"serName>undefined</UserName><ItemDesc><![CDATA[ 閽堝Ne"
"tOA鐨勭郴缁熸灦鏋勶紝鍝簺鎻忚堪鏄鐨勶紵]]></ItemDesc><It"
"emScore>12.5</ItemScore><StandardAnswer>1,2,3,4</Standar"
"dAnswer><UserAnswer>1,2,3,4</UserAnswer><RealScore>12"
".5</RealScore></table><table><ItemId>7</ItemId&"
"gt;<ItemType>3</ItemType><UserName>undefined</UserNam"
"e><ItemDesc><![CDATA[ 鏈夊摢浜涙槸NetOA缃戠粶鍔炲叕绯荤粺鐨勫姛"
"鑳斤紵]]></ItemDesc><ItemScore>12.5</ItemScore><St"
"andardAnswer>1,4</StandardAnswer><UserAnswer>1,4</UserAn"
"swer><RealScore>12.5</RealScore></table><table>"
"<ItemId>8</ItemId><ItemType>3</ItemType><UserNa"
"me>undefined</UserName><ItemDesc><![CDATA[ NetOA缃戠粶鍔"
"炲叕绯荤粺缁欏鎴峰甫鏉ョ殑浠峰"
""x80"
"硷紵]]></ItemDesc><ItemScore>12.5</ItemScore><Stan"
"dardAnswer>1,2,4</StandardAnswer><UserAnswer>1,2,4</User"
"Answer><RealScore>12.5</RealScore></table></Quiz&g"
"t;</UserAnswer><IsRight>0</IsRight><Score>0</Score><IsSubmit>true</IsSubmi"
"t><IsServerScroe>false</IsServerScroe><ExamType>Exam</ExamType><IsAllAnswe"
"r>true</IsAllAnswer></TrackUserQuizDetail></SOAP-ENV:Body></SOAP-ENV:Envel"
"ope>"
在这里有我们要的参数。比如UserCode:13031(红色部分)。依次类推,我们可以找到所有的参数的数值,然后填入脚本中即可。
经过这个项目,我发现webservice中用到的函数也可以不用请教开发。首先我用winsock协议来录制,在winsock的脚本中,可以发现调用了哪些webservice的函数,然后筛选出哪些函数是我们要用到的。不过保险起见,还是要多和开发交流交流,就象我虽然通过winsock获得了”useranswer”的内容,但还是向开发索要了这个数据,然后把开发给的数据和自己捕获的数据一比较,完全吻合。说明用这个方法是可行的。
-------------------------------
知其然,知其所以然。