在我刚翻译完的 Python 打包系列文章中,做者提到了一个神奇的测试工具 tox,并且他本人就是 tox 的维护者之一。趁着话题的相关性,本文将对它作简单的介绍,说不定你们在开发项目时可以用得上。html
> Command line driven CI frontend and development task automation tool > > 命令行驱动的 CI 前端和开发任务自动化工具前端
tox 的项目地址是:https://github.com/tox-dev/toxpython
其核心做用是支持建立隔离的 Python 环境,在里面能够安装不一样版本的 Python 解释器与各类依赖库,以此方便开发者作自动化测试、打包、持续集成等事情。git
简单来讲,tox 是一个管理测试虚拟环境的命令行工具。 它已存在多年且广被开发者们使用,例如,著名的云计算平台 OpenStack 也采用了它,做为最基础的测试工具之一。github
细分的用途包括:docker
tox 官方文档中列出了 40 余种使用场景的示例,详细的列表可查看:https://tox.readthedocs.io/en/latest/examples.htmlshell
关于它的用法:使用pip install tox
安装,使用tox
运行所有测试环境,和tox -e envname
运行指定的环境。还有很多的命令行参数,经过tox -h
查看。django
tox 的行为由其配置文件控制,当前它支持 3 种配置文件:app
pyproject.toml
tox.ini
setup.cfg
以 tox 项目本身的 tox.ini 配置内容为例,能够看到它是这样配置的(https://github.com/tox-dev/tox/blob/master/tox.ini):框架
每一个[xxx]及其下方内容组成一个章节(section),每一个章节间使用空行做间隔。
[tox]下面是全局性的配置项,envlist 字段定义了 tox 去操做的环境。[xxx]下面是 xxx 虚拟环境的配置项,[xxx:yyy]继承 xxx 的配置,同时其自身配置项的优先级更高。
对于每一个虚拟环境,可用的配置项不少,例如经常使用的有:description(描述信息)、basepython(Python解释器版本)、deps(环境依赖项)、commands(命令语句)等等。
tox 还支持做变量替换,它提供了一些内置的基础变量(全局的或对于虚拟环境的):{toxinidir}、{homedir}、{envname}、{envdir}等等。
除了基础性的变量替换,它还支持这些高级用法:
os.environ['KEY']
。能够变化成:{env:KEY:DEFAULTVALUE},在取不到环境变量时则使用默认值;{env:KEY:{env:DEFAULT_OF_KEY}},达到 if-else 的取值效果tox arg1 arg2
传两个参,或者tox -- --opt1 arg1
将“-- opt1 arg1”做为总体传入。花括号“{}”除了能够作变量替换使用,它还能够做为“或关系”判断的取值。直接看下面的例子:
[tox] envlist = {py27,py36}-django{15,16}
{py27,py36}-django{15,16} 的 2 组花括号内各有 2 个值,它们实际能够组合成 4 个环境:py27-django1五、py27-django1六、py36-django1五、py36-django16。
关于 tox 有哪些配置项、使用条件、什么含义、高级用法等等内容,可在官方文档中查看:https://tox.readthedocs.io/en/latest/config.html
除了自身强大的可配置性,tox 还具备很强的可扩展性,它是可插拔的(pluggable),围绕它产生了一个极为丰富的插件生态。
使用pip search tox
,能够看到数量众多的“tox-”开头的库,它们都是 tox 的插件包。其中不乏 setuptools、pipenv、conda、travis、pytest、docker 等被你们熟知的名字。
tox 开放了挺多的 API 接口,方便其余人定制开发插件。
接下来看看 tox 是怎么运做的:
其工做流程中主要的环节有:
tox 自己定位是一个测试工具,它试图令 Pytho 测试工做变得自动化、标准化与流程化。但跟 unittest 和 pytest 这些测试框架不一样,它做用的是代码层面以外的事情,是一种项目级的工具。所以,它须要跟这些测试框架相结合,或者同时处理多种自动化任务(如跑 pep八、测代码覆盖率、生成文档等等),这样才能更好地发挥它的价值。
它的一大特点在于建立/管理虚拟环境,但这只是为了方便测试而使用的手段,所以相比其它可管理虚拟环境的工具,如 Virtualenvwrapper、conda、pipenv、poetry,它在某些方面就存在着不足。
tox 还有强大的可配置性与丰富的插件支持,这使得它在运用上具备很大的可能性与自由度。所以,很多忠实开发者仍在持续地在使用它,好比,我刚翻译好的系列文章的做者就是它的维护者之一。
最后还需补充一点,tox 使用配置文件做驱动,但配置文件仍是挺繁琐的,所以有人开发了一个跟 tox 类似的nox
,使用 Python 文件来作配置。这个项目也很受欢迎,吸引了不少项目投入其门下,例如 pipx、urllib三、Salt 等等。对该项目感兴趣的话,请查看:https://nox.thea.codes/en/stable/
公众号【Python猫】, 本号连载优质的系列文章,有喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写做、优质英文推荐与翻译等等,欢迎关注哦。