Python3+requests搭建接口自動化測試框架


目錄
一、接口自動化的意義(為什么做這個框架)
二、准備工作
三、框架流程及邏輯
四、各模塊介紹
五、具體使用
 
一、接口自動化的意義(為什么做這個框架)
            新版本上線時之前版本的功能需要進行回歸測試,導致大量的重復性手工測試。引入自動化測試可以使用自動化技術代替部分手工的回歸性測試,解放更多人力做其它更有必要的事情。但目前項目UI變動頻繁,而接口一般不會做大變動所以先暫時做接口自動化。使用接口自動化可以做上線前接口功能的回歸性測試,也可以定時巡檢線上環境接口的運行情況,能及時發現線上環境接口問題並解決。同時此框架可以幫助不會寫代碼的測試同事進行接口自動化的相關工作。
 
二、准備工作
    開發語言:Python3
    需要安裝的模塊:
        Requests: python的一個HTTP客戶端庫,和urllib、urllib2類似。
                1、安裝方法:
使用pip安裝
pip install Requests
或 
python3 -m pip install Requests
                                                       
                              下載源碼后安裝
git clone git://github.com/kennethreitz/requests.git
cd requests
python setup.py install
                2、學習路徑:
 
         xlsxwriter :是python用來構造xlsx文件的模塊,可以完成xlsx文件的自動化構造,包括:合並單元格,制作excel圖表等功能。
                1、安裝方法:
使用pip安裝
pip install Requests
或 
python3 -m pip install Requests
            
                2、學習路徑:
 
三、框架流程及邏輯
    框架理念:使用json文件編寫測試用例,建一個腳本循環讀取測試用例並執行,然后對比返回的接口和用例中的期望結果。將測試結果寫入到一個excel表格中生成測試報告,最后使用發送郵件功能將測試報告發送到指定郵箱。其中對所有公共方法進行封裝並放在common公共文件目錄下。        
 

 

 
四、各模塊介紹
 
----interface_test                             項目文件夾目錄
    ----common                                存放公共方法目錄
            ----__init__.py                    初始化文件
            ----conf.py                          操作配置文件相關方法
            ----excelaction.py                Excel文件相關操作方法
            ----jsonaction.py                 Json文件相關操作方法
            ----logger.py                       記錄日志的相關方法
            ----newfile.py                      獲取最新文件的相關方法
            ----sendmail.py                   發送報告到指定郵箱的相關方法
            ----signture.py                    對數據進行簽名的相關方法
            ----userinfo.py                    獲取用戶信息的相關方法
            ----config_test.conf             基本配置文件
    ----logs                                       存放日志的目錄
    ----report                                    存放測試報告的目錄
    ----test_data                                存放測試用例數據的目錄
            ----login-1.json                    登錄接口的測試用例數據
            ----logout-2.json                  退出登錄接口的測試用例數據
    ----execute_test.py                       讀取測試用例並執行測試用例
    ----test.bat                                    運行測試項目的批處理文件
 
execute_test.py 主要程序
  1 # -*- coding: utf-8 -*-                                                                
  2 #!/usr/bin/env python                                                                
  3 import os                                                                                        
  4 import json                                                                                    
  5 import requests                                                                                            
  6 import common.conf as conf                                                                                                                        
  7 import common.excelaction as excelaction                                                                                                                
  8 from common.sendemail import sendreport                                                                                                            
  9 from common.signture import sign                                                                                            
 10 import common.userinfo as userinfo                                                                                                        
 11 import common.logger as logger                                                                                                                        
 12 import sys                                                                                                                                
 13 import time                                                                                                                                
 14                                                                                                                                                                                         
 15 #data_path = os.path.dirname(__file__) + '\\test_data\\' # 測試用例數據文件所在目錄                                                                            
 16 data_path = conf.testdata_path                                                                                                                    
 17                                                                                                                                                                                             
 18 test_reports = [] # 添加一個數組用來存儲測試結果                                                                                                      
 19 for file in os.listdir(data_path): # 循環讀取目錄下的文件                                                                                                                                                 
 20     child = os.path.join('%s%s'%(data_path,file)) # 將文件名和路徑拼接好                                                                                
 21     logger.info("當前打開的文件:"+child)                                                                                                                                   
 22     fl = open(child) # 打開文件                                                                                                                                             
 23     try:                                                                                                                                                                                                
 24         cases = json.load(fl)                                                                                                                    
 25         for key in cases: # 循環讀取文件中的測試用例(case)                                                                                            
 26             start_time = time.clock()                                                                                                            
 27             case = cases[key]                                                                                                                
 28             url = conf.get_conf('module',case['module']) + case['url']                                                                                                        
 29             data = case['data']                                                                                                                    
 30             data['Platform'] = conf.get_conf('params','Platform')                                                                                            
 31             data['Terminal'] = conf.get_conf('params','Terminal')                                                                        
 32             data['UserIP'] = conf.get_conf('params','UserIP')                                                                                        
 33             data['Version'] = conf.get_conf('params','Version')                                                                                            
 34             if "UserToken" in data and data['UserToken'] == '':                                                                                                    
 35                 data['UserToken'] = userinfo.get_token()                                                                                                
 36             hope_result = case['assert']                                                                                                
 37             method = case['method']                                                                                                    
 38             test_report = {                                                                                                                        
 39                 "case_id":case['id'],                                                                                                                
 40                 "t_name":case['name'],                                                                                                                
 41                 "method":method,                                                                                                                    
 42                 "url":url,                                                                                                                                
 43                 "params":data,                                                                                                                
 44                 "hope_result":hope_result,                                                                                                    
 45                 "actual_result":[],                                                                                                                    
 46                 "test_result":""                                                                                                                                
 47             }                                                                                                                                                                   
 48             try:                                                                                                                                                    
 49                 if method == 'post':                                                                                                                            
 50                     addsign_data = sign(data,conf.get_conf('sign','api_key'))                                                                                    
 51                     r = requests.post(url,data=json.dumps(addsign_data),headers=conf.header)                                                                            
 52                     response = r.json()                                                                                                    
 53                     s = True                                                                                                                    
 54                     for k in hope_result:                                                                                                            
 55                         ar = str(k) + ":" + str(response[k])                                                                                                
 56                         test_report["actual_result"].append(ar)                                                                                            
 57                         if type(hope_result[k]) == type(''):                                                                                                
 58                             if hope_result[k] in response[k]:                                                                                            
 59                                 s = s&True                                                                                                            
 60                             else:                                                                                                                    
 61                                 s = s&False                                                                                                        
 62                         else:                                                                                                                                
 63                             if hope_result[k] == response[k]:                                                                                            
 64                                 s = s&True                                                                                                                                                                                            
 65                             else:                                                                                                                
 66                                 s = s&False                                                                                                                
 67                     if s:                                                                                                                                   
 68                         test_report["test_result"] = "PASS"                                                                                            
 69                     else:                                                                                                                            
 70                         test_report["test_result"] = "Fail"                                                                                        
 71                                                                                                                                                                                                     
 72                 elif method == 'get':                                                                                                        
 73                     addsign_data = sign(data,conf.get_conf('sign','api_key'))                                                                                    
 74                     r = requests.get(url,params=addsign_data,headers=conf.header)                                                                            
 75                     response = r.json()                                                                                                        
 76                     s = True                                                                                                                                
 77                     for k in hope_result:                                                                                                            
 78                         ar = str(k) + ":" + str(response[k])                                                                                        
 79                         test_report["actual_result"].append(ar)                                                                                        
 80                         if type(hope_result[k]) == type(''):                                                                                                    
 81                             if hope_result[k] in response[k]:                                                                                                    
 82                                 s = s&True                                                                                                            
 83                             else:                                                                                                                
 84                                 s = s&False                                                                                                                    
 85                         else:                                                                                                                                    
 86                             if hope_result[k] == response[k]:                                                                                                        
 87                                 s = s&True                                                                                                                            
 88                             else:                                                                                                    
 89                                 s = s&False                                                                                                                
 90                     if s:                                                                                                        
 91                         test_report["test_result"] = "PASS"                                                                                                    
 92                     else:                                                                                                                                
 93                         test_report["test_result"] = "Fail"                                                                                                        
 94                                                                                                                                                                             
 95                 else:                                                                                                                                    
 96                     print(u'暫不支持該請求方式')                                                                                                                                    
 97                 test_reports.append(test_report)                                                                                                                        
 98                 end_time = time.clock()                                                                                                                    
 99                 str_time = '當前執行的用例:' + key + '_'*4 + '用例執行所用時間:' + str(end_time-                                                                                                    start_time) + 's'                                                                                                                                    
100                 logger.info(str_time)                                                                                                        
101             except:                                                                                                                                
102                 error_msg = sys.exc_info()                                                                                                                                        
103                 logger.error(error_msg)                                                                                                                
104                 continue                                                                                                                                    
105     except:                                                                                                                                    
106         error_msg = sys.exc_info()                                                                                                                
107         logger.error(error_msg)                                                                                                                    
108         continue                                                                                                                                            
109                                                                                                                                                                                                 
110 excelaction.creat_report(test_reports) #生成測試報告                                                                                        
111 sendreport() #發送測試報告                                                                                                        
 
五、具體使用
1、在配置文件做對應項目的基礎配置
[email] -- 郵箱相關配置
sender = ***@163.com -- 發件郵箱
receiver = ***@163.com -- 收件郵箱
smtpserver = smtp.163.com -- 發件郵箱服務器
username = ***@163.com -- 發件郵箱賬戶名
password = **** -- 發件郵箱密碼(用於第三方登錄的秘密)
 
[module] -- 模塊相關接口域名配置
passport = http://passport.XXX.com/ -- 對應模塊接口域名
 
[sign] -- 簽名相關的配置
api_key = XXX-XXX -- 生成簽名的key(填寫項目對應的key)
 
[params] -- 接口參數配置(配置公共參數)
Platform = 1 -- 根據對應項目配置對應的公共參數和對應值
 
2、在test_data文件夾內用json文件寫測試用例和對應參數 
"case1":{
    "name":"登錄接口_測試正常登錄",        -- 接口名稱(或者接口簡介)
    "module":"passport",                -- 接口所屬模塊
    "url":"/api/Passport/Login",            -- 接口地址(完整地址由模塊對應域名+該地址拼接)
      "method":"post",                    -- 接口請求方式
      "id":"1-001",                        -- 用例ID
    "data":{                            -- 接口請求參數(請求時由該參數加公共參數)
        "UserName":"XXX",                -- 接口請求參數(根據具體接口補充,如果接口需要token則需要加token關鍵字(值為空就行),接口請求時會自動根據參數生成Sign,如果想自己定義則需要加Sign關鍵字(值填寫自己定義的))
        },
    "assert":{                            -- 該條測試用例的斷言條件
        "Status":200,                    -- 具體的斷言條件,需要返回狀態為200
        "Message":"登錄成功"            -- 具體的斷言條件
        }
    }

 

3、配置好基礎配置和編寫完測試用例后,運行項目中的test.bat文件。運行完成后會在report文件夾內生成測試報告文件,在logs文件夾內會生成測試運行過程中的記錄日志和報錯日志(如果有)。


免責聲明!

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



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