web自動化測試第23步:數據分離(類變量、yaml、excel)

在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格式,因爲發現就算是加了引號的中文,部分字符仍然無法正確編碼讀取。(我猜是有些生僻字沒有對應編碼),所以這裏設置了gb18030編碼。

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實例演示

excel如圖

excel讀取

實際演示示例:

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', '測試結果': '失敗', '測試功能': '服務'}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章