pytest插件开发笔记

上一篇博客解决了写爬虫测试时候的一个痛点:复制粘贴太多的重复代码。可还有一个比较烦人的地方,即使test的代码可以自动生成,但还是需要人工去找到底什么地方出现了外部请求,如果 检查外部请求->下载对应的资源并生成mock的代码这部分能够自动完成就好了。今天下手搞了下。

我们的CI是通过pytest的conftest强制必须mock掉HTTP请求的。所以我想这个也可以通过pytest的插件机制来解决。于是就写了一个pytest插件来搞。

Github地址:https://github.com/laixintao/pytest-mock-helper

Pypi: https://pypi.org/project/pytest-mock-helper/

写这个插件花了大约两个小时,原理非常简单。在pytest启动的时候将requests库的requests.adapters.Adapter.send方法替换掉,加入我们要做的逻辑。这么做的灵感来自于另外一个pytest插件:pytest-blockage。这个插件的作用是让pytest强制block掉HTTP请求。和我们在conftest中做的事情一样,但是插件更合理一些,因为我们在不同的项目中就要复制conftest中的代码。不过要注意的是这个插件很久不更新了,不支持Python3。所以如果有类似的需求(在CI中强制Mock HTTP请求)建议使用我的插件。

能如此快速写出一个插件要得益于pytest超赞的文档啊。writing_plugins这一页写的很详细。有一些需要注意的地方,在这篇博客中我记一下:

插件载入的顺序:

  1. 内置的_pytest文件夹中的插件
  2. 外部安装的插件。通过搜索setuptools提供的entry_points查找pytest11,这个很有意思的,不知道为什么会是pytest11,看起来像是开发者随手写的。如果我们自己写插件,就要在setup.py中提供一个pytest11的entry_points
  3. 载入conftest.py

快速参考一些插件:

  1. 文档提供了一个非常简单的Yaml文件测试的插件代码,源代码一看就能懂
  2. 默认插件的源代码
  3. 这里有一个搭建在Heroku上面的pytest兼容性列表,列出了第三方写的插件。这个我猜是监控的pypi,因为我自己写的插件昨天上传到了pypi,今天就在这个列表看见了。不过它判断是否兼容应该是判断的setup.py中的classifiers。我啥也没写就被无情地判断成了不兼容Pyhton27也不兼容Python3。
  4. 一个工具cookiecutter-pytest-plugin,用来生成一个插件的模板。(我不是很推荐这种东西,刚开始用个最小的能跑起来的东西就可以了)

另外发现往pypi.python.org上传东西已经过时了,Api会返回Upload failed (410) Gone。现在正处于迁移的过程,新的包应该向pypi.org提交。而且应该用twine上传。

新的pypi酷炫多了,Python社区在迭代方面真是勇敢啊。都是好事儿。

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注