程序员大咖
点击右侧关注,免费进阶高级!
作者:夏洛之枫
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。
领取专属 10元无门槛券
私享最新 技术干货