Pytest 插件介绍和开发
插件分类
插件分三种:
1.外部插件(三方开发的)
安装方式:pip install
哪里可以找到三方插件: https://pypi.org/
常用插件:
pytest-ordering
作用:指定执行顺序
使用:(fixture用法类似)@pytest.mark.run(order=1)
* 尽量不要指定用例顺序,避免发现不到问题
pytest-xdist
作用:可以让用例并行与分布式执行
使用:命令行输入 pytest -n CPU核数 xxx.py或者pytest -n auto
2.本地插件
本地插件就是fixture执行
pytest自动模块发现机制执行fixture(conftest.py存放的)
3.内置插件
内置插件是指勾子函数Hook,pytest执行其实会执行很多函数。具体执行顺序可看:https://ceshiren.com/t/topic/8807
pytest hook 介绍
- 是个函数,在系统消息触时被系统调用
- 自动触发机制
- Hook 函数的名称是确定的
- pytest有非常多的勾子函数
- 使用时直接编写函数体
*pytest执行顺序
以下就是为Hook函数,存在 ...\Python38\Lib\site-packages\_pytest\hookspec.py
如果我们需要使用,只需要将这个函数在conftest.py里面重新改写即可
root
└── pytest_cmdline_main
├── pytest_plugin_registered
├── pytest_configure
│ └── pytest_plugin_registered
├── pytest_sessionstart
│ ├── pytest_plugin_registered
│ └── pytest_report_header
├── pytest_collection
│ ├── pytest_collectstart
│ ├── pytest_make_collect_report
│ │ ├── pytest_collect_file
│ │ │ └── pytest_pycollect_makemodule
│ │ └── pytest_pycollect_makeitem
│ │ └── pytest_generate_tests
│ │ └── pytest_make_parametrize_id
│ ├── pytest_collectreport
│ ├── pytest_itemcollected
│ ├── pytest_collection_modifyitems
│ └── pytest_collection_finish
│ └── pytest_report_collectionfinish
├── pytest_runtestloop
│ └── pytest_runtest_protocol
│ ├── pytest_runtest_logstart
│ ├── pytest_runtest_setup
│ │ └── pytest_fixture_setup
│ ├── pytest_runtest_makereport
│ ├── pytest_runtest_logreport
│ │ └── pytest_report_teststatus
│ ├── pytest_runtest_call
│ │ └── pytest_pyfunc_call
│ ├── pytest_runtest_teardown
│ │ └── pytest_fixture_post_finalizer
│ └── pytest_runtest_logfinish
├── pytest_sessionfinish
│ └── pytest_terminal_summary
└── pytest_unconfigure
以下为例子:
Pytest 编写插件 - 添加命令行参数实现切换测试环境和生产环境
重写pytest_addoption hook方法
自定义命令行参数,下面自定义了一个组为manshuo , --env的命令
conftest.py
def pytest_addoption(parser):
mygroup = parser.getgroup("manshuo") # group 将下面所有的 option都展示在这个group下。
mygroup.addoption("--env", # 注册一个命令行选项
default='test', # 参数的默认值
dest='env', # 存储的变量,为属性命令,可以使用Option对象访问到这个值,暂用不到
help='set your run env' # 帮助提示 参数的描述信息
)
编写把命令行输入的参数提取出来并根据参数判断是测试环境还是生产环境的方法
conftest.py
@pytest.fixture(scope='session')
def cmdoption(request):
myenv = request.config.getoption("--env") #返回命令行参数--env,取出跟在env后面的参数
if myenv == 'test':
datapath = "data/test/data.yml"
elif myenv == 'dev':
datapath = "data/dev/data.yml"
with open(datapath) as f:
datas = yaml.safr_load(f)
return myenv,datas
编写用例并使用这个插件
test_demo.py
def test_option(cmdoption):
print(cmdoption)
检验:
命令行输入pytest --env dev test_demo.py::test_option
输出:
test_demo.py::test_option hook setup
dev environment
dev
PASSED
========================================= 1 passed in 0.03s =========================================
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具