Python 任务自动化工具 tox 教程

在我刚翻译完的 Python 打包系列文章中,作者提到了一个神奇的测试工具 tox,而且他本人就是 tox 的维护者之一 。趁着话题的相关性,本文将对它做简单的介绍,说不定大家在开发项目时能够用得上 。

Python 任务自动化工具 tox 教程

文章插图
 
Command line driven CI frontend and development task automation tool
命令行驱动的 CI 前端和开发任务自动化工具
tox 的项目地址是:https://github.com/tox-dev/tox
其核心作用是支持创建隔离的 Python 环境,在里面可以安装不同版本的 Python 解释器与各种依赖库,以此方便开发者做自动化测试、打包、持续集成等事情 。
简单来说,tox 是一个管理测试虚拟环境的命令行工具 。 它已存在多年且广被开发者们使用,例如,著名的云计算平台 OpenStack 也采用了它,作为最基础的测试工具之一 。
1、tox 能做什么?细分的用途包括:
  • 创建开发环境
  • 运行静态代码分析与测试工具
  • 自动化构建包
  • 针对 tox 构建的软件包运行测试
  • 检查软件包是否能在不同的 Python 版本/解释器中顺利安装
  • 统一持续集成(CI)和基于命令行的测试
  • 创建和部署项目文档
  • 将软件包发布到 PyPI 或任何其它平台
tox 官方文档中列出了 40 余种使用场景的示例,详细的列表可查看:https://tox.readthedocs.io/en/latest/examples.html
Python 任务自动化工具 tox 教程

文章插图
 
2、tox 怎么配置?关于它的用法:使用pip install tox 安装,使用tox 运行全部测试环境,和tox -e envname 运行指定的环境 。还有不少的命令行参数,通过tox -h 查看 。
tox 的行为由其配置文件控制,当前它支持 3 种配置文件:
  1. pyproject.toml
  2. tox.ini
  3. setup.cfg
以 tox 项目自己的 tox.ini 配置内容为例,可以看到它是这样配置的(https://github.com/tox-dev/tox/blob/master/tox.ini):
Python 任务自动化工具 tox 教程

文章插图
 

Python 任务自动化工具 tox 教程

文章插图
 
每个[xxx]及其下方内容组成一个章节(section),每个章节间使用空行作间隔 。
[tox]下面是全局性的配置项,envlist 字段定义了 tox 去操作的环境 。[xxx]下面是 xxx 虚拟环境的配置项,[xxx:yyy]继承 xxx 的配置,同时其自身配置项的优先级更高 。
对于每个虚拟环境,可用的配置项很多,例如常用的有:description(描述信息)、basepython(Python解释器版本)、deps(环境依赖项)、commands(命令语句)等等 。
tox 还支持作变量替换,它提供了一些内置的基础变量(全局的或对于虚拟环境的):{toxinidir}、{homedir}、{envname}、{envdir}等等 。
除了基础性的变量替换,它还支持这些高级用法:
  • 取操作系统的环境变量:{env:KEY},效果等同于os.environ['KEY']。可以变化成:{env:KEY:DEFAULTVALUE},在取不到环境变量时则使用默认值;{env:KEY:{env:DEFAULT_OF_KEY}},达到 if-else 的取值效果
  • 传递命令行参数:{posargs:DEFAULTS},当没有命令行参数时,使用 DEFAULTS 值 。使用方式:tox arg1 arg2 传两个参,或者tox -- --opt1 arg1 将“-- opt1 arg1”作为整体传入 。
  • 章节间传值:{[sectionname]valuename},不同章节的内容可以传递使用 。
  • 交互式控制台注入:{tty:ON_VALUE:OFF_VALUE},当交互式 shell 控制台开启时,使用第一个值,否则使用第二个 。pytest 在使用“--pdb”时,是这样的例子 。
花括号“{}”除了可以做变量替换使用,它还可以作为“或关系”判断的取值 。直接看下面的例子:
【Python 任务自动化工具 tox 教程】[tox]envlist={py27,py36}-django{15,16}{py27,py36}-django{15,16} 的 2 组花括号内各有 2 个值,它们实际可以组合成 4 个环境:py27-django15、py27-django16、py36-django15、py36-django16 。
关于 tox 有哪些配置项、使用条件、什么含义、高级用法等等内容,可在官方文档中查看:https://tox.readthedocs.io/en/latest/config.html
3、tox 的插件化除了自身强大的可配置性,tox 还具有很强的可扩展性,它是可插拔的(pluggable),围绕它产生了一个极为丰富的插件生态 。
使用pip search tox,可以看到数量众多的“tox-”开头的库,它们都是 tox 的插件包 。其中不乏 setuptools、pipenv、conda、travis、pytest、Docker 等被大家熟知的名字 。


推荐阅读