使用python進行接口測試時經常須要接口用例測試數據、斷言接口功能、驗證接口響應狀態等,若是大量的接口測試用例腳本都將接口測試用例數據寫在腳本文件中,這樣寫出來整個接口測試用例腳本代碼將看起來很冗餘和難以清晰的閱讀以及維護,試想若是全部的接口測試數據都寫在代碼中,接口參數或者測試數據須要修改,那不得每一個代碼文件都要一一改動?。所以,這種不高效的模式不是咱們想要的。因此,在自動化測試中就有個重要的思想:測試數據和測試腳本分離,也就是測試腳本只有一份,其中須要輸入數據的地方會用變量來代替,而後把測試輸入數據單獨放在一個文件中,這個存放測試輸入數據的文件,一般是表格的形式或者其餘格式文件,如excel文件、json文件、xml文件、txt文本文件等等。在python進行接口自動化測試時,爲了方便管理和存儲測試用例數據,通常將測試數據編寫存儲在excel文件中,測試腳本經過讀取excel文件來實現測試數據加載,並運行得出測試用例數據執行的結果,並回寫測試結果到excel文件中,這樣就實現了測試腳本和數據的分離。而python操做excel文件的讀寫,這裏須要安裝並引入第三方模塊:xlrd和xlwt以及xlutils,xlrd爲讀取excel模塊,xlwt爲向excel寫數據的模塊,xlutils能夠複製excel並修改excel中的數據。下面就具體介紹xlrd和xlwt操做excel文件提供的通用方法和技巧,以及xlutils如何複製和修改excel,達到操做excel讀寫的目的。java
1.使用pip安裝python
pip install xlrd pip install xlwt pip install xlutils
2.在PyCharm中安裝json
直接檢索須要安裝的模塊名稱便可,如xlrd:api
新建一個excel文件,文件名稱:excel_test.xlsx,文件編輯有兩個sheet表,內容以下:app
sheet1:post
sheet2:測試
(1)打開excel文件,獲取excel的sheet名url
編輯以下代碼:3d
import xlrd file = xlrd.open_workbook("excel_test.xlsx") all_sheet = file.sheet_names() # 獲取全部的工做簿名 sheet_name1 = file.sheet_names()[0] # 經過sheet下標獲取,第一個sheet下標爲0 sheet_name2 = file.sheet_by_index(0).name # 經過sheet索引獲取sheet名 print(all_sheet) print(sheet_name1) print(sheet_name2) ----------------------------------------- # 返回結果 ['員工信息表', 'api測試用例'] 員工信息表 員工信息表
(2)獲取sheet工做表頁的對象excel
代碼示例:
import xlrd file = xlrd.open_workbook("excel_test.xlsx") sheet_name1 = file.sheet_names()[0] sheet1_obj = file.sheet_by_name(sheet_name1) # 經過sheet名獲取sheet對象 sheet2_obj = file.sheet_by_index(1) # 經過sheet索引獲取sheet對象 print(sheet1_obj) print(sheet2_obj) ------------------------------------ # 返回結果 <xlrd.sheet.Sheet object at 0x0000000002AA09B0> <xlrd.sheet.Sheet object at 0x0000000002AA0978>
(3)獲取sheet工做表的行、列數,整行、整列數據,具體的單元格數據
代碼示例:
import xlrd file = xlrd.open_workbook("excel_test.xlsx") sheet = file.sheet_by_index(0) # 經過sheet索引獲取sheet對象 nrows = sheet.nrows # 獲取行數 ncols = sheet.ncols # 獲取列數 nrows_data = sheet.row_values(1) # 獲取第二行數據,返回的是列表 ncols_data = sheet.col_values(0) # 獲取第一列數據,返回的是列表 cell = sheet.cell(1,2) # 獲取單元格數據,如第二行,第三列數據 print(nrows) print(ncols) print(nrows_data) print(ncols_data) print(cell) ------------------------------- # 返回結果 6 5 ['王五', '男', 32883.0, 'java開發工程師', 233.0] ['姓名', '王五', '李四', '張三', '小紅', '小明'] xldate:32883.0 # 這裏日期數據直接返回成浮點數了
常見讀取excel不一樣數據類型的返回問題,如讀取日期格式的數據
通常使用sheet.cell(rowx,colx)方法獲取單元格數據,單元格數據類型判斷能夠使用以下代碼:
print(sheet.cell(1,2).ctype) ------------ # 返回日期數據的結果 3
注:ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
讀取單元格日期數據爲浮點數的處理方式:
代碼以下:
import xlrd from datetime import date file = xlrd.open_workbook("excel_test.xlsx") sheet = file.sheet_by_index(0) # 經過sheet索引獲取sheet對象 nrows_data = sheet.row_values(1) # 獲取第二行數據,返回的是列表 ncols_data = sheet.col_values(0) # 獲取第一列數據,返回的是列表 cell = sheet.cell(1,2) # 獲取單元格數據,如第二行,第三列數據,返回的是浮點數 data_value = xlrd.xldate_as_tuple(sheet.cell_value(1,2) ,file.datemode) # xldate_as_tuple()方法獲得日期數據年月日時分秒的值並返回爲元組 datatime2 = date(*data_value[:3]).strftime('%Y/%m/%d') # 截取元組中的前三位,即年月日的值傳給data,並進行時間格式化 print(cell) print(data_value) print(datatime2) ----------------------- # 返回結果 xldate:32883.0 (1990, 1, 10, 0, 0, 0) 1990/01/10
所以在讀取excel單元格數據,如遇到是日期格式的數據,能夠加上以下代碼判斷並處理:
if (sheet.cell(row,col).ctype == 3): date_value = xlrd.xldate_as_tuple(sheet.cell_value(row,col),file.datemode) date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
xlwt通常用於向excel文件寫入數據,簡單示例以下:
import xlwt workbook = xlwt.Workbook(encoding = 'utf-8') # 建立工做簿 sheet = workbook.add_sheet('api_test') # 添加一個sheet data = sheet.write(0,0,'test') # 向第一行第一列寫入數據:test workbook.save('book.xlsx') # 保存到book.xlsx中
運行完成後會在該py文件的同級目錄下生成一個book.xlsx的excel文件,並新增了api_test的sheet表名,第一行第一列寫入數據:test
向excel寫入數據時,能夠設置單元格長寬、單元格合併、寫入時間格式數據以及添加超連接等
代碼示例:
import xlwt import datetime workbook = xlwt.Workbook(encoding = 'utf-8') # 建立工做簿 sheet = workbook.add_sheet('api_test') # 添加一個sheet data = sheet.write(4,0,'test') sheet.col(0).width = 5000 # 設置單元格寬度 style = xlwt.XFStyle() # 初始化表格樣式 style.num_format_str = 'M/D/YY' # 設置時間格式,如:M/D/YY sheet.write(5, 1, datetime.datetime.now(), style) # 寫入時間格式數據 # 合併多列和和並多行 # 表示合併的行數是:按行索引,從0行到第0行,按列索引從0列到第3列,合併後並寫入數據:test1 sheet.write_merge(0, 0, 0, 3, 'test1') # 表示合併的行數是:按行索引,從1行到第2行,按列索引從0列到第3列,合併後並寫入數據:test2 sheet.write_merge(1, 2, 0, 3, 'test2') # 向單元格添加超連接 sheet.write(6, 0, xlwt.Formula('HYPERLINK("https://www.baidu.com/";"baidu")')) workbook.save('book.xlsx') # 保存到book.xlsx中
運行後輸出excel效果以下:
(1)拷貝excel表格
xlutils模塊下的copy能夠複製拷貝excel文件,代碼示例:
import xlrd from xlutils.copy import copy excel_file = xlrd.open_workbook("book.xlsx") new_file = copy(excel_file) # 拷貝文件對象 new_file.save("book1.xlsx") # 保存爲excel文件
運行以上代碼會在同級目錄下生成一個book1.xlsx的excel文件,該文件和book.xlsx同樣,只是文件名稱不同而已,也就是複製excel文件了
(2)修改excel文件內容
除了copy爲其餘excel文件外,也能夠直接copy文件修改後,保存爲同名的文件,那修改的內容將直接覆蓋原excel文件,達到修改的目的
示例:
import xlrd from xlutils.copy import copy excel_file = xlrd.open_workbook("book.xlsx") new_file = copy(excel_file) sheet = new_file.get_sheet(0) # 獲取表格的第一個sheet sheet.write(0,1,"測試") # 第一行第二列寫入:測試 sheet.write(1,1,"測試1") # 第二行第二列寫入:測試1 new_file.save("book.xlsx")
運行後book.xlsx表會修改更新
經過上面介紹,基本具有使用xlrd、xlwt、xlutils模塊進行excel文件數據讀取和向excel文件中寫入數據,在進行接口測試時,咱們說到須要:測試數據和測試腳本分離,後續的接口測試用例數據,咱們統一寫入excel表格中,而後經過操做excel來讀取測試數據並將測試結果回填到excel中。所以,我們須要對向excel讀取數據和向excel寫入數據的操做進行封裝。
咱們操做上面的api測試用例這個sheet,封裝讀取excel數據的類,代碼示例:
from xlrd import open_workbook class Readexcel(): def excel_data_list(self, filename, sheetname): ''' :param filename: excel文件名稱 :param sheetname: excel中表格sheet名稱 :return: data_list ''' data_list = [] wb = open_workbook(filename) # 打開excel sh = wb.sheet_by_name(sheetname) # 定位工做表 header = sh.row_values(0) # 獲取標題行的數據 for i in range(1, sh.nrows): # 跳過標題行,從第二行開始獲取數據 col_datas = dict(zip(header, sh.row_values(i))) # 將每一行的數據,組裝成字典 data_list.append(col_datas) # 將字典添加到列表中 ,列表嵌套字典,每一個元素就是一個字典 return data_list if __name__ == '__main__': Readexcel()
上面代碼封裝了讀取excel數據的類,將每一行數據讀取出來組裝成字典並添加到列表中
實例化運行:
data_list = Readexcel().excel_data_list('excel_test.xlsx','api測試用例') print(data_list) ----------------------- # 返回結果 [ {'module': '視頻安防', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/recep/tv/list', 'id': 1.0, 'params': '{ "queryMsg":"","regionCode":"","devtypeCode":"","online":"","offset":"","limit":1,"type":""}', 'method': 'get', 'actual_res': '', 'data': '', 'expect_res': '', 'test_res': '', 'case_name': '分頁查詢視頻安防設備列表', 'files': ''}, {'module': '平臺管理', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/manage/appsys/info', 'id': 2.0, 'params': '', 'method': 'post', 'actual_res': '', 'data': '{"appName": "hahh","appId": "34434343","appUrl": "http://12306.com","appCode": "89","remark":""}', 'expect_res': '{"code": 200,"errMsg": ""}', 'test_res': '', 'case_name': '應用管理-單個應用系統添加', 'files': ''}, {'module': '平臺管理', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/manage/appsys/info/upappid/89', 'id': 3.0, 'params': '', 'method': 'put', 'actual_res': '', 'data': '{"appId": "3232327676888"}', 'expect_res': '{"code": 200,"errMsg": ""}', 'test_res': '', 'case_name': '應用管理-修改應用appId', 'files': ''}, {'module': '平臺管理', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/manage/devtype/list', 'id': 4.0, 'params': '{ "queryMsg":"15002","offset":"","limit":""}', 'method': 'get', 'actual_res': '', 'data': '', 'expect_res': '', 'test_res': '', 'case_name': '設備分類-分頁獲取設備類型', 'files': ''} ]
封裝向excel寫入數據的類,代碼示例:
from xlutils.copy import copy from xlrd import open_workbook class Write_excel(): def write_result(self, filename, row, col1,col2,actual_res, test_res,sheet_name): ''' :param filename: 文件名 :param row: 要寫回的行 :param col1: 要寫回的列 :param col2: 要寫回的列 :param actual_res: 實際結果 :param test_res: 測試結果 :pass/failed :param sheet_name:指定的sheet表索引 :return: ''' old_workbook = open_workbook(filename) # 將已存在的excel拷貝進新的excel new_workbook = copy(old_workbook) # 獲取sheet new_worksheet = new_workbook.get_sheet(sheet_name) # 第n個sheet,0表示第一個sheet # 寫入數據 new_worksheet.write(row, col1, actual_res) new_worksheet.write(row, col2, test_res) # 保存 new_workbook.save("book.xlsx") if __name__ == '__main__': Write_excel()
這樣咱們就完成了讀寫excel操做的封裝,後續接口測試數據的讀取和寫入就依靠這兩個類了。