Python Python 自动化测试的配置层实现方式对标与落地 | 京东云技术团队

京东云开发者 · 2023年06月16日 · 3900 次阅读

Python 中什么是配置文件,配置文件如何使用,有哪些支持的配置文件等内容,话不多说,让我们一起看看吧~

1 什么是配置文件?

配置文件是用于配置计算机程序的参数和初始化设置的文件,如果没有这些配置程序可能无法运行或是影响运行(运行速度、便捷性等),使用配置文件的好处在于,部分内容以及环境运行时只需要修改配置文件的参数内容,而无需去代码里查找并修改,提高便捷性、提高可维护性。

2 配置文件有哪几种?

配置主要有四种形式:

  1. 第一种是 YAML、JSON、XML、TOML、INI、Linux 系统中的.bashrc 一类,主要应用于软件测试领域,在软件测试的领域行业中,大多数公司采用最新的 YAML 形式来作为配置文件,例如数据库地址、用例数据等内容的存放,而少部分公司仍然采用旧的 INI 配置形式
  2. 第二种是 excel 表格的形式,在 excel 表格中会有固定的 title 代表每个字段列的含义,有多列,以此来进行配置,多用于游戏领域中,在游戏行业大量使用 excel 表格的形式,已经是一个常态了。
  3. 第三种是 py 文件,py 文件对于一个纯 Python 项目而言是非常方便的,它不需要做数据的读取操作,只需要进行导入即可,不好的点在于,没有 YAML 这一类灵活,YAML 配置文件无论是 Python、Java 等语言,都是支持的,且数据类型支持很多,而 py 的配置文件,就只能用作于 python,有一定的局限性。
  4. 第四种是 txt 文本格式,通过读取的方式来识别到 txt 文本内容,通常而言是测开或者测试工程师制作的简便工具,供给业务层面的测试人员进行使用,降低了 YAML 这种配置的理解难度,也避免了打开 excel 的缓慢,用轻量级 txt 来代替是一个不错的选择。

2.1 ini

python3 自带的 ini

.ini 文件是 Initialization File 的缩写,即初始化文件,是 windows 的系统配置文件所采用的存储格式,统管 windows 的各项配置

2.1.1 ini 文件的定义

.ini 文件通常由节(Section)、键(key)和值(value)组成。具体形式如下:

db.ini
[mysql]
host = 127.0.0.1
port = 3306
user = root
password = 123456
database = test

2.1.2 python 读取 ini 文件

使用 python 内置的 configparser 标准库进行解析 ini 文件。

read() 读取文件内容 items() 获取指定节的所有键值对

# -*- coding: utf-8 -*-
'''
 * @Author       : wxy
 * @Date         : 2022-08-24 11:11:06
 * @Description  : 读取ini文件
 * @LastEditTime : 2022-08-24 11:11:06
'''
from configparser import ConfigParser
from pprint import pprint
import pymysql


# ini文件路径
ini_file = './db.ini'
# 读取ini的节(Section)
db_name = 'mysql'

# configparser实例化
text = ConfigParser()

# 读取ini文件内容
text.read(ini_file)

# text.items()返回list,元素为tuple,元组格式为 key,value
db_tuple = text.items(db_name)
print(db_tuple)

# 将元组转换成dict
db_dict = dict(text.items(db_name))
print(db_dict)

2.2 json

JSON(JavaScript Object Notation,) 是一种轻量级的数据交换格式。

2.2.1 json 文件的定义

简单的 json 示例

{
      "mysql": {
          "host": "127.0.0.1",
          "port": 3306,
          "user": "root",
          "password": "123456",
          "database": "test"
      }
  }

2.2.2 python 读取 json 文件

load() 从 json 文件中读取 json 格式数据

loads() 将字符串类型数据转化为 json 格式数据

dump() 将 json 格式数据保存到文件

dumps() 将 json 格式数据保存为字符串类型

# -*- coding: utf-8 -*-
'''
 * @Author       : wxy
 * @Date         : 2022-8-24 11:39:44
 * @Description  : 读取json文件
 * @LastEditTime : 2022-8-24 11:39:44
'''

import json
from pprint import pprint
import pymysql

json_file = "./db.json"
db_name = "mysql"
web = "web"

with open(json_file) as f:
    cfg = json.load(f)[db_name]
    print(cfg)

with open(json_file) as f:
    cfg = json.load(f)[web]
    print(cfg['user'])

2.3 toml

TOML 是 Github 联合创始人 Tom Preston-Werner 所提出的一种配置文件格式,是一种旨在成为一个小规模、易于使用的语义化的配置文件格式,它被设计为可以无二义性的转换为一个哈希表。

2.3.1 定义 toml 文件

语法:

TOML 的语法广泛地由 key = “value”、[节名]、# 注释构成。

支持以下数据类型:字符串、整形、浮点型、布尔型、日期时间、数组和图表。

 # db.toml
[mysql]
    [mysql.config]
    host     = "127.0.0.1"
    user     = "root"
    port     = 3306
    password = "123456"
    database = "test"

    [mysql.parameters]
    pool_size = 5
    charset   = "utf8"

    [mysql.fields]
    course_cols = ["cno", "cname", "ccredit", "cdept"]

2.3.2 python 读取 toml 文件

使用外部库 toml 解析 toml 文件

# -*- coding: utf-8 -*-
'''
 * @Description  : 读取toml文件
 * @LastEditTime : 2022-08-14 11:31:07
'''
import toml
from pprint import pprint
import pymysql

toml_file = "./db.toml"

cfg = toml.load(toml_file)['mysql']

pprint(cfg)

2.4 yaml

YAML(YAML Ain’t a Markup Language”, YAML 不是一种标记语言) 格式是目前较为流行的一种配置文件,它早在 2001 由一个名为 Clark Evans 的人提出;同时它也是目前被广泛使用的配置文件类型。

2.4.1 定义 yaml 文件

# db.yaml
mysql:
  config:
    host: "127.0.0.1"
    port: 3306
    user: "root"
    password: ""
    database: "stu_sys"

  parameters:
    pool_size: 5
    charset: "utf8"

  fileds:
    course_cols:
      - cno
      - cname
      - ccredit
      - cdept

2.4.2 python 读取 yaml 文件

使用外部库 pyyaml 解析 toml 文件。

# -*- coding: utf-8 -*-
'''
 * @Author       : wxy
 * @Date         : 2022-8-24 11:34:37
 * @Description  : 读取yaml文件
 * @LastEditTime : 2022-8-24 11:34:37
'''
import yaml
from pprint import pprint
import pymysql

yaml_file = "./db.yaml"

with open(yaml_file, 'r') as f:
    cfg = yaml.safe_load(f)

print(cfg)

2.5 Python xlrd 读取 操作 Excel

python Excel 库对比

本次主要关注 python xlrd 读取 操作 excel

2.5.1 xlrd 模块介绍

1.什么是 xlrd 模块?

python 操作 excel 主要用到 xlrd 和 xlwt 这两个库,即 xlrd 是读 excel,xlwt 是写 excel 的库。

2.为什么使用 xlrd 模块?

在 UI 自动化或者接口自动化中数据维护是一个核心,所以此模块非常实用。

xlrd 模块可以用于读取 Excel 的数据,速度非常快,推荐使用!

官方文档:https://xlrd.readthedocs.io/en/latest/

2.5.2 安装 xlrd 模块

到 python 官网下载http://pypi.python.org/pypi/xlrd 模块安装,前提是已经安装了 python 环境。

或者在 cmd 窗口 pip install xlrd

最新的 xlrd 不支持 Excel xlsx 文件的读取。所以需要安装旧版本 pip install xlrd==1.2.0

2.5.3 使用介绍

1.常用单元格的数据类型

  • empty(空的)
  • string(text)
  • number
  • date
  • boolean
  • error
  • blank(空白表格)

2.导入模块

import xlrd

3.打开 Excel 文件读取数据

data = xlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个 r

4.常用的函数

excel 中最重要的方法就是 book 和 sheet 的操作

  • 获取 book(excel 文件)中一个工作表
table = data.sheets()[0]             #通过索引顺序获取
table = data.sheet_by_index(sheet_indx)  #通过索引顺序获取
table = data.sheet_by_name(sheet_name)  #通过名称获取

# 以上三个函数都会返回一个xlrd.sheet.Sheet()对象

names = data.sheet_names()        #返回book中所有工作表的名字
data.sheet_loaded(sheet_name or indx)    # 检查某个sheet是否导入完毕
  • 行的操作
nrows = table.nrows
    # 获取该sheet中的行数,注,这里table.nrows后面不带().
table.row(rowx)
    # 返回由该行中所有的单元格对象组成的列表,这与tabel.raw()方法并没有区别。
table.row_slice(rowx)
    # 返回由该行中所有的单元格对象组成的列表
table.row_types(rowx, start_colx=0, end_colx=None)
    # 返回由该行中所有单元格的数据类型组成的列表;    
    # 返回值为逻辑值列表,若类型为empy则为0,否则为1
table.row_values(rowx, start_colx=0, end_colx=None)
    # 返回由该行中所有单元格的数据组成的列表
table.row_len(rowx)
    # 返回该行的有效单元格长度,即这一行有多少个数据
  • 列(colnum)的操作
ncols = table.ncols
    # 获取列表的有效列数
table.col(colx, start_rowx=0, end_rowx=None)
    # 返回由该列中所有的单元格对象组成的列表
table.col_slice(colx, start_rowx=0, end_rowx=None)
    # 返回由该列中所有的单元格对象组成的列表
table.col_types(colx, start_rowx=0, end_rowx=None)
    # 返回由该列中所有单元格的数据类型组成的列表
table.col_values(colx, start_rowx=0, end_rowx=None)
    # 返回由该列中所有单元格的数据组成的列表
  • 单元格的操作
table.cell(rowx,colx)
    # 返回单元格对象
table.cell_type(rowx,colx)
    # 返回对应位置单元格中的数据类型
table.cell_value(rowx,colx)
    # 返回对应位置单元格中的数据

2.5.4 实战训练

使用 xlrd 模块进行读取:

import xlrd

xlsx = xlrd.open_workbook('./3_1 xlrd 读取 操作练习.xlsx')

# 通过sheet名查找:xlsx.sheet_by_name("sheet1")
# 通过索引查找:xlsx.sheet_by_index(3)
table = xlsx.sheet_by_index(0)

# 获取单个表格值 (2,1)表示获取第3行第2列单元格的值
value = table.cell_value(2, 1)
print("第3行2列值为",value)

# 获取表格行数
nrows = table.nrows
print("表格一共有",nrows,"行")

# 获取第4列所有值(列表生成式)
name_list = [str(table.cell_value(i, 3)) for i in range(1, nrows)]
print("第4列所有的值:",name_list)

2.6 Python xlwt 写入 操作 Excel(仅限 xls 格式!)

xlwt 可以用于写入新的 Excel 表格或者在原表格基础上进行修改,速度也很快,推荐使用!

官方文档:https://xlwt.readthedocs.io/en/latest/

2.6.1 pip 安装 xlwt

pip install xlwt

2.6.2 使用 xlwt 创建新表格并写入

编写 xlwt 新表格写入程序:

# 3.2.2 使用xlwt创建新表格并写入
def fun3_2_2():
    # 创建新的workbook(其实就是创建新的excel)
    workbook = xlwt.Workbook(encoding= 'ascii')

    # 创建新的sheet表
    worksheet = workbook.add_sheet("My new Sheet")

    # 往表格写入内容
    worksheet.write(0,0, "内容1")
    worksheet.write(2,1, "内容2")

    # 保存
    workbook.save("新创建的表格.xls")

2.6.3 xlwt 设置字体格式

程序示例:

# 3.2.3 xlwt设置字体格式
def fun3_2_3():
    # 创建新的workbook(其实就是创建新的excel)
    workbook = xlwt.Workbook(encoding= 'ascii')

    # 创建新的sheet表
    worksheet = workbook.add_sheet("My new Sheet")

    # 初始化样式
    style = xlwt.XFStyle()

    # 创建字体样式
    font = xlwt.Font()
    font.name = 'Times New Roman'   #字体
    font.bold = True                #加粗
    font.underline = True           #下划线
    font.italic = True              #斜体

    # 设置样式
    style.font = font
    # 往表格写入内容
    worksheet.write(0,0, "内容1")
    worksheet.write(2,1, "内容2",style)
    # 保存
    workbook.save("新创建的表格.xls")
    # 设置列宽
    worksheet.col(0).width = 256*20
     # 设置行高
    style = xlwt.easyxf('font:height 360;')  # 18pt,类型小初的字号
    row = worksheet.row(0)
    row.set_style(style)
     # 合并 第1行到第2行 的 第0列到第3列
    worksheet.write_merge(1, 2, 0, 3, 'Merge Test')
      # 设置边框样式
    borders = xlwt.Borders()  # Create Borders
    borders.left = xlwt.Borders.DASHED
    borders.right = xlwt.Borders.DASHED
    borders.top = xlwt.Borders.DASHED
    borders.bottom = xlwt.Borders.DASHED
    borders.left_colour = 0x40
    borders.right_colour = 0x40
    borders.top_colour = 0x40
  borders.bottom_colour = 0x40

2.7 Python xlutils 修改 操作 Excel

xlutils 可用于拷贝原 excel 或者在原 excel 基础上进行修改,并保存;

官方文档:https://xlutils.readthedocs.io/en/latest/

2.7.1 pip 安装 xlutils

pip install xlutils

2.7.2 xlutils 拷贝源文件(需配合 xlrd 使用)

程序示例:

# 3.3.2 拷贝源文件
def fun3_3_2():
    workbook = xlrd.open_workbook('3_3 xlutils 修改操作练习.xlsx')  # 打开工作簿
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_workbook.save("new_test.xls")  # 保存工作簿

2.7.3 xlutils 读取 写入(也就是修改)Excel 表格信息

程序示例:

# 3.3.3 xlutils读取 写入 Excel 表格信息
def fun3_3_3():
    # file_path:文件路径,包含文件的全名称
    # formatting_info=True:保留Excel的原格式(使用与xlsx文件)
    workbook = xlrd.open_workbook('3_3 xlutils 修改操作练习.xlsx')

    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象

    # 读取表格信息
    sheet = workbook.sheet_by_index(0)
    col2 = sheet.col_values(1)  # 取出第二列
    cel_value = sheet.cell_value(1, 1)
    print(col2)
    print(cel_value)

    # 写入表格信息
    write_save = new_workbook.get_sheet(0)
    write_save.write(0, 0, "xlutils写入!")

    new_workbook.save("new_test.xls")  # 保存工作簿

2.8 Python xlwings 读取 写入 修改 操作 Excel

2.8.1 pip 安装 xlwings

pip install xlwings

2.8.2 基本操作

引入库

import xlwings as xw

(1)打开已存在的 Excel 文档

# 导入xlwings模块
import xlwings as xw

# 打开Excel程序,默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False

# 文件位置:filepath,打开test文档,然后保存,关闭,结束程序
filepath=r'g:\Python Scripts\test.xlsx'
wb=app.books.open(filepath)
wb.save()
wb.close()
app.quit()

(2)新建 Excel 文档,命名为 test.xlsx,并保存在 D 盘

import xlwings as xw

app=xw.App(visible=True,add_book=False)
wb=app.books.add()
wb.save(r'd:\test.xlsx')
wb.close()
app.quit()

(3)xlwings 读写 Excel

新建 test.xlsx,在 sheet1 的第一个单元格输入 “人生” ,然后保存关闭,退出 Excel 程序。

def fun3_4_4():
    # 新建Excle 默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
    app = xw.App(visible=True, add_book=False)
    app.display_alerts = False
    app.screen_updating = False

    # 打开已存在的Excel文件
    wb=app.books.open('./3_4 xlwings 修改操作练习.xlsx')

    # 获取sheet对象
    print(wb.sheets)
    sheet = wb.sheets[0]
    # sheet = wb.sheets["sheet1"]

    # 读取Excel信息
    cellB1_value = sheet.range('B1').value
    print("单元格B1内容为:",cellB1_value)

    # 清除单元格内容和格式
    sheet.range('A1').clear()

    # 写入单元格
    sheet.range('A1').value = "xlwings写入"

    # 保存工作簿
    wb.save('example_3.xlsx')

    # 退出工作簿
    wb.close()

    # 退出Excel
    app.quit()l

2.9 Python openpyxl 读取 写入 修改 操作 Excel

在 openpyxl 中,主要用到三个概念:Workbooks,Sheets,Cells。

Workbook 就是一个 excel 工作表;

Sheet 是工作表中的一张表页;

Cell 就是简单的一个格。

openpyxl 就是围绕着这三个概念进行的,不管读写都是 “三板斧”:打开 Workbook,定位 Sheet,操作 Cell。

官方文档:https://openpyxl.readthedocs.io/en/stable/

1.安装

pip install openpyxl

2.打开文件

(1)新建

from  openpyxl import  Workbook 
# 实例化
wb = Workbook()
# 激活 worksheet
ws = wb.active

(2)打开已有

from openpyxl  import load_workbook

wb = load_workbook('文件名称.xlsx')

3.写入数据

# 方式一:数据可以直接分配到单元格中(可以输入公式)
ws['A1'] = 42
# 方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
ws.append([1, 2, 3])
# 方式三:Python 类型会被自动转换
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")

4.创建表(sheet)

# 方式一:插入到最后(default)
ws1 = wb.create_sheet("Mysheet") 
# 方式二:插入到最开始的位置
ws2 = wb.create_sheet("Mysheet", 0)

5.选择表(sheet)

# sheet 名称可以作为 key 进行索引
>>> ws3 = wb["New Title"]
>>> ws4 = wb.get_sheet_by_name("New Title")
>>> ws is ws3 is ws4
True

6.查看表名(sheet)

# 显示所有表名
>>> print(wb.sheetnames)
['Sheet2', 'New Title',  'Sheet1']
# 遍历所有表
>>> for sheet in  wb:
...     print(sheet.title)

7.保存数据

wb.save('文件名称.xlsx')

8.其它

(1)改变 sheet 标签按钮颜色

ws.sheet_properties.tabColor = "1072BA" # 色值为RGB16进制值

(2)获取最大行,最大列

# 获得最大列和最大行
print(sheet.max_row)
print(sheet.max_column)

(3)获取每一行每一列

sheet.rows 为生成器, 里面是每一行的数据,每一行又由一个 tuple 包裹。

sheet.columns 类似,不过里面是每个 tuple 是每一列的单元格。

# 因为按行,所以返回A1, B1, C1这样的顺序
for row in sheet.rows:
    for cell in row:
        print(cell.value)

# A1, A2, A3这样的顺序
for column in sheet.columns:
    for cell in column:
        print(cell.value)

(4)根据数字得到字母,根据字母得到数字

from openpyxl.utils import get_column_letter, column_index_from_string

# 根据列的数字返回字母
print(get_column_letter(2))  # B
# 根据字母返回列的数字
print(column_index_from_string('D'))  # 4

(5)删除工作表

# 方式一
wb.remove(sheet)
# 方式二
del wb[sheet]

项目实操—-UI 自动化中实践项目

需求:业务写入拣货容器,使用一次不可使用第二次,且脚本中固定读取固定位置

import openpyxl
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
from openpyxl.utils import get_column_letter, column_index_from_string

# 向sheetobj中的columnname列从start_row开始写入listdata
def insert_listdata_to_column(sheetobj,listdata,column_name,start_row=3):
    # 根据列名获取列索引
    colindex = column_index_from_string(column_name)
    print('colindex为{}'.format(colindex))
    # 循环从开始行数到数据写入后最后一行
    for rowindex in range(start_row, start_row + len(listdata)):
        # 写入list数值根据索引取值,从0开始
        val = listdata[rowindex - start_row]
        print('val{}'.format(val))
        print('rowindex{}'.format(rowindex))
        try:
            sheetobj.cell(row = rowindex,column = colindex,value = val)
        except:
            # 出现非法字符时,可以将字符串的非法字符替换掉
            val = ILLEGAL_CHARACTERS_RE.sub(r'',val)
            sheetobj.cell(row = rowindex,column = colindex,value = val)
    delrow = start_row + len(listdata)
    print('*********{}'.format(delrow))
    sheetobj.delete_rows(delrow)


def del_excel():

    xlsx = xlrd.open_workbook(r'D:\pytest\inbound_data.xlsx')
    table =xlsx.sheet_by_index(2)
    # 获取第2列所有值
    cel_value =table.col_values(1)
    cel_value=cel_value[3::]

    wb = openpyxl.load_workbook(r'D:\pytest\inbound_data.xlsx')
    sheet = wb["B2B出库"]
    print(sheet)
    insert_listdata_to_column(sheet,cel_value,'B',3)
    wb.save(r'D:\pytest\inbound_data.xlsx')

del_excel()

3 总结

在本文中,简单介绍了几种配置文件和使用。根据不同的用例,复杂的工具/框架并不总是比简单的软件包更好。但无论选择哪一种,都应始终考虑可读性,可维护性以及如何尽早地发现错误。事实上,可以说配置文件只是另一种类型的代码。可以根据自己的项目框架来灵活运用啦~

作者:京东物流 王小云

来源:京东云开发者社区

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册