Hari Jiang's Mind Palace

About Blog Email Feed

13 Dec 2015
用社区公认最佳工具链完成python测试

一名有经验的开发者应该明白测试的重要性。

当产品经理提出一个个新需求,老板一遍遍的催促着提高效率。

在欣赏凌晨四点美丽的夜景隔日,拖着疲惫的身心晃到公司门口,伴随着咖啡的振奋告诉自己今天也要努力工作,此时传来的一声 “怎么又出BUG了!!XXX过来看一下”,我相信着对于任何一个程序员都是崩溃的,尤其是当实现新功能时,正享受着解决者一个又一个问题的膨胀感,却突然被打断,面对着项目经理头顶的反光惭愧的低下头,今天剩下的时间很有可能就要花在修复bug上,更恐怖的是修复又带来新的bug,新功能怎么办?加班,于是又开始重复着日复一日的轮回..

残酷的资产阶级不会体谅程序员的艰辛,只会一遍遍的榨压和责怪,身为弱势群体,我们唯有自己保护自己,而测试就是保护我们不受打断的工具!

笔者最近使用python,因为没能找到关于python测试较好的简介,我选择了几个github上的明星项目来学习它们的测试实践,对于所用的工具链,结果惊人的一致

pytest

pytest 是一个兼容 unittest 和 nosetest 的测试框架,结果输出非常友好 在 assert a == b 语句中如果测试失败会在结果中打印 a 和 b 的值,并会标注字符串中哪些字符不同,列表中的第几项错误等等.. 并且提供了 fixture 等测试必备功能

https://github.com/pytest-dev/pytest

pytest本身的测试非常完善,可以参考该项目的各种配置及测试方法

tox

tox 是个为 python 准备不同运行环境的工具,通过不同配置可以使用不同的版本解释器来执行代码,很多项目利用 tox 和 travic-ci 来测试对不同版本 python 的支持 最佳实践请见 pytest

https://testrun.org/tox/latest/

笔者最近在开发一个自动生成测试的工具也是使用了上述两个库,测试虽然表面上花费了时间,但长远看是非常必要的,无论是对程序稳定性的保证,还是对未来重构工作的铺垫,有着完善的测试都是非常有利的

但如果某些程序员实在懒到了一行测试都不写,也是有解决方法的(毕竟程序员最讨厌的就是写测试和文档,其次讨厌别人不写测试不写文档)

zerotest

推荐下前几日我做的测试工具 zerotest

这是个懒人用的 API 集成测试生成工具,如果适合您的需求的话欢迎使用(也很欢迎提issue)

通过发送一些请求,设置一些测试选项,会自动生成 python 测试代码, 运行测试时使用的是 pytest 所以提示非常友好

更加具体的介绍可以看 github repo

https://github.com/jjyr/zerotest

集成测试与单元测试

集成测试与单元测试该选哪个?笔者认为这个问题并不成立,一个好的测试需要看具体场景和需求,有时只需要几个关键地方的单元测试,有时需要mock server或集成测试

往往集成测试与单元测试是共存关系,关键的抽象层逻辑使用单元测试 方便定位错误,而集成测试来保证最后的接口,笔者在 zerotest 中也是这么做的,在拥有一定单元测试的基础上 使用一个线程来启动简单的 mock server, 然后通过多进程调用命令行来测试最后结果,保证 command line 基本可用。

这里有个小技巧,在 socket 监听时可以选择 0 作为 port 的参数,这样会分配到当前最小可用端口,我们可以把 socket 关闭再把取到的端口当成参数传到 server 启动命令中,这个技巧可以让我们在 travic-ci 这种环境里启动 server 时避免端口冲突

总而言之 适当的测试并不会拖慢开发速度,这些测试对我们的代码提供了保障,可以使程序员在繁忙中仍能有自信的 fix bug,节省了很多反复修复的时间,测试对任何项目都是有益的


Til next time,
Hari Jiang 2015.12.13

avatar

About Blog Email Feed