测试学习记录,仅供参考!
项目实战演练--封装方法
封装文件写入方法
1、 在项目根目录下新建一个名称为"configs"的目录文件,用于存放配置文件,继续在该目录文件下新建名称为"setting.py"的 Python 文件,在 "setting.py" 文件输入以下内容;
python
# 导包
import os
import sys
# 使用os.path.dirname获取当前文件所在目录的父目录--也就是说获取当前文件的上一级目录
# 这里需要拿到项目的根目录,所以再叠加一次
DIR_PATH = os.path.dirname(os.path.dirname(__file__))
# 找到项目根目录之后需要把它加到 搜索模块里面去
# 把项目根目录添加到系统的路径列表中--目的是:确保可以通过导入模块的方式找到项目根目录
sys.path.append(DIR_PATH)

2、在项目根目录下新建一个自定义名称的 YAML 格式文件(例如文件名称为"extract.yaml"),用于储存接口返回值的提取结果, 暂时不需要输入任何内容(为空即可);

3、 修改 configs 目录下"setting.py" 文件内容,新建一个字典变量来定义某个需要的文件路径,以便后续使用(可自行打印出文件路径进行测试验证,查看是否准确;测试验证后记得注释掉);
python
# 导包
import os
import sys
# 使用os.path.dirname获取当前文件所在目录的父目录--也就是说获取当前文件的上一级目录
# 这里需要拿到项目的根目录,所以再叠加一次
DIR_PATH = os.path.dirname(os.path.dirname(__file__))
# 找到项目根目录之后需要把它加到 搜索模块里面去
# 把项目根目录添加到系统的路径列表中--目的是:确保可以通过导入模块的方式找到项目根目录
sys.path.append(DIR_PATH)
# 新建一个字典 FILE_PATH 变量来定义文件路径
FILE_PATH = {
# 这样做的好处是:其他地方需要用到时可直接引用 setting.py模块
'extract' : os.path.join(DIR_PATH, 'extract.yaml')
}
# 打印出文件路径--通过字典key值可以拿到文件路径
# print(FILE_PATH['extract'])

4、修改 handle_data 软件包下"yaml_handler.py" 文件内容,封装一个写入方法;
python
# 导包
import yaml
import os
from configs.setting import FILE_PATH
# 定义函数 read_yaml--传一个参数--要读取哪个yaml文件
def read_yaml(yaml_path):
"""
读取yaml文件数据
:param yaml_path:
:return:
"""
# 读取文件最好加上异常处理
try:
# 使用open打开文件--使用这个后面可以不用手动关闭,它调用完之后会自动关闭文件句柄
# 打开哪个文件、权限、编码格式
with open(yaml_path, 'r', encoding='utf-8') as file:
# 直接调用yaml.safe_load()加载文件file
data = yaml.safe_load(file)
# return返回
return data
except UnicodeDecodeError:
print(f"{yaml_path}文件编码格式错误,--尝试使用utf-8去解码YAML文件发送错误,请确保你的yaml文件是utf-8格式!")
except Exception as e:
print(f"读取{yaml_path}文件时出现异常,原因:{e}")
# 定义一个方法 write_yaml--(file_path 写入路径,value 写入一个数据)
# 这个写入方法是专门把数据写到创建的extract.yaml中
def write_yaml(value): # 这里做自动化测试,一般只需要固定写入,传一个参数就行,按需自行选择
"""
yaml文件数据写入
:param value:(dict)写入的数据,必须为字典格式
:return:
"""
# 往哪里写入数据--先引进模块 configs.setting --获取文件路径--不至于后面把路径写死
file_path = FILE_PATH['extract']
# 打印查看文件路径--看它有没有拿到
print(file_path)
# 判断这个文件 file_path 路径不存在时--引进 os 模块
if not os.path.exists(file_path):
# 若不存在,调用 os.system() 再创建一个file_path文件路径
os.system(file_path)
# 调试查看一下新写的 write_yaml()方法有没有生效
if __name__ == '__main__':
# 调用 write_yaml--先传一个空
res = write_yaml(value=None)
# 打印结果:None
print(res)
5、如若此时在项目根目录下没有 "extract.yaml"文件,再执行 yaml_handler.py 文件,会运行失败,控制台报错显示提醒乱码(可自行删除文件测试验证);

6、继续修改 handle_data 软件包下"yaml_handler.py" 文件内容,优化写入方法,假如项目根目录下不存在 extract.yaml 文件,则会自动创建一个;
python
# 导包
import yaml
import os
from configs.setting import FILE_PATH
# 定义函数 read_yaml--传一个参数--要读取哪个yaml文件
def read_yaml(yaml_path):
"""
读取yaml文件数据
:param yaml_path:
:return:
"""
# 读取文件最好加上异常处理
try:
# 使用open打开文件--使用这个后面可以不用手动关闭,它调用完之后会自动关闭文件句柄
# 打开哪个文件、权限、编码格式
with open(yaml_path, 'r', encoding='utf-8') as file:
# 直接调用yaml.safe_load()加载文件file
data = yaml.safe_load(file)
# return返回
return data
except UnicodeDecodeError:
print(f"{yaml_path}文件编码格式错误,--尝试使用utf-8去解码YAML文件发送错误,请确保你的yaml文件是utf-8格式!")
except Exception as e:
print(f"读取{yaml_path}文件时出现异常,原因:{e}")
# 定义一个方法 write_yaml--(file_path 写入路径,value 写入一个数据)
# 这个写入方法是专门把数据写到创建的extract.yaml中
def write_yaml(value): # 这里做自动化测试,一般只需要固定写入,传一个参数就行,按需自行选择
"""
yaml文件数据写入
:param value:(dict)写入的数据,必须为字典格式
:return:
"""
# 往哪里写入数据--先引进模块 configs.setting --获取文件路径--不至于后面把路径写死
file_path = FILE_PATH['extract']
# 打印查看文件路径--看它有没有拿到
print(file_path)
# 判断这个文件 file_path 路径不存在时--引进 os 模块
if not os.path.exists(file_path):
# 若在项目根目录下不存在extract.yaml文件,则新建一个
with open(file_path, 'w', encoding='utf-8'):
pass
# 调试查看一下新写的 write_yaml()方法有没有生效
if __name__ == '__main__':
# 调用 write_yaml--先传一个空
res = write_yaml(value=None)
# 打印结果:None
print(res)

7、持续修改 handle_data 软件包下"yaml_handler.py" 文件内容,给写入方法添加异常处理;
python
# 导包
import yaml
import os
from configs.setting import FILE_PATH
# 定义函数 read_yaml--传一个参数--要读取哪个yaml文件
def read_yaml(yaml_path):
"""
读取yaml文件数据
:param yaml_path:
:return:
"""
# 读取文件最好加上异常处理
try:
# 使用open打开文件--使用这个后面可以不用手动关闭,它调用完之后会自动关闭文件句柄
# 打开哪个文件、权限、编码格式
with open(yaml_path, 'r', encoding='utf-8') as file:
# 直接调用yaml.safe_load()加载文件file
data = yaml.safe_load(file)
# return返回
return data
except UnicodeDecodeError:
print(f"{yaml_path}文件编码格式错误,--尝试使用utf-8去解码YAML文件发送错误,请确保你的yaml文件是utf-8格式!")
except Exception as e:
print(f"读取{yaml_path}文件时出现异常,原因:{e}")
# 定义一个方法 write_yaml--(file_path 写入路径,value 写入一个数据)
# 这个写入方法是专门把数据写到创建的extract.yaml中
def write_yaml(value): # 这里做自动化测试,一般只需要固定写入,传一个参数就行,按需选择
"""
yaml文件数据写入
:param value:(dict)写入的数据,必须为字典格式
:return:
"""
# 往哪里写入数据--先引进模块 configs.setting --获取文件路径--不至于后面把路径写死
file_path = FILE_PATH['extract']
# 打印查看文件路径--看它有没有拿到
# print(file_path)
# 判断这个文件 file_path 路径不存在时--引进 os 模块
if not os.path.exists(file_path):
# 若在项目根目录下不存在extract.yaml文件,则新建一个
with open(file_path, 'w'):
pass
# 定义一个空的变量--因为作用域问题,若不在最外层定义空变量,file.close()则会显示file黄色下滑波浪线提示警告
file = None
# 添加异常处理
try:
# 使用open打开文件--文件名,权限 a 追加写入,编码格式--赋值给file
file = open(file_path, 'a', encoding='utf-8')
# 针对写入的 value 数据进行判断--写入的value是否为字典类型
if isinstance(value, dict):
# 若value是字典类型--直接使用yaml.dump()调用yaml文件
# 把参数传给它 value,可以写入中文,按顺序去写入
write_data = yaml.dump(value, allow_unicode=True, sort_keys=False)
# 调用文件file--使用write()写入--数据write_data
file.write(write_data)
else:
# 若不是字典类型,则打印
print("写入的数据必须为字典类型!")
except Exception as e:
print(f"写入yaml文件出现异常,原因:{e}")
finally:
# 不管是否有异常,都执行关闭文件操作--因为前面使用的是 open--所以需要手动关闭文件句柄
file.close()
# 调试查看一下新写的 write_yaml()方法有没有生效
if __name__ == '__main__':
# 调用 write_yaml--先传一个空
res = write_yaml(value=None)
# 打印结果:None
print(res)

鼠标光标移动到"yaml.dump()"方法上, 按住"CTRL"键再鼠标单击可自行查看对应方法详情;

往上滑动查看"dump_all()"方法,里面有各种参数可供参考;


- allow_unicode=True -- 控制是否可以写入中文,默认allow_unicode=None--为None时,不能写入中文,这里设置为True,写入时可以写入中文;
- sort_keys=False -- 按顺序去写入,默认sort_keys=True--这里设置为False;sort_keys=True 指示编码器按照字典排序 (a 到 z) 输出。如果是字典类型的 Python 对象,将关键字按照字典排序。
写入字典类型数据
8、 此时在项目根目录下"extract.yaml"文件里面为空,没有任何数据信息;

9、 在"yaml_handler.py"文件'main'主函数测试调试传入字典格式数据后执行查看结果;
python
# 调试查看一下新写的 write_yaml()方法有没有生效
if __name__ == '__main__':
# 调用 write_yaml--传入一个字典格式
res = write_yaml({"name":"ZhangSan"})
# 打印结果:None
print(res)

若 yaml_handler.py 文件执行成功后,则会在 extract.yaml 文件中写入字典格式数据;

封装清空文件方法
10、 优化 handle_data 软件包下"yaml_handler.py" 文件内容,封装一个清空文件方法;
python
# 导包
import yaml
import os
from configs.setting import FILE_PATH
# 定义函数 read_yaml--传一个参数--要读取哪个yaml文件
def read_yaml(yaml_path):
"""
读取yaml文件数据
:param yaml_path:
:return:
"""
# 读取文件最好加上异常处理
try:
# 使用open打开文件--使用这个后面可以不用手动关闭,它调用完之后会自动关闭文件句柄
# 打开哪个文件、权限、编码格式
with open(yaml_path, 'r', encoding='utf-8') as file:
# 直接调用yaml.safe_load()加载文件file
data = yaml.safe_load(file)
# return返回
return data
except UnicodeDecodeError:
print(f"{yaml_path}文件编码格式错误,--尝试使用utf-8去解码YAML文件发送错误,请确保你的yaml文件是utf-8格式!")
except Exception as e:
print(f"读取{yaml_path}文件时出现异常,原因:{e}")
# 定义一个方法 write_yaml--(file_path 写入路径,value 写入一个数据)
# 这个写入方法是专门把数据写到创建的extract.yaml中
def write_yaml(value): # 这里做自动化测试,一般只需要固定写入,传一个参数就行,按需自行选择
"""
yaml文件数据写入
:param value:(dict)写入的数据,必须为字典格式
:return:
"""
# 往哪里写入数据--先引进模块 configs.setting --获取文件路径--不至于后面把路径写死
file_path = FILE_PATH['extract']
# 打印查看文件路径--看它有没有拿到
# print(file_path)
# 判断这个文件 file_path 路径不存在时--引进 os 模块
if not os.path.exists(file_path):
# 若在项目根目录下不存在extract.yaml文件,则新建一个
with open(file_path, 'w'):
pass
# 定义一个空的变量--因为作用域问题,若不在最外层定义空变量,file.close()则会显示file黄色下滑波浪线提示警告
file = None
# 添加异常处理
try:
# 使用open打开文件--文件名,权限 a 追加写入,编码格式--赋值给file
file = open(file_path, 'a', encoding='utf-8')
# 针对写入的 value 数据进行判断--写入的value是否为字典类型
if isinstance(value, dict):
# 若value是字典类型--直接使用yaml.dump()调用yaml文件
# 把参数传给它 value,可以写入中文,按顺序去写入
write_data = yaml.dump(value, allow_unicode=True, sort_keys=False)
# 调用文件file--使用write()写入--数据write_data
file.write(write_data)
else:
# 若不是字典类型,则打印
print("写入的数据必须为字典类型!")
except Exception as e:
print(f"写入yaml文件出现异常,原因:{e}")
finally:
# 不管是否有异常,都执行关闭文件操作--因为前面使用的是 open--所以需要手动关闭文件句柄
file.close()
# 定义一个清空文件方法 clear_yaml
def clear_yaml():
"""
清空 extract.yaml 文件数据
:return:
"""
# 调用with open()--文件路径,权限 w ,编码格式
with open(FILE_PATH['extract'], 'w', encoding='utf-8') as f:
# 调用一个方法 f.truncate()--调用这个方法就会清空yaml文件
f.truncate()
# 调试查看一下新写的 write_yaml()方法有没有生效
if __name__ == '__main__':
# 调用 write_yaml 写入数据
write_yaml({"name": "ZhangSan"})
# 调用 clear_yaml()方法清空文件
clear_yaml()
11、 在"yaml_handler.py"文件'main'主函数测试验证;

运行成功后再次打开查看 extract.yaml 文件,可以发现写入的数据信息已经成功被清空。

未完待续。。。