在我刚翻译完的 Python 打包系列文章 https://mp.weixin.qq.com/s/Kmqhr9szPdvBI0KQPm9JsA 中, 作者提到了一个神奇的测试工具 tox, 而且他本人就是 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
2,tox 怎么配置?
关于它的用法: 使用 pip install tox 安装, 使用 tox 运行全部测试环境, 和 tox -e envname 运行指定的环境. 还有不少的命令行参数, 通过 tox -h 查看.
tox 的行为由其配置文件控制, 当前它支持 3 种配置文件:
- 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} 等等.
除了基础性的变量替换, 它还支持这些高级用法:
取操作系统的环境变量:{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" 时, 是这样的例子.
花括号 "{}" 除了可以做变量替换使用, 它还可以作为 "或关系" 判断的取值. 直接看下面的例子:
[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 等被大家熟知的名字.
tox 开放了挺多的 API 接口 https://tox.readthedocs.io/en/latest/plugins.html , 方便其他人定制开发插件.
4,tox 的工作流程
接下来看看 tox 是怎么运作的:
其工作流程中主要的环节有:
配置(从 figuration): 加载配置文件(如 tox.INI), 解析命令行参数, 读取系统环境变量等
打包(packaging): 可选的, 对于带有 setup.py 文件的项目, 可以在这步去生成它的源发行版
创建虚拟环境: 默认使用 virtualenv 来创建虚拟环境, 并根据配置项中的 "deps" 安装所需的依赖项, 然后执行配置好的命令(commands)
报告(report): 汇总所有虚拟环境的运行结果并罗列出来
5, 小结
tox 本身定位是一个测试工具, 它试图令 Pytho 测试工作变得自动化, 标准化与流程化. 但跟 unittest 和 pytest 这些测试框架不同, 它作用的是代码层面之外的事情, 是一种项目级的工具. 因此, 它需要跟这些测试框架相结合, 或者同时处理多种自动化任务(如跑 pep8, 测代码覆盖率, 生成文档等等), 这样才能更好地发挥它的价值.
它的一大特色在于创建 / 管理虚拟环境, 但这只是为了方便测试而使用的手段, 因此相比其它可管理虚拟环境的工具, 如 Virtualenvwrapper,conda,pipenv,poetry, 它在某些方面就存在着不足.
tox 还有强大的可配置性与丰富的插件支持, 这使得它在运用上具有很大的可能性与自由度. 因此, 不少忠实开发者仍在持续地在使用它, 比如, 我刚翻译好的系列文章 https://mp.weixin.qq.com/s/Kmqhr9szPdvBI0KQPm9JsA 的作者就是它的维护者之一.
最后还需补充一点, tox 使用配置文件作驱动, 但配置文件还是挺繁琐的, 因此有人开发了一个跟 tox 相似的 nox, 使用 Python 文件来做配置. 这个项目也很受欢迎, 吸引了很多项目投入其门下, 例如 pipx,urllib3,Salt 等等. 对该项目感兴趣的话, 请查看: https://nox.thea.codes/en/stable/
公众号[Python 猫] , 本号连载优质的系列文章, 有喵星哲学猫系列, Python 进阶系列, 好书推荐系列, 技术写作, 优质英文推荐与翻译等等, 欢迎关注哦.
来源: https://www.cnblogs.com/pythonista/p/12158614.html