1、首先新建一個excel文檔
sheet1中的數據如下:
sheet2中的數據如下:
2、腳本如下,只校驗了get和post的單接口測試

''' 接口測試腳本, 讀取寫好的excel測試用例,然后根據excel中的內容進行調用, 判斷預期結果是否和返回報文中的值一致,並生成新的excel報告。 此腳本要求對python中操作excel的模塊xlrd熟悉 注意: excel的行和列在python中都是從0開始 xlrd模塊0.8版本后不支持以xlsx為后綴名文件,所以使用這個方法的時候,excel要用xls格式的,不然可能會導致保存的文件無法打開 ''' import requests, xlrd, time from xlutils.copy import copy # 復制表格必須用此copy # 讀取excel測試用例 def read_excel(file_path): ''' file_path:傳入的excel文件的絕對路徑 return:返回這個excel第一個sheet頁中的所有測試用例的list ''' try: book = xlrd.open_workbook(file_path) # 打開excel except Exception as e: print('路徑不在或者excel不正確/n', e) # 如果路徑不在或者excel不正確,返回報錯信息 else: sheet = book.sheet_by_index(1) # 取第一個sheet頁,即文檔的第一個工作表 rows = sheet.nrows # 取這個sheet頁(當前表)的所有行數 case_list = [] # 定義一個空列表,用來保存每一條case for i in range(rows): # 循環表中的每一行 if i != 0: # 去除表頭,因為是從0開始,所以表頭的索引是0 # 用例以行的維度添加到case_list中,每一行又是一個單獨的小列表,以單元格拆分成小列表中的每一項 case_list.append(sheet.row_values(i)) # 調用接口測試的函數,把存所有case的list和excel的路徑傳進去 interface_test(case_list) # 請求接口 # 請求接口並測試 def interface_test(case_list): test_msgs = [] # 存測試結果的list request_msgs = [] # 存請求報文的list responses = [] # 存返回報文的list for case in case_list: ''' 先遍歷excel中每一條case的值,然后根據對應的索引取到case中每個字段的值 ''' try: # 這里捕捉一下異常,如果excel格式不正確的話,就返回異常 method = case[4] # 請求方式 url = case[5] # 請求url param = case[6] # 入參 res_check = case[7] # 預期結果 except Exception as e: return ('測試用例格式不正確!%s' % e) if param == '': ''' 如果請求參數是空的話,請求報文就只有url,然后把請求報文存到請求報文list中 ''' new_url = url # 請求報文 request_msgs.append(new_url) else: ''' 如果請求參數不為空的話,請求報文就是url+?+參數,格式如下: https://testm.yoho8.com/apiuser/shop/integral?type=2,然后把請求報文存到請求報文list中 ''' ''' excel里面的如果有多個入參的話,參數是用;隔開,如:"a=1;b=2"這樣的,請求的時候多個參數要用&連接。格式如下: https://testm.yoho8.com/apiuser/shop/integral?type=2&id=1 要把;替換成&,所以調用了urlParam這個函數,把參數中的;替換成&,這個函數在下面手動定義的 ''' new_url = url + '?' + urlParam(param) # 請求報文,等同於請求中的Request URL request_msgs.append(new_url) if method.upper() == 'GET': ''' 如果是get請求就調用requests模塊的get方法,.text是獲取返回報文,並保存在返回報文的list中 ''' results = requests.get(new_url, headers=headers).text # 獲取返回報文 responses.append(results) # 保存返回的報文 ''' 獲取到返回報文之后需要根據【預期結果】去判斷測試是否通過, 調用查看結果方法read_res,把返回報文和預期結果傳進去,判斷是否通過,read_res方法在下面定義了。 ''' res = read_res(results, res_check) # 把返回報文賦值,然后判斷是否通過 else: ''' 如果是post請求,就調用requests模塊的post方法,.text是獲取返回報文,並保存在返回報文的list中 ''' results = requests.post(new_url, headers=headers).text responses.append(results) ''' 獲取到返回報文之后需要根據【預期結果】去判斷測試是否通過 調用查看結果方法read_res,把返回報文和預期結果傳進去,判斷是否通過,readRes方法在下面定義了。 ''' res = read_res(results, res_check) # 把返回報文賦值,然后判斷是否通過 if 'pass' in res: # 也可以用if res == 'pass',但是不確定res中是否有其他字符,用in相對保險 ''' 判斷測試結果,pass就是通過,fail就是失敗 ''' test_msgs.append('pass') else: test_msgs.append('fail') ''' 全部用例執行完之后,會調用copy_excel方法,把測試結果寫到excel中, 每一條用例的請求報文、返回報文、測試結果在上面都定義了一個list,來存每一條用例執行的結果, 把源excel用例的路徑和三個list傳進去調用即可,copy_excel方法在下面定義了 ''' copy_excel(file_path, test_msgs, request_msgs, responses) # 把測試結果寫到excel中 # 判斷返回報文和預期結果是否一致 def read_res(res, res_check): ''' res: 返回報文 res_check: 預期結果 :return: 通過或者不通過,不通過的話會把和預期不一致的參數返回 ''' ''' 接口返回報文是這樣的格式 {"id":"J_775682","p":275.00,"m":"458.00"} excel預期結果中的格式是 xx=11;xx=22 這樣的,所以要把返回報文改成xx=22這樣的格式 所以用到字符串替換,把返回報文中的":"和":替換成=,返回報文就變成 {"id=J_775682","p=275.00,"m=458.00"},這樣就和預期結果一樣了 可以用python自帶的json模塊來解析json串,但是有的返回的不是標准的json格式,處理起來比較麻煩,這里我就用字符串的方法了 ''' res = res.replace('":"', '=').replace('":', '=') ''' res_check是excel中的預期結果,是xx=11;xx=22這樣的 所以用split分割字符串,變成一個list['xx=1','xx=2']這樣的, 然后遍歷預期結果,判斷預期結果中的每個元素是否存在返回報文中, 如果每個元素都在返回報文中的話,就說明和預期結果一致 ''' res_check = res_check.split(';') for s in res_check: ''' 遍歷預期結果,如果當前字符串在返回報文中,什么都不做(pass就可以) 如果不存在的話,就返回錯誤信息和不一致的字段 全部都存在的話,就return pass,證明結果一致 因為res_check是從excel里面讀出來的,字符是Unicode類型的,python的字符串是str類型的, 所以要用str方法將res_check中的字符串強制轉換成str類型的 ''' if s in res: pass else: return '錯誤,返回參數和預期結果不一致' + str(s) return 'pass' # 參數中的符號轉換 def urlParam(param): ''' excel中的多個參數是使用;分割,請求時要轉換成xx=11&xx=2這樣,把參數中的;替換成& ''' return param.replace(';', '&') # 把測試結果寫到excel中 def copy_excel(file_path, test_msgs, request_msgs, responses): ''' file_path: 測試用例的路徑 test_msgs: 測試結果的list request_msgs: 請求報文的list responses: 返回報文的list ''' ''' 把請求報文、返回報文、測試結果寫到測試用例的excel中 因為xlrd模塊只能讀excel,不能寫,python中沒有一個模塊能直接操作已經寫好的excel 所以只能用xlutils模塊中的copy方法,copy一個新的excel,才能操作寫 ''' book = xlrd.open_workbook(file_path) # 打開原來的excel,獲取到這個book對象 new_book = copy(book) # 復制一個new_book new_sheet = new_book.get_sheet(1) # 然后獲取到這個復制的excel的第一個sheet頁,即第一張表 i = 1 for request_msg, response, test_msg in zip(request_msgs, responses, test_msgs): ''' 同時遍歷請求報文、返回報文和測試結果這3個大的list 然后把每一條case的執行結果寫到excel中,zip函數可以將多個list放在一起遍歷 因為第一行是表頭,所以從第二行開始寫,也就是索引位1的位置 i代表行,所以i賦值為1,然后每寫一條,就i+=1 請求報文、返回報文、測試結果分別在excel的8、9、11列,列是固定的,所以就寫死了 后面跟上要寫的值,因為excel用的是Unicode字符編碼,所以前面帶個u表示用Unicode編碼,否則會有亂碼 ''' new_sheet.write(i, 8, u'%s' % request_msg) # 如果i=1就表示第一行第8列寫入request_msg new_sheet.write(i, 9, u'%s' % response) new_sheet.write(i, 11, u'%s' % test_msg) i += 1 # 全部結果寫完之后在指定目錄保存一個以當前時間命名的測試結果文件,time.strftime()是格式化日期 new_book.save('/Users/chensihan/Desktop/%s_測試結果.xls' % time.strftime('%Y%m%d%H%M%S')) if __name__ == '__main__': ''' 調用的時候需要傳入一個excel,調用方式是 python xx.py xx.xls sys.argv[1]的意思是取傳入的第二個參數,也就是索引是1的, 第一個是這個python文件的文件名,如果不傳入參數運行的話,會提示錯誤,如果正確的話, 會調用讀excel的程序,執行用例,運行完成后,會打印執行完畢 ''' file_path = '/Users/chensihan/Desktop/test.xlsx' # excel的絕對路徑 headers = {'content-type': 'application/json', # 調用接口時需要傳入的headers 'channelcode': 'SH002', 'devicetype': 'miniProgram', 'token': '914abd88d5e84838aa977b2b77c5fad6'} read_excel(file_path) print('執行完畢!!!') ''' 1、 寫好excel的用例模板,需要有的字段: 項目、用例id、接口名稱、用例描述、請求方式、url請求地址、請求參數(多個的參數話用;分號隔開)、 結果驗證(多個的參數話用;分號隔開)、請求報文、返回報文、測試人員、測試結果 2、讀取Excel中的內容 3、根據excel中的 請求url和參數 拼接請求報文,調用接口,並保存返回報文 4、讀取返回報文,和預期結果對比,不一致把請求報文、返回報文和測試結果寫到復制的測試用例的excel中。 '''
結束。