Pytest 插件、Pytest-ordering、Pytest-xdist、hook 函数 L4

Pytest 插件开发

目录

  • pytest 插件分类
  • pytest hook 介绍
  • pytest hook 执行顺序

pytest 插件分类

  • 外部插件:pip install 安装的插件
  • 本地插件:pytest 自动模块发现机制(conftest.py 存放的)
  • 内置插件:代码内部的_pytest 目录加载

Pytest 实用的插件介绍

pytest 常用的插件

pip install pytest-ordering  控制用例的执行顺序(重点)
pip install pytest-xdist    分布式并发执行测试用例(重点)
pip install pytest-dependency   控制用例的依赖关系 (了解)
pip install pytest-rerunfailures   失败重跑(了解)
pip install pytest-assume          多重较验(了解)
pip install pytest-random-order  用例随机执行(了解)
pip install pytest-html            测试报告(了解)

pytest 执行顺序控制

  • pytest --collect-only 收集的时候是按照编写的顺序收集的
  • pytest -vs 按照收集的顺序去执行,每个模块中按照从上到下顺序执行


场景:
对于集成测试,经常会有上下文依赖关系的测试用例。
比如 10 个步骤,拆成 10 条 case,这时候能知道到底执行到哪步报错。
用例默认执行顺序:自上而下执行
解决:
可以通过 setup,teardown 和 fixture 来解决。也可以使用对应的插件。
安装:pip install pytest-ordering
用法:@pytest.mark.run(order=2)
注意:多个插件装饰器(>2)的时候,有可能会发生冲突

pytest测试用例并行运行与分布式

Pytest 并行与分布式执行

场景 1:
测试用例 1000 条,一个用例执行 1 分钟,一个测试人员执行需要 1000 分钟。
通常我们会用人力成本换取时间成本,加几个人一起执行,时间就会 缩短。
如果 10 人一起执行只需要 100 分钟,这就是一种分布式场景。

场景 2:
假设有个报名系统,对报名总数统计,数据同时进行修改操作的时候有可能出现问题,
需要模拟这个场景,需要多用户并发请求数据。

解决:
使用分布式并发执行测试用例。分布式插件:pytest-xdist
安装及运行: pip install pytest-xdist


pytest -n 4 ,电脑是四核的可以直接用
不确定电脑是几核的,可以用pytest -n auto,自动调取空闲的cpu去完成用例的执行

注意: 用例多的时候效果明显,多进程并发执行,同时支持 allure

分布式执行测试用例原则

  • 用例之间是独立的,不要有依赖关系
  • 用例执行没有顺序,随机顺序都能正常执行
  • 每个用例都能重复运行,运行结果不会影响其他用例

pytest 内置插件 hook 体系

pytest hook 介绍

pytest hook 介绍

  • 是个函数,在系统消息触发时被系统调用
  • 自动触发机制
  • Hook 函数的名称是确定的
  • pytest 有非常多的勾子函数
  • 使用时直接编写函数体

pytest 执行顺序

site-package/_pytest/hookspec.py

....
pytest_addoption :  添加命令行参数,运时会先读取命令行参数
pytest_collection_modifyitems : 收集测试用例,收集之后(改编码,改执行顺序)
pytest_collection_finish:收集之后的操作
pytest_runtest_setup:在调用 pytest_runtest_call 之前调用
pytest_runtest_call:调用执行测试的用例
pytest_runtest_makereport:运行测试用例,返回setup,call,teardown的执行结果
....

简单的例子

def pytest_runtest_setup(item):    
  # 执行测试用例前执行的setup方法    
  print("setting up", item)

def pytest_runtest_call(item):    
  # 调用执行测试的用例
  print("pytest_runtest_call")

def pytest_runtest_teardown(item):   
  #  执行测试用例后执行的teardown
  print("pytest runtest teardown",item)

总结

  • 1、hook 函数名字固定
  • 2、hook 函数会被自动执行
  • 3、执行是有先后顺序的
  • 4、pytest 定义了很多 hook 函数,可以在不同阶段实现不同的功能


去hookspec.py文件中查找,想实现哪个就把名字复制过来,一般会放在conftest.py文件中,在项目的根目录下,执行用例的时候,会先初始化这个文件,把hook都初始化后,运行时候就会自动执行