Python自动化测试实战:Pytest+YAML数据读写,看完直接上手
本文介绍了Python自动化测试中Pytest+YAML的核心使用方法。主要内容包括:1)通过示例代码演示YAML文件的读写操作,使用PyYAML库的safe_dump和safe_load方法;2)讲解Pytest测试用例编写规范,包括命名规则和断言写法;3)强调异常处理的重要性,使用try-except避免脚本崩溃;4)提供两个实用技巧:YAML转JSON用于接口测试,以及使用if name =
做Python自动化测试的同学,肯定绕不开Pytest和YAML。Pytest用来跑测试用例,轻便又灵活;YAML存测试数据,比Excel、JSON更直观,层级一眼就能看懂。这俩搭配好,测试用例维护起来能省不少劲。
今天就基于一套能直接复制运行的代码,把Pytest+YAML读写的核心用法拆明白。从基础操作到实际工作里的小技巧,都是实战中用得上的干货,新手跟着敲一遍,立马就能上手。
一、先上可运行代码(直接抄作业)
先把完整代码贴出来,后面讲知识点的时候,大家可以对着代码看,逻辑更清晰。这段代码我已经实测过了,复制到本地就能跑通,不用额外改东西。
import yaml
import json
def write_yaml(filename, data):
"""写入YAML文件:覆盖写入,含异常处理"""
try:
with open(file=filename, mode='w', encoding='utf-8') as f:
yaml.safe_dump(data=data, stream=f)
print(f" 数据成功写入{filename}")
except Exception as e:
print(f" 写入YAML失败:{str(e)}")
def read_yaml(filename):
"""读取YAML文件:处理空数据,含异常捕获"""
try:
with open(file=filename, mode='r', encoding='utf-8') as f:
data = yaml.safe_load(stream=f)
# 处理文件为空或无有效数据的场景,避免返回None踩坑
return data if data is not None else {}
except Exception as e:
print(f" 读取YAML失败:{str(e)}")
return {}
def test01_write_yaml():
"""Pytest测试用例:验证YAML数据写入"""
test_data = {'a': 1, 'b': 2, 'c': 3}
write_yaml(filename='firstyaml.yml', data=test_data)
def test02_read_yaml():
"""Pytest测试用例:验证YAML数据读取与后续处理"""
data = read_yaml('firstyaml.yml')
print(f" 读取到的YAML数据:{data}")
# YAML转JSON,接口测试经常用到
json_data = json.dumps(data)
print(f" JSON格式数据:{json_data}")
# 断言验证结果,Pytest用例必须有这个
assert data.get('a') == 1, "读取的数据不符合预期"
# 本地直接运行验证,不用启动Pytest
if __name__ == '__main__':
test01_write_yaml()
test02_read_yaml()
二、核心知识点拆解(对着代码讲,好懂不绕)
下面就对着上面的代码,一个个讲核心知识点。每个点都结合实际用法,不说空话,保证大家看完就知道怎么用。
知识点1:Python文件操作,用with open就够了
不管是读YAML还是写YAML,都得先操作文件。Python里操作文件,最推荐的就是with open语法,比手动open/close省心多了。
核心用法就是:with open(文件路径, 打开模式, 编码) as 变量名
-
文件路径:比如代码里的'firstyaml.yml',这是相对路径,直接存在脚本同级目录;如果想存到其他地方,写绝对路径就行(比如'C:/test/firstyaml.yml');
-
打开模式:写文件用'w'(覆盖写入,之前的内容会清掉),读文件用'r'(只读);另外常用的还有'a'(追加写入,不会清原有内容),二进制读写用'rb'/'wb',一般用不上;
-
编码:固定写'utf-8',别问为什么,问就是避免中文乱码,踩过一次坑就记住了;
-
with的好处:不用手动写close()关闭文件,就算代码报错,也能自动释放文件资源,不会出现文件占用的情况。
对应代码里的这两段,大家对照看:
# 写入文件
with open(file='firstyaml.yml', mode='w', encoding='utf-8') as f:
yaml.safe_dump(data=data, stream=f)
# 读取文件
with open(file='firstyaml.yml', mode='r', encoding='utf-8') as f:
data = yaml.safe_load(stream=f)
知识点2:PyYAML库,YAML读写的核心
Python本身不支持YAML文件,所以得装个第三方库PyYAML。核心就两个方法:safe_dump(写数据)和safe_load(读数据),记住这俩就行。
2.1 先装库,别忘这一步
命令行直接敲:pip install pyyaml
2.2 写YAML:用safe_dump,安全又省心
作用很简单:把Python里的字典、列表,转成YAML格式写入文件。比如代码里的{'a':1, 'b':2, 'c':3},写完之后YAML文件里就是清晰的键值对。
-
data:就是要写的Python数据,一般是字典或列表,测试数据基本都是这两种;
-
stream:就是前面with open得到的文件对象f,告诉程序要写到哪个文件里;
-
为什么用safe_dump?比普通的dump安全,能过滤掉函数、类这种无效数据,避免写进去的YAML文件读不出来。
写完之后的YAML文件长这样,自动格式化,不用自己调缩进:
知识点3:Pytest用例怎么写?记住这几个规矩
代码里的test01_write_yaml和test02_read_yaml,就是标准的Pytest测试用例。写用例不用复杂,跟着规矩来就行,很简单。
3.1 写用例的几个基本规矩
-
文件名:必须以test_开头,或者以_test.py结尾,比如test_yaml.py、yaml_test.py,不然Pytest识别不到;
-
函数名:也必须以test_开头,比如test_write、test_read,这样Pytest才知道这是个测试用例;
-
参数:默认不用传参数,除非用到fixture(这个后续再讲,新手先不用管);
-
断言:每个用例必须有assert,用来验证结果对不对。比如代码里断言data.get('a') == 1,就是检查读取到的a的值是不是1,对了用例通过,错了就失败。
3.2 断言怎么写?简单直接就行
代码里的断言:assert data.get('a') == 1, "读取的数据不符合预期"
格式很简单:assert 要验证的条件, 失败时提示的信息。条件成立,用例过;条件不成立,就会抛出提示信息,一眼就知道哪里错了。
3.3 Pytest怎么运行?这几个命令足够用
运行用例不用复杂操作,命令行敲几句就行,记这几个最常用的:
-
基础运行:进入脚本所在目录,敲pytest,Pytest会自动找所有测试用例并运行;
-
看print输出:默认情况下,Pytest会把print的内容藏起来,想看到的话,加个-s参数,敲pytest -s;
-
只运行某个文件:不想跑所有用例,就指定文件,比如pytest test_yaml.py -s;
-
只运行某个用例:更精准一点,指定文件+用例函数名,比如pytest test_yaml.py::test02_read_yaml -s。
知识点4:异常处理,用try-except避坑
写自动化脚本,异常处理一定要加。比如读YAML的时候,文件不存在、格式错了,要是没处理,脚本直接崩溃,后面的用例都跑不了。
核心就是try-except语法:把可能出错的代码放进try里,出错了就执行except里的逻辑,打印错误信息,程序还能继续跑。
try:
# 可能出错的代码,比如文件读写、接口请求
代码逻辑
except Exception as e:
# 出错了执行这里,打印错误信息
print(f"错误信息:{str(e)}")
比如代码里读写YAML,可能遇到的坑:
-
写入时:文件路径不存在、没有写入权限、数据格式不对;
-
读取时:文件找不到、文件被损坏、编码不对;
-
处理方式:捕获异常后,打印清晰的错误信息,读取函数返回空字典,写入函数只提示错误,这样就算一个步骤错了,整个脚本也不会崩,后续用例能正常执行。
知识点5:两个实用小技巧,实战经常用
代码里还有两个小技巧,都是实际工作中高频用到的,尤其是做接口测试的同学,一定要掌握。
5.1 YAML转JSON,接口测试必备
接口测试的请求参数,大多是JSON格式,但我们的测试数据存在YAML里(方便维护),这时候就需要把读取到的YAML数据(字典)转成JSON字符串。
json_data = json.dumps(data)
-
ensure_ascii=False:允许中文正常显示,不然中文会变成一堆Unicode编码,没法看;
-
indent=2:JSON字符串自动缩进2个空格,格式整齐,调试的时候一眼就能看清结构。
5.2 独立运行验证,不用每次都启动Pytest
写代码的时候,想快速验证读写功能对不对,不用每次都启动Pytest,加一句if __name__ == '__main__'就行。
if __name__ == '__main__':
test01_write_yaml()
test02_read_yaml()
这样直接用Python运行脚本(比如python test_yaml.py),就会执行里面的测试用例,快速验证功能是否正常,调试起来特别方便。
三、总结一下,这些知识点够用了
今天讲的内容,都是Pytest+YAML读写的核心用法,实战中能覆盖大部分场景。总结一下重点,大家记牢:
-
文件操作:优先用with open,不用手动关文件,安全又省心;
-
YAML读写:装PyYAML库,用safe_dump写、safe_load读,记得处理None;
-
Pytest用例:文件名和函数名以test_开头,必须有assert,运行加-s看输出;
-
异常处理:关键步骤加try-except,避免脚本崩溃;
-
小技巧:YAML转JSON适配接口测试,if __name__ == '__main__'方便调试。
实际工作中,我们通常会把接口的请求参数、预期结果存在YAML文件里,用这些方法读取数据,传入Pytest用例,实现数据和逻辑分离。这样改测试数据的时候,不用动代码,维护起来特别方便。
大家把上面的代码复制到本地,跑一遍,再对着知识点过一遍,很快就能掌握。有问题的话,评论区留言交流~
更多推荐

所有评论(0)