Web自动化测试:数据分离(类变量、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格式,因为发现就算是加了引号的中文,部分字符仍然无法正确编码读取

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', '测试结果': '失败', '测试功能': '服务'}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349