7.pytest中的 plugin
Posted 把苹果咬哭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.pytest中的 plugin相关的知识,希望对你有一定的参考价值。
一直想弄弄清这里的东西,一直各种因素delay,今天务必要搞搞清
一、先从官方文档上尝试去解读下什么是plugin和hook
网上有现成的对你适用的插件时候,我们可以直接pip安装,拿来使用即可;但是有的时候,我们需要根据我们的实际需求定制些插件,
这时候,就需要我能自己写插件了,这里带出了plugin。
1.那么插件里面包含着什么呢?
——一个plugin里可能包含着一个或者多个hook函数(hook functions),在hook函数里面写用来实现我们想要的功能的细节。而pytest通过
调用指定的hook函数来实现配置、调用、报告等方面,调用的规则方式如下:
- 内置的插件:从pytest的内部_pytest目录加载
- 外部插件:通过setuptools入口发现需要调用的模块
- conftest.py插件:在测试目录中自动发现的模块
2.原则上来讲,每个hook函数,都可以被N个Python函数调用,这个N的数量,就是已经注册了并且可以实施、并且遵循一定规范的函数
(这里英文字面直译的,可能不对),这里的一个规范就是,所有的hook函数,都需要pytest_开头命名,这样方便区分和被发现。
例如:
def pytest_runtest_makereport(item, call):
if "incremental" in item.keywords:
if call.excinfo is not None:
parent = item.parent
parent._previousfailed = item
二、在启动工具中,发现plugin的顺序
pytest通过以下几种方式加载plugin模块:
- 加载所有的内置插件
- 加载所有通过setuptools入口点注册的插件
- 通过预扫描命令行中,-p name选项,在实际解析命令行之前加载指定的插件
加载通过命令行推断出的所有confest.py文件:
要注意的是,在工具启动是,pytest是找不到藏在更深的子目录里的confest.py文件的,所以,最好将confest.py保存在顶级的测试或者项目的根目录。- 如果未指定测试路径,则使用当前dir作为测试路径 - 如果存在指定测试路径,那么加载conftest.py和test * / conftest.py,相对于第一个测试路径
通过在confest.py文件中的pytest_plugin指定的变量,递归加载所有的插件
三、confest.py,本地每一级目录的插件
本地的confest.py插件包含了hook实现的指定目录,hook会话 和运行测试,会调用confest.py文件中定义的,更加靠近系统根目录的hook函数。
例如:下面是实现pytest_runtest_setup的示例(hook函数),只是为了在子目录中调用而不是为其他目录调用
#a/conftest.py:
def pytest_runtest_setup(item):
# 在目录a中的运行每个test文件 都调用这个hook
print ("setting up", item)
#a/test_sub.py:
def test__sub():
pass
#与目录a平级test_flat.py
def test_flat():
pass
那么在运行, test_flat()时候,是看不到 "setting up"的
(这里待研究结束补充)
那么在运行,a/test_sub.py的时候就可以看到 "setting up"
四、编写自己的插件
如果你想编写插件,可以从以下几种复制很实用的例子:
- 自定义的插件实例,在yaml文件中指定指定测试
待补充
- 内置插件,提供pytest自己的功能
- 许多外部插件提供额外的功能
所有的这些插件,都以hook或者fixture方式实现了新增的功能
以上是关于7.pytest中的 plugin的主要内容,如果未能解决你的问题,请参考以下文章
markdown 链接,片段,提醒,收集点作为重新访问WordPress插件开发期间的笔记#WordPress #Plugin #PHP #Refere