簡單的python http接口自動化腳本


今天給大家分享一個簡單的Python腳本,使用python進行http的接口測試,腳本很簡單,邏輯是:讀取excel寫好的測試用例,然后根據excel中的用例內容進行調用,判斷預期結果中的返回值是否和返回報文中的值一致,如果不一致則根據用例標題把bug提交到bug管理系統,這里使用的bug管理系統是bugfree。

    實現步驟:

        1、讀取excel,保存測試用例中的內容;

        2、根據excel中的請求url和參數拼接請求報文,調用接口,並保存返回報文;

        3、讀取返回報文,和預期結果對比,不一致的往bugfree數據庫中寫入一條bug,並且把請求報文、返回報文和測試結果寫到測試用例的excel中。

    http接口最常用的兩種請求方式,POST和GET兩種方法,請求都是類似下面例子的url。

    例子:http://127.0.0.1:8080/rest/login?oper_no=marry&id=10

    需要用的到幾個模塊,requests、xlrd(讀取excel)、xlutils(寫excel)、MySQLdb(連接數據庫)這四個模塊都是第三方模塊,需要自己單獨安裝,用到的一些python中的方法和內置函數也都做了說明,本文使用的python版本是python2.7

    首先先寫好excel的用例模板,需要有的字段 項目、用例id、接口名稱、用例描述、請求方式、url請求地址、請求參數(多個的參數話用;分號隔開)、結果驗證(多個的參數話用;分號隔開)、請求報文、返回報文、測試人員、測試結果,測試用例截圖如下:

 



  整體代碼如下,注釋加的很詳細了

Python代碼   收藏代碼
  1. # -*- coding:utf-8 -*-  
  2. import requests, xlrd, MySQLdb, time, sys  
  3. #導入需要用到的模塊  
  4. from xlutils import copy  
  5. #從xlutils模塊中導入copy這個函數  
  6. def readExcel(file_path):  
  7. ''''' 
  8.     讀取excel測試用例的函數 
  9.     :param file_path:傳入一個excel文件,或者文件的絕對路徑 
  10.     :return:返回這個excel第一個sheet頁中的所有測試用例的list 
  11.     '''  
  12. try:  
  13. #打開excel  
  14. except Exception,e:  
  15. #如果路徑不在或者excel不正確,返回報錯信息  
  16. print '路徑不在或者excel不正確',e  
  17. return e  
  18. else:  
  19. 0)#取第一個sheet頁  
  20. #取這個sheet頁的所有行數  
  21. #保存每一條case  
  22. for i in range(rows):  
  23. if i !=0:  
  24. #把每一條測試用例添加到case_list中  
  25.         #調用接口測試的函數,把存所有case的list和excel的路徑傳進去,因為后面還需要把返回報文和測試結果寫到excel中,  
  26. #所以需要傳入excel測試用例的路徑,interfaceTest函數在下面有定義  
  27.   
  28. def interfaceTest(case_list,file_path):  
  29.     #存測試結果的list  
  30.     #存請求報文的list  
  31.     #存返回報文的list  
  32. for case in case_list:  
  33. ''''' 
  34.         先遍歷excel中每一條case的值,然后根據對應的索引取到case中每個字段的值 
  35.         '''  
  36. try:  
  37. ''''' 
  38.             這里捕捉一下異常,如果excel格式不正確的話,就返回異常 
  39.             '''  
  40. #項目,提bug的時候可以根據項目來提  
  41. 0]  
  42. #用例id,提bug的時候用  
  43. 1]  
  44. #接口名稱,也是提bug的時候用  
  45. 2]  
  46. #用例描述  
  47. 3]  
  48. #請求方式  
  49. 4]  
  50. #請求url  
  51. 5]  
  52. #入參  
  53. 6]  
  54. #預期結果  
  55. 7]  
  56. #測試人員  
  57. 10]  
  58. except Exception,e:  
  59. return '測試用例格式不正確!%s'%e  
  60. if param== '':  
  61. ''''' 
  62.             如果請求參數是空的話,請求報文就是url,然后把請求報文存到請求報文list中 
  63.             '''  
  64. #請求報文  
  65.         else:  
  66. ''''' 
  67.             如果請求參數不為空的話,請求報文就是url+?+參數,格式和下面一樣 
  68.             http://127.0.0.1:8080/rest/login?oper_no=marry&id=100,然后把請求報文存到請求報文list中 
  69.             '''  
  70. '?'+urlParam(param)#請求報文  
  71. ''''' 
  72.             excel里面的如果有多個入參的話,參數是用;隔開,a=1;b=2這樣的,請求的時候多個參數要用&連接, 
  73.             要把;替換成&,所以調用了urlParam這個函數,把參數中的;替換成&,函數在下面定義的 
  74.             '''  
  75.         if method.upper() == 'GET':  
  76. ''''' 
  77.             如果是get請求就調用requests模塊的get方法,.text是獲取返回報文,保存返回報文, 
  78.             把返回報文存到返回報文的list中 
  79.             '''  
  80. print new_url  
  81.             print results  
  82.             ''''' 
  83.             獲取到返回報文之后需要根據預期結果去判斷測試是否通過,調用查看結果方法 
  84.             把返回報文和預期結果傳進去,判斷是否通過,readRes方法在下面定義了。 
  85.             '''  
  86.         else:  
  87. ''''' 
  88.             如果不是get請求,也就是post請求,就調用requests模塊的post方法,.text是獲取返回報文, 
  89.             保存返回報文,把返回報文存到返回報文的list中 
  90.             '''  
  91.             responses.append(results)  
  92. ''''' 
  93.             獲取到返回報文之后需要根據預期結果去判斷測試是否通過,調用查看結果方法 
  94.             把返回報文和預期結果傳進去,判斷是否通過,readRes方法會返回測試結果,如果返回pass就 
  95.             說明測試通過了,readRes方法在下面定義了。 
  96.             '''  
  97.         if 'pass' in res:  
  98. ''''' 
  99.             判斷測試結果,然后把通過或者失敗插入到測試結果的list中 
  100.             '''  
  101. 'pass')  
  102. else:  
  103. 'fail')  
  104. ''''' 
  105.             如果不通過的話,就調用寫bug的方法,把case_id、接口名稱、請求報文、返回報文和預期結果傳進去 
  106.             writeBug方法在下面定義了,具體實現是先連接數據庫,然后拼sql,插入到bug表中 
  107.             '''  
  108.     ''''' 
  109.     全部用例執行完之后,會調用copy_excel方法,把測試結果寫到excel中, 
  110.     每一條用例的請求報文、返回報文、測試結果,這三個每個我在上面都定義了一個list 
  111.     來存每一條用例執行的結果,把源excel用例的路徑和三個list傳進去調用即可,copy_excel方 
  112.     法在下面定義了,也加了注釋 
  113.     '''  
  114.   
  115. def readRes(res,res_check):  
  116. ''''' 
  117.     :param res: 返回報文 
  118.     :param res_check: 預期結果 
  119.     :return: 通過或者不通過,不通過的話會把哪個參數和預期不一致返回 
  120.     '''  
  121. ''''' 
  122.     返回報文的例子是這樣的{"id":"J_775682","p":275.00,"m":"458.00"} 
  123.     excel預期結果中的格式是xx=11;xx=22這樣的,所以要把返回報文改成xx=22這樣的格式 
  124.     所以用到字符串替換,把返回報文中的":"和":替換成=,返回報文就變成 
  125.     {"id=J_775682","p=275.00,"m=458.00"},這樣就和預期結果一樣了,當然也可以用python自帶的 
  126.     json模塊來解析json串,但是有的返回的不是標准的json格式,處理起來比較麻煩,這里我就用字符串的方法了 
  127.     '''  
  128. '":"',"=").replace('":',"=")  
  129.     ''''' 
  130.     res_check是excel中的預期結果,是xx=11;xx=22這樣的 
  131.     所以用split分割字符串,split是python內置函數,切割字符串,變成一個list 
  132.     ['xx=1','xx=2']這樣的,然后遍歷這個list,判斷list中的每個元素是否存在這個list中, 
  133.     如果每個元素都在返回報文中的話,就說明和預期結果一致 
  134.     上面我們已經把返回報文變成{"id=J_775682","p=275.00,"m=458.00"} 
  135.     '''  
  136. ';')  
  137. for s in res_check:  
  138. ''''' 
  139.         遍歷預期結果的list,如果在返回報文中,什么都不做,pass代表什么也不做,全部都存在的話,就返回pass 
  140.         如果不在的話,就返回錯誤信息和不一致的字段,因為res_check是從excel里面讀出來的 
  141.         字符Unicode類型的的,python的字符串是str類型的,所以要用str方法強制類型轉換,轉換成string類型的 
  142.         '''  
  143. if s in res:  
  144. pass  
  145. else:  
  146. return  '錯誤,返回參數和預期結果不一致'+str(s)  
  147. return 'pass'  
  148. def urlParam(param):  
  149. ''''' 
  150.     參數轉換,把參數轉換為'xx=11&xx=2這樣' 
  151.     '''  
  152. return param.replace(';','&')  
  153. def copy_excel(file_path,res_flags,request_urls,responses):  
  154. ''''' 
  155.     :param file_path: 測試用例的路徑 
  156.     :param res_flags: 測試結果的list 
  157.     :param request_urls: 請求報文的list 
  158.     :param responses: 返回報文的list 
  159.     :return: 
  160.     '''  
  161. ''''' 
  162.     這個函數的作用是寫excel,把請求報文、返回報文和測試結果寫到測試用例的excel中 
  163.     因為xlrd模塊只能讀excel,不能寫,所以用xlutils這個模塊,但是python中沒有一個模塊能 
  164.     直接操作已經寫好的excel,所以只能用xlutils模塊中的copy方法,copy一個新的excel,才能操作 
  165.     '''  
  166. #打開原來的excel,獲取到這個book對象  
  167.     #復制一個new_book  
  168.     #然后獲取到這個復制的excel的第一個sheet頁  
  169. 0)  
  170. 1  
  171. for request_url,response,flag in zip(request_urls,responses,res_flags):  
  172. ''''' 
  173.         同時遍歷請求報文、返回報文和測試結果這3個大的list 
  174.         然后把每一條case執行結果寫到excel中,zip函數可以將多個list放在一起遍歷 
  175.         因為第一行是表頭,所以從第二行開始寫,也就是索引位1的位置,i代表行 
  176.         所以i賦值為1,然后每寫一條,然后i+1, i+=1同等於i=i+1 
  177.         請求報文、返回報文、測試結果分別在excel的8、9、11列,列是固定的,所以就給寫死了 
  178.         后面跟上要寫的值,因為excel用的是Unicode字符編碼,所以前面帶個u表示用Unicode編碼 
  179.         否則會有亂碼 
  180.         '''  
  181. 8,u'%s'%request_url)  
  182. 9,u'%s'%response)  
  183. 11,u'%s'%flag)  
  184. 1  
  185. #寫完之后在當前目錄下(可以自己指定一個目錄)保存一個以當前時間命名的測試結果,time.strftime()是格式化日期  
  186. '%s_測試結果.xls'%time.strftime('%Y%m%d%H%M%S'))  
  187. def writeBug(bug_id,interface_name,request,response,res_check):  
  188. ''''' 
  189.     這個函數用來連接數據庫,往bugfree數據中插入bug,拼sql,執行sql即可 
  190.     :param bug_id: bug序號 
  191.     :param interface_name: 接口名稱 
  192.     :param request: 請求報文 
  193.     :param response: 返回報文 
  194.     :param res_check: 預期結果 
  195.     :return: 
  196.     '''  
  197. 'utf-8')  
  198. 'utf-8')  
  199. 'utf-8')  
  200. 'utf-8')  
  201. 'utf-8')  
  202. ''''' 
  203.     因為上面幾個字符串是從excel里面讀出來的都是Unicode字符集編碼的, 
  204.     python的字符串上面指定了utf-8編碼的,所以要把它的字符集改成utf-8,才能把sql拼起來 
  205.     encode方法可以指定字符集 
  206.     '''  
  207. #取當前時間,作為提bug的時間  
  208. "%Y-%m-%d %H:%M:%S")  
  209. #bug標題用bug編號加上接口名稱然后加上_結果和預期不符,可以自己隨便定義要什么樣的bug標題  
  210. '_' + interface_name + '_結果和預期不符'  
  211. #復現步驟就是請求報文+預期結果+返回報文  
  212. '[請求報文]<br />'+request+'<br/>'+'[預期結果]<br/>'+res_check+'<br/>'+'<br/>'+'[響應報文]<br />'+'<br/>'+response  
  213. #拼sql,這里面的項目id,創建人,嚴重程度,指派給誰,都在sql里面寫死,使用的時候可以根據項目和接口  
  214. # 來判斷提bug的嚴重程度和提交給誰  
  215. "INSERT INTO `bf_bug_info` (`created_at`, `created_by`, `updated_at`, `updated_by`, `bug_status`, `assign_to`, `title`, `mail_to`, `repeat_step`, `lock_version`, `resolved_at`, `resolved_by`, `closed_at`, `closed_by`, `related_bug`, `related_case`, `related_result`, " \  
  216. "`productmodule_id`, `modified_by`, `solution`, `duplicate_id`, `product_id`, " \  
  217. "`reopen_count`, `priority`, `severity`) VALUES ('%s', '1', '%s', '1', 'Active', '1', '%s', '系統管理員', '%s', '1', NULL , NULL, NULL, NULL, '', '', '', NULL, " \  
  218. "'1', NULL, NULL, '1', '0', '1', '1');"%(now,now,bug_title,step)  
  219. #建立連接,使用MMySQLdb模塊的connect方法連接mysql,傳入賬號、密碼、數據庫、端口、ip和字符集  
  220. 'root',passwd='123456',db='bugfree',port=3306,host='127.0.0.1',charset='utf8')  
  221. #建立游標  
  222.     #執行sql  
  223.     #提交  
  224.     #關閉游標  
  225.     #關閉連接  
  226. if __name__ == '__main__':  
  227. ''''' 
  228.     然后進行調用,調用的時候需要傳入一個excel,調用方式是 python test.py test_case.xls 
  229.     sys.argv[1]的意思是取傳入的第二個參數,也就是索引是1的, 
  230.     第一個是這個python文件的文件名,如果不傳入參數運行的話,會提示錯誤,如果正確的話, 
  231.     會調用讀excel的程序,執行用例,運行完成后,會打印Done 
  232.     '''  
  233. try:  
  234. 1]  
  235. except IndexError,e:  
  236. print 'Please enter a correct testcase! \n e.x: python gkk.py test_case.xls'  
  237. else:  
  238.     print 'Done!'  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM