在上一節課程中,學習了根據數據驅動測試,當時測試接口需要的數據是存儲在excel文檔中的,讀取比較麻煩。下面是讀取excel文檔並獲取到接口測試必須數據和驗證結果數據的代碼。首先我們需要創建一個空的list來存放讀取到的數據,然后打開excel文檔,從第二行開始讀取用例內容(第一行是標題),獲取到每行內容后,只保留接口測試需要的數據(原來的excel文檔中第四列到第七列分別存放了url,請求方式,請求參數,預期結果),然后將這部分數據存入空的list中。這樣cases就是一個二維數據,這個list中包含了excel中每一行的用例數據,每個用例數據里面包含了四個元素。類似於[[url1,method1,req_data1,check1],[url2,method2,req_data2,check2]]。代碼中的apt_log是實例化的日志記錄類。但是讀取后,在使用這些元素進行接口測試時,還需要再次轉換,因為request模塊接口測試中的data是字典格式的。此處是list格式,屆時還需要轉換。
1 def get_case(self, file_path): 2 cases = [] # 存放所有的測試用例 3 if file_path.endswith('.xls') or file_path.endswith('.xlsx'): # 判斷路徑是否存在 4 try: 5 book = xlrd.open_workbook(file_path) 6 sheet = book.sheet_by_index(0) # 打開用例文件 7 for i in range(1, sheet.nrows): # 從第二行開始遍歷excel文件內容(第一行是標題) 8 row_data = sheet.row_values(i) # 獲取每行內容 9 cases.append(row_data[4:8]) # 在cases這個list中存每個用例的url,method,req_data,check 10 apt_log.info('共讀取%s條用例' % (len(cases))) # 檢查cases中的元素個數,日志記錄讀取了幾條用例 11 self.file_path = file_path # 既然讀取成功說明這個文件路徑是正確的,那么這邊定義下面寫exccel就可以直接使用了 12 except Exception as e: 13 apt_log.error('【%s】用例打開失敗,錯誤信息:%s' % (file_path, e)) 14 else: 15 apt_log.error('用例文件不合法,%s' % file_path) 16 return cases
可以看到讀取excel步驟比較繁瑣,需要各種格式轉化。但是yaml格式的文件簡化了讀取用例的步驟,讀取這個格式的文件會自動設置為字典模式。而且只要在yaml格式的文件中錄入數據時遵循了文件固定的格式,也可以自動讀取出雙層字典,有多個用例時可以產生一個list包裹所有的字典格式的用例數據。如果不添加符號"-",讀取時文件中的所有數據都會轉為字典格式,而添加后,文件數據讀取為list格式,但符號內換行鎖緊記錄的數據是字典格式。但是check數據中,直接在符號"-"后添加數據,這部分數據會讀取為list格式。
1 - # 添加減號可以把用例轉為list,每一部分是一個字典 2 url: /api/user/login 3 detail: 正常登陸 4 method: post 5 data: # 存放多層嵌套字典的方式 6 username: ********* 7 passwd: ******* 8 # headers: 9 # User-agent: Firefox 10 # cookies: 11 # sign: adfdsfnsdfnsd 12 check: # 這樣定義check可以用in來判斷測試是否通過 13 - sign 14 - userId 15 16 - 17 url: /api/user/login 18 detail: 密碼錯誤 19 method: post 20 data: 21 username: ********* 22 passwd: ********* 23 check: 24 - 密碼錯誤 25 26 - 27 url: /api/user/login 28 detail: 必填參數未填,不填密碼 29 method: post 30 data: 31 username: ********* 32 check: 33 - 必填參數未填
然后讀取yaml格式的文件,就像一般文件讀取一樣操作就可以了。
1 import yaml 2 3 4 f = open('login.yaml',encoding='utf-8') 5 res = yaml.load(f) 6 print(res)
讀取到的數據格式如下,可以看到一個list中包含了三個元素,每個元素都是字典格式的,這樣讀取數據就很方便了。
1 [{'url': '/api/user/login', 'check': ['sign', 'userId'], 'method': 'post', 'data': {'username': '*********', 'passwd': '*********'}, 'detail': '正常登陸'}, 2 {'url': '/api/user/login', 'check': ['密碼錯誤'], 'method': 'post', 'data': {'username': '*********', 'passwd': '*********'}, 'detail': '密碼錯誤'},
3 {'url': '/api/user/login', 'check': ['必填參數未填'], 'method': 'post', 'data': {'username': '*********'}, 'detail': '必填參數未填,不填密碼'}]