在ui自動化中围小,經(jīng)常會用到數(shù)據(jù)的存儲和讀取昵骤,這里主要介紹一下如何處理測試中經(jīng)常用到的數(shù)據(jù)。
一肯适、類變量
一般習慣把元素定位地址作為類變量存儲变秦,因為這樣對于調(diào)試糾錯比較方便,書寫調(diào)用也較簡單框舔。
1.1本類中調(diào)用類變量
例如:Demo類中蹦玫,在類下申請一個變量name,如果這個類中的方法要引用name刘绣,需要self.name這樣的格式調(diào)用樱溉。
demo_class.py
class Demo():
? ? name = "川石學院"
? ? def print_name(self):
? ? ? ? print(self.name)
1.2調(diào)用其他類的類變量
如果其他class類要引用,那需要先import這個類纬凤,然后再使用Demo.name這種形式調(diào)用福贞。
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
代碼導(dǎo)入庫:import yaml
2.3讀取yaml文件:
大致步驟是:
打開文件、載入文件猖任、讀取文件你稚、關(guān)閉文件
需要注意的一點是:打開文件時,我設(shè)置了encoding格式,因為發(fā)現(xiàn)就算是加了引號的中文刁赖,部分字符仍然無法正確編碼讀取
import yaml
# 打開文件
fr = open("D:/config.yaml", 'r', encoding='gb18030', errors='ignore')
# 載入文件格式
data = yaml.load(fr)
# 讀取文件層級
# 下面兩種方法都可以獲取到信息值搁痛,區(qū)別是通過get方法獲取值時,如果key鍵不存在會返回None宇弛,通過索引[]來獲取值時鸡典,key鍵不存在會報錯。
# get_user = data["account"]["user_1"]["username"]
get_user = data.get("account").get("user_1").get("username")
print(get_user)
# 關(guān)閉文件
fr.close()
對于yaml文件讀取出來的數(shù)據(jù)是字典的格式枪芒,在讀取yaml時彻况,有時想要查找的數(shù)據(jù)藏得層級很深,要查找的話要寫很多層級舅踪,將來如果層級變動又要做出調(diào)整纽甘,所以這里使用了遞歸寫一個方法,來通過任意一個層級名稱抽碌,來獲取層級下的所有值悍赢。
關(guān)于遞歸
def get_any_key_info(key_name="", yaml_data=None):
? ? # for循環(huán)字典這一層的所有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])
? ? ? ? ? ? ? ? # 每層遞歸要返回一個值左权,否則函數(shù)默認返回None
? ? ? ? ? ? ? ? return recursion
三、excel文件
excel文件一般適合更加復(fù)雜的場景破婆,如果只是簡單的記錄配置涮总、數(shù)據(jù),我認為還是類變量和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()
根據(jù)sheet名/索引獲取sheet表數(shù)據(jù)
sheet_by_index(index)
index:索引(從0開始)
sheet_by_name(name)
name:sheet表名
獲取sheet表中行數(shù)、列數(shù)
nrows? # 行數(shù)
ncols? # 列數(shù)
根據(jù)行烹笔、列索引獲取行裳扯、列數(shù)據(jù)(索引從0開始)
獲取某行數(shù)據(jù)
row_values(index)
獲取某列數(shù)據(jù)
col_values(index)
根據(jù)坐標位置獲取單元格數(shù)據(jù)(坐標是從0開始)
cell(row, col).value
row:行的索引
col:列的索引
3.3關(guān)于讀取sheet表,自己封裝的方法谤职。
基于上述的方法和功能饰豺,我在想,一般的讀取excel表格允蜈,都是列名和數(shù)據(jù)對應(yīng)的冤吨,所以寫了如下方法,可以把每一行的數(shù)據(jù)作為一個字典饶套,通過列名來對應(yīng)漩蟆,每行作為一個字典來存儲在整體的列表中。
def excel_table_byname(file_path, colnameindex=0, sheet_name='Sheet1'):
? ? """
? ? 根據(jù)名稱獲取Excel表格中的數(shù)據(jù)
? ? 參數(shù)
? ? file:Excel文件路徑
? ? colnameindex:表頭列名所在行的索引
? ? sheet_index:Sheet1名稱
? ? 返回:列表妓蛮,每個列表元素為列名對應(yīng)的字典
? ? """
? ? data = xlrd.open_workbook(file_path)
? ? table = data.sheet_by_name(sheet_name)
? ? nrows = table.nrows? # 行數(shù)
? ? ncols = table.ncols? # 列數(shù)
? ? # 列名行
? ? colnames = table.row_values(colnameindex)
? ? dic_list = []
? ? # 從第一行到最后一行循環(huán)
? ? for rown in range(1, nrows):
? ? ? ? row = table.row_values(rown)
? ? ? ? if row:
? ? ? ? ? ? app = {}
? ? ? ? ? ? # 單行數(shù)據(jù)組合為字典
? ? ? ? ? ? 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中行列數(shù)
print("列數(shù):%s" % sheet1.ncols)
print("行數(shù):%s" % sheet1.nrows)
# 獲取行怠李、列數(shù)據(jù)
print("第1行數(shù)據(jù):%s" % sheet1.row_values(0))
print("第1列數(shù)據(jù):%s" % sheet1.col_values(0))
# 獲取單元格數(shù)據(jù)
print("第2行、第2列數(shù)據(jù):%s" % sheet1.cell(1, 1).value)
def excel_table_byname(file_path, colnameindex=0, sheet_name='Sheet1'):
? ? """
? ? 根據(jù)名稱獲取Excel表格中的數(shù)據(jù)
? ? 參數(shù)
? ? file:Excel文件路徑
? ? colnameindex:表頭列名所在行的索引
? ? sheet_index:Sheet1名稱
? ? 返回:列表,每個列表元素為列名對應(yīng)的字典
? ? """
? ? data = xlrd.open_workbook(file_path)
? ? table = data.sheet_by_name(sheet_name)
? ? nrows = table.nrows? # 行數(shù)
? ? ncols = table.ncols? # 列數(shù)
? ? # 列名行
? ? colnames = table.row_values(colnameindex)
? ? dic_list = []
? ? # 從第一行到最后一行循環(huán)
? ? for rown in range(1, nrows):
? ? ? ? row = table.row_values(rown)
? ? ? ? if row:
? ? ? ? ? ? app = {}
? ? ? ? ? ? # 單行數(shù)據(jù)組合為字典
? ? ? ? ? ? for i in range(ncols):
? ? ? ? ? ? ? ? app[colnames[i]] = row[i]
? ? ? ? ? ? dic_list.append(app)
? ? return dic_list
# 讀取單個sheet表數(shù)據(jù)
print("讀取excel數(shù)據(jù)....")
data_list = excel_table_byname(file_path="F:/test.xlsx",sheet_name="表1")
print(data_list)
for x in data_list:
? ? print(x)
結(jié)果:
sheet名稱:['表1']
<xlrd.sheet.Sheet object at 0x0000029770E44390>
列數(shù):3
行數(shù):6
第1行數(shù)據(jù):['測試序號', '測試功能', '測試結(jié)果']
第1列數(shù)據(jù):['測試序號', '1', '2', '3', '4', '5']
第2行捺癞、第2列數(shù)據(jù):首頁
讀取excel數(shù)據(jù)夷蚊。。髓介。
[{'測試序號': '1', '測試結(jié)果': '成功', '測試功能': '首頁'}, {'測試序號': '2', '測試結(jié)果': '失敗', '測試功能': '流程'}, {'測試序號': '3', '測試結(jié)果': '成功', '測試功能': '資金'}, {'測試序號': '4', '測試結(jié)果': '成功', '測試功能': '賬戶'}, {'測試序號': '5', '測試結(jié)果': '失敗', '測試功能': '服務(wù)'}]
{'測試序號': '1', '測試結(jié)果': '成功', '測試功能': '首頁'}
{'測試序號': '2', '測試結(jié)果': '失敗', '測試功能': '流程'}
{'測試序號': '3', '測試結(jié)果': '成功', '測試功能': '資金'}
{'測試序號': '4', '測試結(jié)果': '成功', '測試功能': '賬戶'}
{'測試序號': '5', '測試結(jié)果': '失敗', '測試功能': '服務(wù)'}