目錄
一、接口自動化的意義(為什么做這個框架)
二、准備工作
三、框架流程及邏輯
四、各模塊介紹
五、具體使用
一、接口自動化的意義(為什么做這個框架)
新版本上線時之前版本的功能需要進行回歸測試,導致大量的重復性手工測試。引入自動化測試可以使用自動化技術代替部分手工的回歸性測試,解放更多人力做其它更有必要的事情。但目前項目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文件夾內會生成測試運行過程中的記錄日志和報錯日志(如果有)。