封裝一個讀取Excel的方法,可以讀取指定的表單里的內容,當需要多次讀取Excel時,只需呼叫封裝的類即可,不用重復撰寫代碼
1、封裝的excel類實作的需求是什么?
①每個方法都需要用到表單物件,加載Excel資料,所以要做初始化作業,加載Excel并選中指定表單
②讀取表頭資料,第1行case-id、title、請求data、作為key值
②讀取表頭以外的資料,即以串列形式,回傳從第2行開始的所有資料,并從第2行取對應values值
注意:excel表值默認為常規型別,讀取的excel表值只有兩種型別:string和float(如1.0在表中顯示1,實際程式處理成1.0, 而1.1在表中顯示的是1.1浮點型)

import xlrd
import re
from xlutils.copy import copy
import excels
class ExcelUtil():
def __init__(self, excelPath, sheetName="login"):
self.data = xlrd.open_workbook(excelPath)
self.table = self.data.sheet_by_name(sheetName)
self.keys = self.table.row_values(0) #獲取第一行作為key值
self.rowNum = self.table.nrows #獲取總行
self.colNum = self.table.ncols #獲取總列數
def dict_data(self):
if self.rowNum <= 1:
print("總行數小于1,請增加用例內容")
else:
r = []
for i in range(1, self.rowNum):
s = {}
# 從第二行取對應values值
values = self.table.row_values(i)#獲取第i行作為key值
for x in range(self.colNum):
value = values[x]
if isinstance(values[x], float): #判斷讀取的值是否為浮點型(float)
value = int(values[x])
if float(value) != values[x]: #判斷轉換后的整型值是否等于原來的值,例如判斷333是否等于333.0或者333是否等于333.1,
value = values[x] #如果不等,則不進行轉換,仍然保留原值
s[self.keys[x]] = str(value) #密碼不能為數值,要轉換成字串
r.append(s)
return r
以上封裝完畢,接下來就是呼叫了
2、呼叫封裝的Excel類
import unittest
from Utils.page import *
from excels import Excels
from page import Helper
import warnings
from ddt import *
import sheet_data as s
from excel_read_ddt import *
#用ddt讀取excle表格請求
filepath = r'D:\Python\ddt\data.xlsx'
@ddt()
class TestSolution(unittest.TestCase, Helper, ExcelUtil,Excels):
# 添加裝飾器-前置條件環境準備
@classmethod
def setUpClass(cls):
warnings.simplefilter('ignore', ResourceWarning)
# 添加裝飾器-后置條件進行關閉
@classmethod
def tearDownClass(cls):
pass
@data(*s.login)
def test_2_login(self,mydata):
"""登錄介面"""
r = self.post(mydata['url'],json.loads(mydata['data']))
print("登錄response:", r.json())
try:
self.assertEqual(json.loads(mydata['expected1']), r.status_code)#根據需求選擇斷言
self.assertEqual(int(mydata['expected2']), r.json()['code'])
self.assertIn(mydata['expected'], r.json()['message'])
3、封裝往Excel回寫資料的方法
①繼續在Excel類里面寫回寫方法
from xlutils.copy import copy
class ExcelUtil():
@staticmethod
def write_back(excelPath, sheetName,row,col,result):
'''
把結果寫進Excel并保存,此處注意要關閉Excel問卷才能成功寫入
excelPath:檔案路徑
sheetName:指定表單
row:指定寫入的行
col:指定寫入的列
result:寫入的結果
'''
wb= xlrd.open_workbook(excelPath)
cwb = copy(wb)
sheet = cwb.get_sheet(sheetName)
sheet.write(row, col, result)#寫入資料
cwb.save(excelPath) #保存資料
wb.close()#關閉Excel
4、呼叫封裝的Excel類,并執行回寫方法,可根據需求把回傳資訊和測驗結果寫進Excel指定表單的指定列
import unittest
from Utils.page import *
from excels import Excels
from page import Helper
import warnings
from ddt import *
from excel_read_ddt import *
#用ddt讀取excle表格
filepath = r'D:\Python\ddt\data.xlsx'
login = ExcelUtil(filepath,sheetName = "login").dict_data()
@ddt()
class TestSolution(unittest.TestCase, Helper, ExcelUtil,Excels):
# 添加裝飾器-前置條件環境準備
@classmethod
def setUpClass(cls):
warnings.simplefilter('ignore', ResourceWarning)
# 添加裝飾器-后置條件進行關閉
@classmethod
def tearDownClass(cls):
pass
@data(*login)
def test_2_login(self,mydata):
"""登錄介面"""
#準備測驗資料,并獲取實際結果,讀取的結果是整列,遍歷執行,有多少行就執行多少次用例
r = self.post(mydata['url'],json.loads(mydata['data']))
print("登錄response:", r.json())
#斷言
try:
self.assertEqual(json.loads(mydata['expected1']), r.status_code)
self.assertEqual(int(mydata['expected2']), r.json()['code'])
self.assertIn(mydata['expected'], r.json()['message'])
self.mylog("介面斷言:登錄介面回應狀態碼檢驗")
TestResult = 'PASS'
print('執行用例成功!')
except Exception as e:
#用例執行失敗后捕獲例外并處理,最終拋出例外
TestResult = 'Failed'
print('執行用例出錯:{0}'.format(e))
raise e
#不管是否執行成功,均要把相應的測驗結果寫入Excel
finally:
ExcelUtil.write_back(filepath, "login", int(mydata['case_id']), 7, r.json()['message'])
ExcelUtil.write_back(filepath,"login",int(mydata['case_id']),8,TestResult)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/400891.html
標籤:其他
