pytest 测试框架训练营进阶

霍格沃兹测试开发

ceshiren.com

目录

  • 实战一:测试数据的数据驱动
  • 实战二:合理使用第三方插件实现特殊需求

实战一 实现数据驱动

  • 创建数据文件:保存测试数据
  • 创建解析文件方法:解析 yaml 中的数据
  • 用例中使用解析之后的数据
  • 执行完所有的用例,打印日志:清理所有的测试数据

测试数据文件

add:
  P0:
    datas:
      - [1, 1, 2]
      - [-0.01, 0.02, 0.01]
      - [10, 0.02, 10.02]
    ids:
      - 2个整数
      - 2个浮点数
      - 整数+浮点数
  P1_1:
    datas:
      - [98.99, 99, 197.99]
      - [99, 98.99, 197.99]
      - [-98.99, -99, -197.99]
      - [-99, -98.99, -197.99]
      - [99.01, 0, "参数大小超出范围"]
      - [-99.01, -1, "参数大小超出范围"]
      - [2, 99.01, "参数大小超出范围"]
      - [1, -99.01, "参数大小超出范围"]
    ids:
      - 有效边界值相加【98.99,99】
      - 有效边界值相加【99,98.99】
      - 有效边界值相加【-98.99,-99】
      - 有效边界值相加【-99,-98.99】
      - 无效边界值相加【99.01,0】
      - 无效边界值相加【-99.01,-1】
      - 无效边界值相加【2,99.01】
      - 无效边界值相加【1,-99.01】
  P1_2:
    datas:
      - [文, 9.3, "TypeError"]
      - [4, 字, "TypeError"]
      - [nu, 0.2, "TypeError"]
      - [30, t, "TypeError"]
      - ["*&", 0.2, "TypeError"]
      - [21.45, "@", "TypeError"]
    ids:
      - 第一个值是汉字
      - 第二个值是汉字
      - 第一个值是英文字母
      - 第二个值是英文字母
      - 第一个值是特殊字符*&
      - 第二个值是特殊字符@
  P2:
    datas:
      - [None, 20.93, "TypeError"]
      - [-3, None, "TypeError"]
      - [" ", 3.14, "TypeError"]
      - [-90, " ", "TypeError"]
    ids:
      - 第一个值None
      - 第二个值None
      - 第一个值空格
      - 第二个值空格

解析文件方法

# 安装:pip install pyyaml
import yaml
# 读取 yaml 数据文件
def get_data(level):
    with open("./datas/datas.yml", encoding="utf-8") as f:
        result = yaml.safe_load(f)
        add_data = result.get("add")
    return add_data.get(level).get("datas"), add_data.get(level).get("ids")

用例使用解析之后的数据

class TestCalc:
    add_P0_data, add_P0_ids = get_data("P0")
    add_P1_1_data, add_P1_1_ids = get_data("P1_1")
    add_P1_2_data, add_P1_2_ids = get_data("P1_2")
    add_P2_data, add_P2_ids = get_data("P2")

通过 Hook 函数使编码格式支持中文

def pytest_collection_modifyitems(items):
    """
    测试用例收集完成时,将收集到的用例名name和用例标识nodeid的中文信息显示在控制台上
    """
    for i in items:
        i.name=i.name.encode("utf-8").decode("unicode_escape")
        i._nodeid=i.nodeid.encode("utf-8").decode("unicode_escape")

总结

  • yaml 数据格式支持对象(字典)、数组(列表,序列)、纯量(字符串、整数、浮点数、布尔、时间、日期等)
  • yaml.safe_load(文件名) 将 yaml 格式转成 python 对象
  • yaml.safe_dump() 将 python 对象转成 yaml 格式
  • 读取文件需要使用 utf-8 格式

实战二 灵活使用第三方插件完成需求

  • 假设每条用例执行需要 5 秒,加速执行用例(速度提升一倍以上)
  • 调整执行用例的顺序,先执行 add P0 级别和 div P0 级别,再执行 add P1 级别和 divP1 级别(addP0>divP0>addP1>divP1)
  • 如果 P0 级别的用例执行失败,则重新尝试执行最多 3 次,如果执行成功则只执行一次
  • 生成测试报告(添加用例分类,添加测试步骤,添加图像<本地任意图片>)

插件安装

pip install pytest-ordering
pip install pytest-xdist
pip install pytest-rerunfailures
pip install allure-pytest

知识点总结

  • 使用 pytest-xdist 插件实现分布并发执行解决方案
  • 使用 pytest-ordering 控制测试用例的顺序
  • 使用 pytest-rerunfailures 控制失败重试次数
  • 使用 allure-pytest 生成测试报告,可以在报告中为用例进行场景分类 ,优化报告内容,在报告详情中添加用例步骤,添加截图等