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

37次阅读

共计 11435 个字符,预计需要花费 29 分钟才能阅读完成。

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 总结

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

作者:京东物流 王小云

起源:京东云开发者社区

正文完
 0