在測試接口時,一個接口會先寫好測試用例,這個用例主要針對功能,傳入參時考慮到各種場景,正常的,異常的,如:參數缺省,參數傳一個六位數字寫用例時考慮邊界情況等。
一個接口設計用例時有可能會十幾條到幾十條都有可能,多個接口就有很多了,這時候我們可以考慮到自動化測試接口。
采用數據驅動方式,把數據寫在excel表格中,代碼做封裝,用數據驅動測試,兩部分相互獨立。python中用ddt模塊來做數據驅動,代碼簡單好維護,調試也方便。
自己寫的框架,結構如下:

common:公共層,放讀取表格數據,發送request請求,生成測試報告的.py文件
data:放excel數據
report:放測試報告
testcase:寫測試用例
run_main.py:運行用例並生成測試報告
HTMLTestRunner.py文件是從網上下載的模板,可以直接使用。
readExcel.py讀取表格數據,返回的是一個列表,里面的數據以字典格式存放,通過索引得到字典然后取字典的值
1 #! /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 """ 5 @version: 1.0 6 @author: fky 7 @site: 8 @software: PyCharm 9 @file: readExcel.py 10 @time: 2018/3/24 9:37 11 """ 12 import xlrd 13 14 class ReadExcel(): 15 def readExcel(fileName,SheetName="Sheet1"): 16 data = xlrd.open_workbook(fileName) 17 table = data.sheet_by_name(SheetName) 18 19 #獲取總行數、總列數 20 nrows = table.nrows 21 ncols = table.ncols 22 if nrows > 1: 23 #獲取第一行的內容,列表格式 24 keys = table.row_values(0) 25 #print(keys) 26 27 listApiData = [] 28 #獲取每一行的內容,列表格式 29 for col in range(1,nrows): 30 values = table.row_values(col) 31 # keys,values這兩個列表一一對應來組合轉換為字典 32 api_dict = dict(zip(keys, values)) 33 #print(api_dict) 34 listApiData.append(api_dict) 35 36 return listApiData 37 else: 38 print("表格未填寫數據") 39 return None 40 41 if __name__ == '__main__': 42 s = ReadExcel.readExcel("E:\\fukun_apitest\\data\\yoyo_apiTest.xlsx","Sheet1") 43 print(s)
sendRequest.py中的文件,讀取表格的數據作為request請求的參數:
# -*- coding:utf-8 -*- """ @version: 1.0 @author: fky @site: @software: PyCharm @file: sendRequests.py @time: 2018/3/24 11:40 """ from common.readExcel import ReadExcel import requests import json class SendRequests(): def sendRequests(self,s,apiData): try: #從讀取的表格中獲取響應的參數作為傳遞 method = apiData["method"] url = apiData["url"] if apiData["params"] == "": par = None else: par = eval(apiData["params"]) if apiData["headers"] == "": h = None else: h = apiData["headers"] if apiData["body"] == "": body_data = None else: body_data = eval(apiData["body"]) type = apiData["type"] v = False if type == "json": body = json.dumps(body_data) if type == "data": body = body_data else: body = body_data #發送請求 re = s.request(method=method,url=url,headers=h,params=par,data=body,verify=v) return re except Exception as e: print(e) if __name__ == '__main__': s = requests.session() testData = ReadExcel.readExcel("apiTest.xlsx", "Sheet1") response = SendRequests().sendRequests(s,testData[3]) print(response.json())
用例部分(case_01_yoyo.py)
#! /usr/bin/env python # -*- coding:utf-8 -*- """ @version: 1.0 @author: fky @site: @software: PyCharm @file: case_01.py @time: 2018/3/16 10:58 """ import unittest import requests from ddt import ddt,data,unpack from common.sendRequests import SendRequests from common.readExcel import ReadExcel import os # path = os.path.dirname(os.getcwd())+"\\data\\yoyo_apiTest.xlsx" # print(path) testData = ReadExcel.readExcel("E:\\fukun_apitest\\data\\yoyo_apiTest.xlsx", "Sheet1") @ddt class Test1(unittest.TestCase): def setUp(self): self.s = requests.session() def tearDown(self): pass @data(*testData) def test_yoyo_api(self,data): re = SendRequests().sendRequests(self.s, data) #print(re.json()) #切割字符串取后面的部分 expect_result1 = data["expect_result"].split(":")[1] #轉換為字符串 expect_result = eval(expect_result1) #斷言 self.assertEqual(re.json()["origin"], expect_result, "返回錯誤,實際結果是%s"%re.json()["origin"]) if __name__ == '__main__': unittest.main()
run_main.py,跑用例最后生成測試報告:
#! /usr/bin/env python # -*- coding:utf-8 -*- """ @version: 1.0 @author: fky @site: @software: PyCharm @file: run_main.py @time: 2018/3/16 10:58 """ import unittest import time import os from common.HTMLTestRunner_jpg import HTMLTestRunner def run_case(dir = "testcase"): case_dir = os.getcwd() + "\\" + dir print(case_dir) test_case = unittest.TestSuite() discover = unittest.defaultTestLoader.discover(case_dir,pattern="case_01_yoyo.py",top_level_dir=None) return discover if __name__ == '__main__': current_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time())) report_path =os.getcwd() + "\\report\\" + current_time + '.html' # 生成測試報告的路徑 print(report_path) fp = open(report_path, "wb") runner = HTMLTestRunner(stream=fp, title=u"自動化測試報告", description=u'yoyo接口',verbosity=2) runner.run(run_case()) fp.close()
報告結果

--------------------------------------------------------------------------------------------
更新於2019-12-16日下午18:03
不好意思好久沒看微博,今天才看見有人提問了,所有重新檢查了下項目文件
case_02_qq.py 這個用例經測試是可以成功執行的,各位網友可以自行到github下載或克隆使用:
github項目地址:https://github.com/ctnyan/fukun_apitest
