pytest单元测试框架插件开发实践

程序员大咖

点击右侧关注,免费进阶高级!

作者:夏洛之枫

zhihu.com/people/cnaafhvk

从三年前转行之后,我一直都不敢称自己是专业的程序员。知道专业的程序员都写单元测试,为了假装专业,于是我学习了一下pytest。

按照惯例,检验我学习成果的方法就是造个轮子,于是我根据写单元测试时发现的痛点,写了一个插件

现在分享出来,供大家学习和参考。

既然说到痛点,想必写过单元测试的人都知道,由于我们有时无法直接访问数据库等服务,我们需要mock掉一些方法和属性,但mock是一个很痛苦的事情,而且写起来也相当于不优雅,而我这个插件解决的主要问题就是减轻mock带来的痛苦。通过一个装饰器,mock数据简直不费吹灰之力。

看名字你肯定可以猜的出来,这个插件其实是为我的异步web框架开发的:

没错,apistellar前身就是star-builder。我之前写过几篇文章介绍过他。因为同事告诉我star-builder简称SB太过于美妙,于是一气之下我就把这个包重命名了。现在apistellar在我们公司内部已经得到了广泛使用,作为少有的ASGI框架,有兴趣的同学可以学习一下。

言归正传,作为apistellar的测试插件,最初肯定是为apistellar服务的,但后来感觉mock是所有人的痛点,由于我们公司好多服务还是基于python2的,于是我针对mock这个功能做了一下兼容。当然mock只是其功能之一,同时他还支持针对apistellar web服务的接口测试,简而言之,他可以启动一个apistellar的服务来测试某个模块提供的RESTful接口。

当然这节主讲更通用的单元测试mock。

现在我们有一个模块,他的包地址为file.file::File

其中的两个load方法都数据库中获取数据返回一个File对象,现在我们需要mock掉load操作,让其返回我们渴望的数据。

怎么办?

pytest传统的做法应该是这样:

我们需要使用monkeypatch改掉我们想mock的那个方法和属性,这样的实现很不优雅,存在很多多余的函数,让代码显示相当冗余。

现在不同了,我们有了pytest-apistellar,让我们看看他是怎么做的:

factories模块的代码在这:

正如注释所写,pytest-apistellar支持五个pytest作用域的mock,对于简单mock,直接在装饰器加入返回值数据就可以。同时pytest-apistellar还支持mock环境变量。具体的可以自行查看README。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181001B19BZ700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券