在ui自動化中,經常會用到數據的存儲和讀取,這里主要介紹一下如何處理測試中經常用到的數據。
一、類變量
一般習慣把元素定位地址作為類變量存儲,因為這樣對于調試糾錯比較方便,書寫調用也較簡單。
1.1本類中調用類變量
例如:Demo類中,在類下申請一個變量name,如果這個類中的方法要引用name,需要self.name這樣的格式調用。
demo_class.py
class Demo():
? ? name = "川石學院"
? ? def print_name(self):
? ? ? ? print(self.name)
1.2調用其他類的類變量
如果其他class類要引用,那需要先import這個類,然后再使用Demo.name這種形式調用。
other_class.py
from demo_class import Demo
class Demo2():
? ? print(Demo.name)
二、yaml配置文件
這里引用了pyyaml這個庫,用來讀取.yaml格式的文件。
2.1yaml文件的格式:
1,通過縮進和冒號來控制層級范圍
2,如果有中文需要加引號
3,注釋符號為:#
如下所示:
account:
# 我是注釋
? user_1:
? ? username:
? ? ? "川石學院"
? ? password:
? ? ? meiyoumima
2.2yaml的安裝與引用:
命令行安裝:pip install pyyaml
代碼導入庫:import yaml
2.3讀取yaml文件:
大致步驟是:
打開文件、載入文件、讀取文件、關閉文件
需要注意的一點是:打開文件時,我設置了encoding格式,因為發現就算是加了引號的中文,部分字符仍然無法正確編碼讀取
import yaml
# 打開文件
fr = open("D:/config.yaml", 'r', encoding='gb18030', errors='ignore')
# 載入文件格式
data = yaml.load(fr)
# 讀取文件層級
# 下面兩種方法都可以獲取到信息值,區別是通過get方法獲取值時,如果key鍵不存在會返回None,通過索引[]來獲取值時,key鍵不存在會報錯。
# get_user = data["account"]["user_1"]["username"]
get_user = data.get("account").get("user_1").get("username")
print(get_user)
# 關閉文件
fr.close()
對于yaml文件讀取出來的數據是字典的格式,在讀取yaml時,有時想要查找的數據藏得層級很深,要查找的話要寫很多層級,將來如果層級變動又要做出調整,所以這里使用了遞歸寫一個方法,來通過任意一個層級名稱,來獲取層級下的所有值。
關于遞歸
def get_any_key_info(key_name="", yaml_data=None):
? ? # for循環字典這一層的所有key值
? ? for i in list(yaml_data.keys()):
? ? ? ? # 如果當前的key是我們要找的
? ? ? ? if i == key_name:
? ? ? ? ? ? return yaml_data[i]
? ? ? ? # 如果當前的key不是我們找的key,并且是字典類型
? ? ? ? elif type(yaml_data[i]) == dict:
? ? ? ? ? ? ? ? # 使用遞歸方法,查找下一層的字典
? ? ? ? ? ? ? ? recursion = get_any_key_info(key_name, yaml_data[i])
? ? ? ? ? ? ? ? # 每層遞歸要返回一個值,否則函數默認返回None
? ? ? ? ? ? ? ? return recursion
三、excel文件
excel文件一般適合更加復雜的場景,如果只是簡單的記錄配置、數據,我認為還是類變量和yaml這種可以在python編輯器中讀取編輯的類型更適合些。
3.1excel操作類的安裝和引用:
引用庫介紹:
xlrd:讀取excel
xlwt:寫入excel
安裝:
pip install xlrd
pip install xlwt
引用:
import xlrd
import xlwt
3.2 讀取excel的方法
文件的讀取
xlrd.open_workbook(file_path)
file_path:excel文件路徑
獲取excel文件的sheet名:
sheet_names()
根據sheet名/索引獲取sheet表數據
sheet_by_index(index)
index:索引(從0開始)
sheet_by_name(name)
name:sheet表名
獲取sheet表中行數、列數
nrows? # 行數
ncols? # 列數
根據行、列索引獲取行、列數據(索引從0開始)
獲取某行數據
row_values(index)
獲取某列數據
col_values(index)
根據坐標位置獲取單元格數據(坐標是從0開始)
cell(row, col).value
row:行的索引
col:列的索引
3.3關于讀取sheet表,自己封裝的方法。
基于上述的方法和功能,我在想,一般的讀取excel表格,都是列名和數據對應的,所以寫了如下方法,可以把每一行的數據作為一個字典,通過列名來對應,每行作為一個字典來存儲在整體的列表中。
def excel_table_byname(file_path, colnameindex=0, sheet_name='Sheet1'):
? ? """
? ? 根據名稱獲取Excel表格中的數據
? ? 參數
? ? file:Excel文件路徑
? ? colnameindex:表頭列名所在行的索引
? ? sheet_index:Sheet1名稱
? ? 返回:列表,每個列表元素為列名對應的字典
? ? """
? ? data = xlrd.open_workbook(file_path)
? ? table = data.sheet_by_name(sheet_name)
? ? nrows = table.nrows? # 行數
? ? ncols = table.ncols? # 列數
? ? # 列名行
? ? colnames = table.row_values(colnameindex)
? ? dic_list = []
? ? # 從第一行到最后一行循環
? ? for rown in range(1, nrows):
? ? ? ? row = table.row_values(rown)
? ? ? ? if row:
? ? ? ? ? ? app = {}
? ? ? ? ? ? # 單行數據組合為字典
? ? ? ? ? ? for i in range(ncols):
? ? ? ? ? ? ? ? app[colnames[i]] = row[i]
? ? ? ? ? ? dic_list.append(app)
? ? return dic_list
3.4實例演示
import xlrd
# 讀取載入文件
file = xlrd.open_workbook("F:/test.xlsx")
# 獲取所有sheet名
print("sheet名稱:%s" % file.sheet_names())
# 獲取sheet
sheet1 = file.sheet_by_name("表1")
print(sheet1)
# 獲取sheet中行列數
print("列數:%s" % sheet1.ncols)
print("行數:%s" % sheet1.nrows)
# 獲取行、列數據
print("第1行數據:%s" % sheet1.row_values(0))
print("第1列數據:%s" % sheet1.col_values(0))
# 獲取單元格數據
print("第2行、第2列數據:%s" % sheet1.cell(1, 1).value)
def excel_table_byname(file_path, colnameindex=0, sheet_name='Sheet1'):
? ? """
? ? 根據名稱獲取Excel表格中的數據
? ? 參數
? ? file:Excel文件路徑
? ? colnameindex:表頭列名所在行的索引
? ? sheet_index:Sheet1名稱
? ? 返回:列表,每個列表元素為列名對應的字典
? ? """
? ? data = xlrd.open_workbook(file_path)
? ? table = data.sheet_by_name(sheet_name)
? ? nrows = table.nrows? # 行數
? ? ncols = table.ncols? # 列數
? ? # 列名行
? ? colnames = table.row_values(colnameindex)
? ? dic_list = []
? ? # 從第一行到最后一行循環
? ? for rown in range(1, nrows):
? ? ? ? row = table.row_values(rown)
? ? ? ? if row:
? ? ? ? ? ? app = {}
? ? ? ? ? ? # 單行數據組合為字典
? ? ? ? ? ? for i in range(ncols):
? ? ? ? ? ? ? ? app[colnames[i]] = row[i]
? ? ? ? ? ? dic_list.append(app)
? ? return dic_list
# 讀取單個sheet表數據
print("讀取excel數據....")
data_list = excel_table_byname(file_path="F:/test.xlsx",sheet_name="表1")
print(data_list)
for x in data_list:
? ? print(x)
結果:
sheet名稱:['表1']
<xlrd.sheet.Sheet object at 0x0000029770E44390>
列數:3
行數:6
第1行數據:['測試序號', '測試功能', '測試結果']
第1列數據:['測試序號', '1', '2', '3', '4', '5']
第2行、第2列數據:首頁
讀取excel數據。。。
[{'測試序號': '1', '測試結果': '成功', '測試功能': '首頁'}, {'測試序號': '2', '測試結果': '失敗', '測試功能': '流程'}, {'測試序號': '3', '測試結果': '成功', '測試功能': '資金'}, {'測試序號': '4', '測試結果': '成功', '測試功能': '賬戶'}, {'測試序號': '5', '測試結果': '失敗', '測試功能': '服務'}]
{'測試序號': '1', '測試結果': '成功', '測試功能': '首頁'}
{'測試序號': '2', '測試結果': '失敗', '測試功能': '流程'}
{'測試序號': '3', '測試結果': '成功', '測試功能': '資金'}
{'測試序號': '4', '測試結果': '成功', '測試功能': '賬戶'}
{'測試序號': '5', '測試結果': '失敗', '測試功能': '服務'}