做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用例,实现数据和逻辑分离。这样改测试数据的时候,不用动代码,维护起来特别方便。

大家把上面的代码复制到本地,跑一遍,再对着知识点过一遍,很快就能掌握。有问题的话,评论区留言交流~

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐