在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了。今天继续跟着官方文档学习更多知识点。

一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件,实现了配置、搜集、运行和报告的所有方面的功能。

通常 pytes t中的插件有如下 3 类:

  • 内置插件 : 从 pytest 内部的_pytest目录加载
  • 外部插件 : 通过setuptools入口发现的模块
  • conftest.py: 在测试目录中自动发现的模块

第一个内置插件的路径在/Lib/site-packages/_pytest这里,有兴趣的可以看下。

第三个conftest.py我们也很熟悉了,像之前写fixture函数以及本地hooks函数插件,都是在conftest.py中。

第二个外部插件中提到的setuptools是什么呢?

其实这是 pytest 的一个特性库,通过这个setuptools,我们的插件代码可以通过pip安装并上传到PyPI。

本章就来开发一个可以 pip 安装的第三方插件

一、cookiecutter-pytest-plugin

但是在开发之前,先来了解下cookiecutter-pytest-plugin这个项目。这是官方文档中强烈推荐的,可以帮助我们快速生成一个规范标准的插件项目。

项目地址:https://github.com/pytest-dev/cookiecutter-pytest-plugin

跟着项目介绍的文档一步步来就行。

先安装该项目:

$ pip install cookiecutter

然后可以使用这个工具开始创建我们自己的插件项目了。

$ cookiecutter https://github.com/pytest-dev/cookiecutter-pytest-plugin

一步步跟着出现的指令提示,输入对应的项目信息即可。

最后的输入的一个测试插件项目是这样的。

二、开发第三方插件

重新写一个插件,可以通过命令行,来输出搜集到的测试用例的相关信息并保存到csv文件中去。

可以直接在上面生成好的插件项目模板里写我们自己的代码。

  • 红色文件,就是我们插件代码的主体部分
  • 绿色部分,是我们自测插件代码的地方

最后还有个重要文件setup.py,因为插件模板项目自动生成了,里面就是插件项目的相关信息,以及依赖。

1. 插件主体代码

import pytest
import csv
import repytest_plugins = 'pytester'def pytest_addoption(parser):group = parser.getgroup("testplan")group.addoption("--testplan",action="store",default=None,help="生成包含测试元数据的CSV并退出,而不运行测试")def pytest_collection_modifyitems(session, config, items):path = config.getoption('testplan')if path:with open(path, mode='w') as fd:writer = csv.writer(fd, delimiter=',', quotechar='"',quoting=csv.QUOTE_MINIMAL)writer.writerow(["title", "description", "markers"])for item in items:title = item.nodeiddescription = re.sub('\n\s+', '\n', item.obj.__doc__.strip())markers = ','.join([m.name for m in item.iter_markers()])writer.writerow([title, description, markers])pytest.exit(f"测试计划已生成: {path}")
  • pytest_addoption: 添加命令行参数
  • pytest_collection_modifyitems: 重写搜集用例的这个钩子函数

主要就是把搜集到的case的标题,描述和markers这3样写到 csv 文件中。

2. 测试插件代码

插件主体代码写好了,我们需要自测一下。

按之前的话,可以直接把插件代码写到本地conftest文件里作为本地代码直接调用测试即可。

不过 Pytest 附带一个名为pytester的插件,它可以帮助我们为插件代码编写测试。这个插件在默认情况下是禁用的,所以在使用之前要先开启。

在 test 目录下的 conftest 文件中声明即可。

接下来上插件测试代码,然后讲解一下相关用法:

import pytestdef test_pingguo(pytester):"""Make sure that our plugin works."""pytester.makeini("""[pytest]markers =nightlyperformanceintegrationhighmediumlow""")pytester.makepyfile("""import pytest@pytest.mark.performancedef test_one():\"""test_one\"""assert False@pytest.mark.highdef test_two():\"""test_two\"""assert Truedef test_three():\"""test_three\"""assert Trueclass TestPingGuo():@pytest.mark.high@pytest.mark.performancedef test_a(self):\"""TestPingGuo.test_a,测试\"""assert Falsedef test_b(self):\"""TestPingGuo.test_b测试\"""assert True""")# run all tests with pytestresult = pytester.runpytest("--testplan=testplan.csv")

这里最重要的就是pytester提供的方法,比如上面用到的:

  • pytester.makeini:因为我的测试case上加了不同的 marker,这些是需要注册在 ini 文件里的
  • pytester.makepyfile: 这里就是写的测试用例代码了

其实就是在对应的方法里,写上我们的原生代码,只是需要被""" """包起来,当做字符串,然后 pytest 会自行解析我们的代码,在临时目录里创建对应的文件然后运行。

不仅如此,还可以创建其他的文件,比如conftest。这是源码,有兴趣的可以进去一探究竟。

pytester.runpytest("--testplan=testplan.csv")这里可以添加要执行的命令行参数。

运行测试

直接运行测试代码,看下结果。

注意我这里的文件也是被生成在了临时目录里,打开控制台输出的路径就可以找到。

打开 csv 文件验证一下结果,输出正确。

3. 打包

回到项目根目录,命令行输入:

python setup.py sdist build

完成后会生成dist目录,下面就有对应的包。

4. 上传 pypi

没有账号的要先注册登录一下,记得要去对应填写的邮箱里点击激活认证才可以。

接着安装twine,我能使用这个工具来上传。

pip install twine

安装完成后就可以执行了上传:

twine upload dist/*

提示需要输入注册的账号和密码,最后完成上传。

上传完成后就可以在pypi中打开自己的插件主页了,现在其他小伙伴也可以安装插件了。

【pytest官方文档】解读- 开发可pip安装的第三方插件相关推荐

  1. linux3.10.53编译,根据官方文档在Linux下编译安装Apache

    根据官方文档在Linux下编译安装Apache 前言 永远记住官方文档才是最准确的安装手册,这篇文章仅为对官方文档的解读和补充,学习提升务必阅读官方文档: http://httpd.apache.or ...

  2. pytest官方文档 6.2 中文翻译版(第十章):警告捕捉

    从3.1版本开始,pytest会在整个测试执行的过程中自动的捕捉警告: # content of test_show_warnings.py import warningsdef api_v1():w ...

  3. gateway的官方文档解读

    之前公司用了springcloud的gateway.被一个伙伴留下了一堆的坑,没办法只能从头梳理. 第一步就是确定架构, gateway+consul+springboot 第二步就是确定一个flag ...

  4. torch.unsqueeze官方文档解读

    文章目录 前言 1. 功能介绍 2. 参数说明 3. 代码举例 前言 本文是对torch.unsqueeze官方文档的解读,加入部分代码示例,方便理解. 1. 功能介绍 torch.unsqueeze ...

  5. 蓝牙MESH 官方文档解读 翻译(1)

    已从事两年的物联网无线通信相关应用开发,但在接触蓝牙MESH相关技术时,一般都需要查询官方机构的文档,规范等,但发现网络上相应的中文资料较少,故对相关官方文档结合自身开发经验进行了翻译. 此部分摘自官 ...

  6. Mybatis官方文档解读

    跟着Mybatis的官方文档总结一下.~ 简介 什么是mybatis? mybatis是一款优秀的持久层框架,它支持自定义SQL,存储过程以及高级映射.Mybatis免除了所有的JDBC代码以及 设置 ...

  7. splash官方文档解读(翻译)

    安装 splash是一个类似于selenium的自动化浏览器,不过它与selenium还是有很大区别的:比如splash是异步的,splash暴露httpAPI来自动化操作. 安装很简单,需要先安装d ...

  8. 【官方文档】Fluent Bit 数据管道之过滤插件(Kubernetes)

    文章目录 1. 配置参数 2. 处理 'log' 值 3. Kubernetes Annotations 3.1. Pod 定义中的 annotations 示例 3.1.1. 建议一个解析器 3.1 ...

  9. 【官方文档】Fluent Bit 数据管道之输入插件(Tail)

    文章目录 1. 配置参数 2. 多行支持 2.1. 多行核心 (v1.8) 2.2. 多行和容器 (v1.8) 2.3. 旧的多行配置参数 2.4. 旧的 Docker 模式配置参数 3. 入门指南 ...

最新文章

  1. iOS开发火了九年,这些错误你还在犯嘛?
  2. CRM中间件里parent not ok的错误消息如何处理
  3. [HDU517] 小奇的集合
  4. DBDesigner 4 与 MySql 5 不能连接主要是驱动的原因
  5. mysql数据库更新语句效率_MySQL数据库优化
  6. java maxheap_Java底层PriorityQueue 优先队列——基于MaxHeap最大堆
  7. 阿里正在使用一种更灵活的软件集成发布模式
  8. fiddler之数据统计(statistics)
  9. 优化网站性能 提高网站速度访问速度的14条实践(转)
  10. 解决办法:Could not determine java version from ‘11.0.8‘.
  11. 7.2.5 dps 测试软件,魔兽世界7.2.5兽王猎DPS有什么改动测试
  12. PE系统-微PE工具箱V2.1 - 有情怀的PE - PE中的战斗鸡无广告VIP精品
  13. 钉钉日志范文100篇_关于公司各岗位钉钉日志撰写标准
  14. 2021-11-1-无法在此设备上激活WINDOWS因为无法连接到你的组织的激活服务器
  15. 面试官系列:前端高频面试题汇总 | Vue面试题
  16. 网页表格线框html,网页设计表格单元格线条及边框设置
  17. 用python爬取百科糗事的小项目
  18. 2001年图灵奖--奥尔-约翰·戴尔和克里斯登·奈加特简介
  19. AE影视后期特效制作深入剖析AE表达…
  20. winform pdf转图片.jpg或.png(O2S.Components.PDFRender4NET)

热门文章

  1. Give Candies
  2. 城市建筑Shp转stl模型文件说明
  3. 泊松圆盘采样(Poisson Disk Sampling)代码实现
  4. 用友安装ins信息服务器,Win下安装用友U步骤及设置.docx
  5. 关于fi dd ler 手机抓包 网卡地址地址_大年别闲着,跟我来学tcpdump抓包
  6. 程序员2014精华本
  7. 关于Python tkinter中出现的坑(界面Tk()+图片显示)
  8. 本人男,27岁技术经理,收入太高,心头慌得一比
  9. 《游戏机制——高级游戏设计技术》一2.6 将突现和渐进相结合
  10. 第七章第二节:Java类和对象之封装、包和static成员