一直想弄弄清这里的东西,一直各种因素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_开头命名,这样方便区分和被发现。

例如:

  1. def pytest_runtest_makereport(item, call):
  2. if "incremental" in item.keywords:
  3. if call.excinfo is not None:
  4. parent = item.parent
  5. parent._previousfailed = item

二、在启动工具中,发现plugin的顺序

pytest通过以下几种方式加载plugin模块:

  • 加载所有的内置插件

  • 加载所有通过setuptools入口点注册的插件

  • 通过预扫描命令行中,-p name选项,在实际解析命令行之前加载指定的插件

  • 加载通过命令行推断出的所有confest.py文件:

    1. - 如果未指定测试路径,则使用当前dir作为测试路径
    2. - 如果存在指定测试路径,那么加载conftest.pytest * / conftest.py,相对于第一个测试路径

    要注意的是,在工具启动是,pytest是找不到藏在更深的子目录里的confest.py文件的,所以,最好将confest.py保存在顶级的测试或者项目的根目录。

  • 通过在confest.py文件中的pytest_plugin指定的变量,递归加载所有的插件

三、confest.py,本地每一级目录的插件

本地的confest.py插件包含了hook实现的指定目录,hook会话 和运行测试,会调用confest.py文件中定义的,更加靠近系统根目录的hook函数。

例如:下面是实现pytest_runtest_setup的示例(hook函数),只是为了在子目录中调用而不是为其他目录调用

  1. #a/conftest.py:
  2. def pytest_runtest_setup(item):
  3. # 在目录a中的运行每个test文件 都调用这个hook
  4. print ("setting up", item)
  1. #a/test_sub.py:
  2. def test__sub():
  3. pass
  1. #与目录a平级test_flat.py
  2. def test_flat():
  3. pass

那么在运行, test_flat()时候,是看不到 "setting up"的

(这里待研究结束补充)

那么在运行,a/test_sub.py的时候就可以看到 "setting up"

四、编写自己的插件

如果你想编写插件,可以从以下几种复制很实用的例子:

  • 自定义的插件实例,在yaml文件中指定指定测试
  1. 待补充
  • 内置插件,提供pytest自己的功能
  • 许多外部插件提供额外的功能

    所有的这些插件,都以hook或者fixture方式实现了新增的功能

7.pytest中的 plugin的更多相关文章

  1. 2、pytest中文文档--使用和调用

    目录 使用和调用 通过python -m pytest调用pytest *pytest执行结束时返回的状态码 pytest命令执行结束,可能会返回以下六种状态码: *获取帮助信息 最多允许失败的测试用 ...

  2. pytest中怎么实现参数化?

    我们在组自动化项目中,肯定会遇到需要数据驱动的地方,在unittest中我们直接采用ddt的方式,但是在pytest中我们不能用ddt来实现,所以我们采用了参数化的方式来实现 那么具体怎么完成这个参数 ...

  3. pytest中怎么引用前置中的变量

    本文主要总结的是pytest中的前置后置怎么返回参数 我们在做自动化的过程中,如果运用的是pytest的话,会遇到怎么使用前置条件中的变量 比如: @pytest.fixture() def init ...

  4. pytest-pyppeteer:在pytest中运行pyppeteer

    pytest-pyppeteer pytest-pyppeteer是我写的一个 pytest 插件,支持在 pytest 中运行pyppeteer,起因是为了解决工作中的一个测试需求,现在将其开源并做 ...

  5. utittest和pytest中mock的使用详细介绍

    头号玩家 模拟世界 单元测试库介绍 mock Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为. python3.3 ...

  6. 『德不孤』Pytest框架 — 12、Pytest中Fixture装饰器(二)

    目录 5.addfinalizer关键字 6.带返回值的Fixture 7.Fixture实现参数化 (1)params参数的使用 (2)进阶使用 8.@pytest.mark.usefixtures ...

  7. 『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件

    目录 1.conftest.py文件介绍 2.conftest.py的注意事项 3.conftest.py的使用 4.不同位置conftest.py文件的优先级 5.conftest.py中Fixtu ...

  8. 1、pytest中文文档--安装和入门

    目录 安装和入门 安装pytest 创建你的第一个测试用例 执行多个测试用例 检查代码是否触发一个指定的异常 在一个类中组织多个测试用例 申请一个唯一的临时目录用于功能测试 安装和入门 Python版 ...

  9. 3、pytest中文文档--编写断言

    目录 编写断言 使用assert编写断言 编写触发期望异常的断言 特殊数据结构比较时的优化 为失败断言添加自定义的说明 关于断言自省的细节 复写缓存文件 去使能断言自省 编写断言 使用assert编写 ...

随机推荐

  1. LINK : fatal error LNK1104: cannot open file "mfc42d.lib"

    VC++6.0上建立了个基于MFC应用程序,在编译时候没出现错误,但在LINK的是时候出现这样的错误:Linking...LINK : fatal error LNK1104: cannot open ...

  2. vs2017编译并配置libcurl入门教程

    libcurl可以用来发送http请求,是c/c++发送http请求常用的库 下载libcurl源码包: libcurl下载地址:https://curl.haxx.se/download.html ...

  3. 回顾2017系列篇(三):UX设计大会,都预示了哪些设计趋势

    2017已接近尾声,在这一年中,无数的UX大会和设计大会在世界各地召开.每一场会议的召开,都是界内精英人士经验的交流和智慧的碰撞.虽然2017年的会议都已过去,但每场会议上的话题探讨,尤其是界内精英们 ...

  4. SQL游标 数据库编程样例

    --处理file与folder中的order -- 声明变量 DECLARE @fileid AS INT, @folderid AS INT, @order AS INT, @oldFolderId ...

  5. windows server2012如何开启mysql远程登录

    开发的首要任务就是要搭建起自己的服务器,下面主要是我这搭建记录下 我的各种环境 服务器为Windows server2012  安装的MySQL数据的版本是5.6.10 ,64位.当然了版本对于安装没 ...

  6. Qt的翻译文件QTranslator不能使用问题总结(原)

    笔者今天在自己工程中使用翻译文件,发现没有起作用,反复查找,发现是用宏定义了命名空间,生成.ts文件时,不会加上命名空间,所以生成的.qm文件在实际使用时,会无法找到对应的语句. 如果将宏定义的命名空 ...

  7. command >/dev/null 2>&1 解说

    0:表示键盘输入(stdin)1:表示标准输出(stdout),系统默认是1 2:表示错误输出(stderr) command >/dev/null 2>&1 &  == ...

  8. save is not valid without active transaction

    org.hibernate.HibernateException: save is not valid without active transaction at org.hibernate.cont ...

  9. 在Mac OS下配置PHP开发环境

    实在厌倦了windows无缘无故的宕机.病毒了吗,哈哈哈,这个跟我都没什么关系.准备使用下现如今牛X到不行的云平台没有办法只好研究下PHP. 现在的云平台支持的语言只有PHP.Java和Python. ...

  10. vmware虚拟机监控数据

    在vsphere产品中内建一个监控所有虚机包括主机资源的插件,叫做vcenter servcie status,这个插件的主要功能是记录当前虚拟机资源的cpu.硬盘.内存和网络等相关信息.通过它可以查 ...