web自动化测试第23步:数据分离(类变量、yaml、excel)

news/2024/7/21 7:01:25 标签: 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操作类的安装和引用:

引用库介绍:

安装:

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如图

<a class=excel读取" class="has" height="312" src="https://img-blog.csdnimg.cn/20190329180209146.png" width="245" />

实际演示示例:

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

 

 

 


http://www.niftyadmin.cn/n/1431724.html

相关文章

web自动化测试第24步:使用测试报告模板(HTMLTestRunner、BeautifulReport)

在运行完测试用例后&#xff0c;需要用一个测试报告来作为自动化运行的一个报告成果&#xff0c;一般是统计用例运行的成功失败&#xff0c;这里就给大家引入两个测试报告模板HTMLTestRunner以及BeautifulReport&#xff0c;这里基于POM设计模式实现这篇文章中的代码&#xff0…

web自动化测试第25步:加入log日志

日志是一个成熟的系统里不可或缺的一部分&#xff0c;对于自动化测试框架来说&#xff0c;最大的作用大概在于可以取代print()方法&#xff0c;并且可以在日志文件中回溯。这里我们引入log日志类&#xff0c;来代替print()记录输出测试过程中的关键信息。 一、日志等级 在日志…

web自动化测试第26步:邮件发送测试报告(明文、ssl、tls)

在我们运行完整个项目后&#xff0c;已经生成了 测试报告&#xff0c;一般自动化会在本地或者公司服务器上运行&#xff0c;那如何获取自动化测试的运行结果呢&#xff0c;此时就需要把测试结果以邮件的形式发送到邮箱&#xff0c;这样就可以在测试完成的第一时间知道测试结果。…

web自动化测试第27步:连接数据库(mysql的ssh和明文连接)

在某些场景&#xff0c;我们需要通过从数据库取值来进行赋值、比对断言&#xff0c;所以就需要连接数据库的方法&#xff0c;这里着重介绍一下关于如何使用python连接mysql数据库&#xff0c;其中包括账号密码连接mysql和ssh连接mysql&#xff0c;以及账号密码连接 oracle数据库…

web自动化测试终篇(28):总结我理解的ui自动化

到了这里&#xff0c;基本上所有关于自动化框架的内容已经完成了&#xff0c;其中我认为web自动化中有三个核心&#xff08;目的与安排、框架结构、元素定位&#xff09;&#xff0c;在最后这里分享一下我所思考的ui自动化。 一、为什么要做自动化以及如何推进 又回到这个最开…

pyhton自动化项目编码以及命名规范

对于任何一个编程项目来说&#xff0c;都需要一个编码的规范以及标准&#xff0c;这里整理了一些Google python的命名规范以及python语言PEP8的编码规范。 一、命名规范 命名示例&#xff1a; module_name, 模块 package_name, 包 ClassName, 类 method_name, 方法 Exceptio…

自动化测试项目中的错误总结

在做自动化项目中&#xff0c;会出现很多错误和调试&#xff0c;所以在这里整理总结一下&#xff0c;具体如下&#xff1a; 1.eclipse无法输入中文 这是最开始时&#xff0c;使用eclipse写python时遇到的一个问题&#xff0c;当时困扰了很久。 使用组合快捷键&#xff1a;Ct…

读书笔记:《软件测试工程师面试指导》-蔡为东

关于读书的感受&#xff1a; 这本书是一本关于软件测试工程师面试指导的书&#xff0c;其实80%是介绍作为一个测试工程师需要的基础知识&#xff0c;以及工作中需要的一些知识技能&#xff1b;与其说是一本面试指导书&#xff0c;不如说是测试基础知识详解。而我读完这本书后&…