在我刚翻译完的 Python 打包系列文章中,作者提到了一个神奇的测试工具 tox,而且他本人就是 tox 的维护者之一 。趁着话题的相关性,本文将对它做简单的介绍,说不定大家在开发项目时能够用得上 。
文章插图
Command line driven CI frontend and development task automation tooltox 的项目地址是:https://github.com/tox-dev/tox
命令行驱动的 CI 前端和开发任务自动化工具
其核心作用是支持创建隔离的 Python 环境,在里面可以安装不同版本的 Python 解释器与各种依赖库,以此方便开发者做自动化测试、打包、持续集成等事情 。
简单来说,tox 是一个管理测试虚拟环境的命令行工具 。 它已存在多年且广被开发者们使用,例如,著名的云计算平台 OpenStack 也采用了它,作为最基础的测试工具之一 。
1、tox 能做什么?细分的用途包括:
- 创建开发环境
- 运行静态代码分析与测试工具
- 自动化构建包
- 针对 tox 构建的软件包运行测试
- 检查软件包是否能在不同的 Python 版本/解释器中顺利安装
- 统一持续集成(CI)和基于命令行的测试
- 创建和部署项目文档
- 将软件包发布到 PyPI 或任何其它平台
文章插图
2、tox 怎么配置?关于它的用法:使用pip install tox 安装,使用tox 运行全部测试环境,和tox -e envname 运行指定的环境 。还有不少的命令行参数,通过tox -h 查看 。
tox 的行为由其配置文件控制,当前它支持 3 种配置文件:
- pyproject.toml
- tox.ini
- setup.cfg
文章插图
文章插图
每个[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 等被大家熟知的名字 。
推荐阅读
- conda:一个当下最流行的Python虚拟环境工具
- 11 个最佳的 Python 编译器和解释器
- 新买的无霜冰箱结霜了正常吗,无霜冰箱结霜了会自动化掉吗
- 编写Python代码设置各平台下代理配置
- 福建大自然茶业乌龙茶初制自动化生产线面世
- php+nginx实现自动化部署脚本
- 分享一款自动化运维工具--PSSH工具
- MySQL, PostgreSQL CentOS常用数据库安装和python使用
- 历时100天终于整理了所有Python库!助你成为年薪百万大佬
- Python 四大主流 Web 编程框架