python在webservice接口測試中的應用

    接口測試第二波,webservice接口來咯,歡迎各位小夥伴吐槽~

    本次拿免費的互聯網國內手機號碼歸屬地查詢WEB服務webservice接口做例子,當然有很多免費webservice接口可以供大家使用,百度一下就有N多,手機號碼歸屬地查詢wsdl地址如下:http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

打開後可以看到有一個getMobileCodeInfo方法,入參是一個電話號碼,當然也可以通過python調用來看到,接下來會介紹。使用python的suds模塊,這是一個第三方模塊,需要安裝,如果安裝了setuptools或pip,可以直接用easy_install 或pip命令安裝,easy_install suds或pip install suds即可,如果沒有安裝,可以去官網上下載,http://pypi.python.org/pypi/suds,下載後進入suds目錄python setup.py install 即可。

    由於每個接口方法都是不一樣的,入參也不一樣,所以沒有辦法像http rest接口一樣寫成一個通用類,只能在測試的時候修改接口的方法名和入參了。

    首先我們來看一下這個wsdl下都有哪些方法:

suds.client Client#導入suds.client 模塊下的Client類
client = Client()#創建一個wsdl對象
print client#打印這個對象的詳細信息

打印出來的結果如下:

Suds ( https://fedorahosted.org/suds/ )  version: 0.4 GA  build: R699-20100913

Service ( MobileCodeWS ) tns="http://WebXml.com.cn/"

   Prefixes (1)

      ns0 = "http://WebXml.com.cn/"

   Ports (2):

      (MobileCodeWSSoap)

         Methods (2):

            getDatabaseInfo()

            getMobileCodeInfo(xs:string mobileCode, xs:string userID, )

         Types (1):

            ArrayOfString

      (MobileCodeWSSoap12)

         Methods (2):

            getDatabaseInfo()

            getMobileCodeInfo(xs:string mobileCode, xs:string userID, )

         Types (1):

            ArrayOfString

=================================================

從上面的結果可以看到有兩個方法一個是getDatabaseInfo()沒有入參,一個是getMobileCodeInfo(),入參是一個字符串,手機號和用戶id,免費用戶的用戶id可以不填,下面就是用來測試的代碼了,註釋也很詳細:

from suds.client import Client #導入suds.client 模塊下的Client類
Mobile_url="http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"#手機號碼歸屬地
QQ_url="http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"#qq在線狀態
Random_url='http://webservice.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl'#生成隨機字符串
def WsTest(url,Wsname,data):
   '''
   
:param url: wsdl地址
   
:param Wsname: 方法名,做保存結果的文件名
   
:param data: 方法的傳入參數
   
:return:
   '''
   
client = Client(url)#創建一個webservice接口對象
   
client.service.getMobileCodeInfo(data)#調用這個接口下的getMobileCodeInfo方法,並傳入參數
   req
= str(client.last_sent())#保存請求報文,因爲返回的是一個實例,所以要轉換成str
   
response = str(client.last_received())#保存返回報文,返回的也是一個實例
   
print response#打印返回報文
   WriteRes(Wsname,req,response,data)#調用寫入結果函數,把方法名、請求報文、返回報文、和入參傳進去
def WriteRes(WsName,req,response,data):
   '''
   
:param WsName: 接口的方法名
   
:param req: 請求報文
   
:param response: 返回報文
   
:param data: 傳入的數據
   '''
   
res = response.find(data)#從返回結果裏面找data,如果找到的話返回data的下標,也就是索引,找不到的話返回-1
   
fw_flag = open('/tmp/WsTestRes/WsTestRes.txt','a')#以追加模式打開寫入結果文件
   
if res>0:
       fw_flag.write('%s  pass'%WsName)#如果在返回報文中找到data的話,就寫pass,否則就寫fail
   
else:
       fw_flag.write('%s  fail'%WsName)
   fw_flag.close()#關閉結果文件
   
fw_result = open('/tmp/WsTestRes/%s_result.txt'%WsName,'w')#打開以接口方法命名的文件
   
fw_result.write(req+'\n'*3+response)#保存請求報文和返回報文,\n*3的意思是換行三次
   
fw_result.close()#關閉結果文件
if __name__ =='__main__':
   WsTest(Mobile_url,'getMobileCodeInfo','110')

如果傳入的是一個合法的手機號,執行後會看到類似下面的返回結果,所有判斷成功或者失敗就可以用手機號來判斷,所以上面寫的如果在返回報文中找到手機號的話,就說明調用成功了,可以把該方法pass。

<?xml version="1.0" encoding="UTF-8"?>

<soap:Envelope>

   <soap:Body>

      <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">

         <getMobileCodeInfoResult>18612538722:北京 北京 北京聯通GSM卡</getMobileCodeInfoResult>

      </getMobileCodeInfoResponse>

   </soap:Body>

</soap:Envelope>

=================================================

下面是輸入非法的手機號返回的結果,說明根據返回報文中有沒有手機號來判斷是否通過是靠譜的。

<?xml version="1.0" encoding="UTF-8"?>

<soap:Envelope>

   <soap:Body>

      <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">

         <getMobileCodeInfoResult>手機號碼錯誤 http://www.webxml.com.cn</getMobileCodeInfoResult>

      </getMobileCodeInfoResponse>

   </soap:Body>

</soap:Envelope>

=================================================

over,當然如果導入threading(多線程)模塊就能做一個簡單的壓力測試了,下次會更新哦



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章