使用当前环境代替virtualenv进行tox测试环境
项目描述
The tox-current-env 插件添加了以下选项
- tox --current-env
在当前Python环境(即tox被调用和安装的环境)中运行tox测试环境的commands。与常规tox调用不同,这不会安装deps中声明的任何依赖项。尝试使用不匹配的Python版本运行此命令将失败(如果tox是从Python 3.7环境调用的,任何非3.7的测试环境都将失败)。
- tox --print-deps-to=FILE
不需要运行任何命令,只需将声明在deps中的依赖项打印到指定的FILE中。这有助于为tox --current-env准备当前环境。使用-作为FILE将输出打印到标准输出。
- tox --print-extras-to=FILE
不需要运行任何命令,只需将声明在extras中的额外项的名称打印到指定的FILE中。这有助于为tox --current-env准备当前环境。使用-作为FILE将输出打印到标准输出。
只要FILE不同,就可以同时使用这两个打印选项。
如果没有使用上述任何选项调用tox,其行为应该与没有此插件的正常tox调用一样。任何与此行为不符的情况都视为错误。
此插件禁用了tox提供测试环境的方式,但假设您以其他方式提供。始终在全新隔离的环境中运行带有此插件的tox,例如Python虚拟环境、Linux容器或chroot。下面有其他注意事项。
动机
显然,tox是为了在隔离的Python虚拟环境中运行测试而创建的。使用--current-env标志完全违背了tox的目的。你可能会问,为什么有人会这么做?
事实上,tox已经变得非常流行,并获得了另一个目的。
Python生态系统现在为版本或依赖项等许多包元数据元素提供了正式的规范。然而,还没有关于声明测试依赖项或运行测试的标准。目前,这最流行的既定标准是tox,我们期望未来的标准将从tox.ini发展而来。此插件让我们可以使用tox的依赖项列表和测试命令来处理Python venvs之外的其它环境。
我们希望这个插件能够促进围绕tox配置的最佳实践,以便更好地适应非虚拟环境——例如Linux发行版、Conda或容器。
具体来说,此插件是为了满足Fedora的需求而创建的。当我们将Python软件打包为RPM包时,我们试图在打包过程中运行项目的测试套件。然而,我们需要测试软件集成到Fedora中是否正常工作,而不是在从PyPI下载到新环境中。通过在当前环境中运行测试,我们可以实现这一点。
如果您对这个RPM打包部分感兴趣,请参阅Fedora的%pyproject RPM宏。
安装
通过pip安装此插件
$ python -m pip install tox-current-env
或者通过克隆git仓库并在本地使用pip-install进行安装
$ git clone https://github.com/fedora-python/tox-current-env
$ cd tox-current-env
$ python -m pip install -e .
用法
当插件安装后,使用带有--current-env、--print-deps-to或--print-extras-to的tox以及所有其他选项。假设您的tox安装在Python 3.7上
$ tox -e py37 --current-env
py37 create: /home/pythonista/projects/holy-grail/tests/.tox/py37
py37 installed: ...list of packages from the current environment...
py37 run-test-pre: PYTHONHASHSEED='3333333333'
py37 run-test: commands...
...runs tests in current environment's Python...
___________________________________ summary ____________________________________
py37: commands succeeded
congratulations :)
尝试运行py36环境的测试将会失败
$ tox -e py36 --current-env
py36 create: /home/pythonista/projects/holy-grail/tests/.tox/py36
ERROR: InterpreterMismatch: tox_current_env: interpreter versions do not match:
in current env: (3, 7, 4, 'final', 0)
requested: (3, 6, 9, 'final', 0)
___________________________________ summary ____________________________________
ERROR: py36: InterpreterMismatch: tox_current_env: interpreter versions do not match:
in current env: (3, 7, 4, 'final', 0)
requested: (3, 6, 9, 'final', 0)
要获取测试依赖项的列表,请运行
$ tox -e py37 --print-deps-to -
py37 create: /home/pythonista/projects/holy-grail/tests/.tox/py37
py37 installed: ...you can see almost anything here...
py37 run-test-pre: PYTHONHASHSEED='3333333333'
dep1
dep2
...
___________________________________ summary ____________________________________
py37: commands succeeded
congratulations :)
要获取额外项名称的列表,请运行
$ tox -e py37 --print-extras-to -
py37 create: /home/pythonista/projects/holy-grail/tests/.tox/py37
py37 installed: ...you can see almost anything here...
py37 run-test-pre: PYTHONHASHSEED='3333333333'
extra1
extra2
...
___________________________________ summary ____________________________________
py37: commands succeeded
congratulations :)
注意事项、警告和限制
tox 4
此插件也适用于tox 4。tox 3和4之间的行为差异如下:
--recreate 在从插件切换回标准tox时不再需要。Tox会自动检测并处理重建。
插件不检查请求的Python版本或环境名称。如果您让它在多个环境中运行,它们都将使用相同的Python。
已弃用的 --print-deps-only 选项不再可用。
使用隔离的环境
在您的系统Python环境中运行(尤其是第三方软件的)测试是危险的。始终在隔离的环境中(如Linux容器、虚拟机或chroot)使用此插件。已提醒您。
不要依赖virtualenv的细节
为了支持< span class="docutils literal"> commands部分中的< span class="docutils literal"> python命令,当前环境的tox调用创建了一个假的虚拟环境,该环境仅包含对Python可执行文件的符号链接。即使实际解释器的名称不同(如< span class="docutils literal"> python3.7或< span class="docutils literal"> pypy),链接的名称也是< span class="docutils literal"> python。任何其他命令都不链接任何地方,并且确保此类命令在< span class="docutils literal">$PATH中并使用正确的Python是用户的责任。这可能导致测试结果略有不同,尤其是如果您对< span class="docutils literal"> sys.executable或其他测试中的命令有假设。
作为一个具体的例子,测试应该调用< span class="docutils literal"> python < span class="pre"> -m pytest,而不是假设< span class="docutils literal"> pytest命令存在并使用正确的Python版本。
不要混合当前环境和常规tox运行
tox缓存它创建的virtualenv,并且不区分常规virtualenv和< span class="docutils literal"> --current-env。不要混合< span class="docutils literal"> tox < span class="pre"> --current-env、< span class="docutils literal"> tox < span class="pre"> --print-deps-to或< span class="docutils literal"> tox < span class="pre"> --print-extras-to运行和常规< span class="docutils literal"> tox运行(没有此插件提供的标志)。如果您需要这样做,请使用tox的< span class="docutils literal"> --recreate/-r标志来清除缓存。
如果检测到此问题,插件应通过有意义的错误消息终止,但在某些角落案例中(例如,在运行< span class="docutils literal"> tox < span class="pre"> --current-env、在它完成之前强制终止它、卸载插件并运行< span class="docutils literal"> tox),您将得到未定义的结果(例如,将软件包从PyPI安装到您的当前环境中)。
默认传递环境变量
从0.0.9版开始,当使用此插件时,默认情况下传递所有Shell环境变量。将tox配置中的< cite> passenv设置为< cite> * < / cite>。阅读有关传递环境变量到tox的文档了解更多信息。
tox配置
测试的项目可以指定在安装tox的环境中需要的最小tox版本和/或< a href="https://tox.readthedocs.io/en/latest/config.html#conf-minversion" rel="nofollow">附加requires。通常,当这些要求未满足时,tox使用< em>配置。它创建一个虚拟环境,在该环境中安装(较新版本的)tox和缺失的软件包,并通过该环境代理所有tox调用。遗憾的是,这不符合< span class="docutils literal"> tox-current-env的需求。
可以使用 tox 的 --no-provision 选项来完全阻止配置过程。当缺少需求时,tox 将失败而不是进行配置。如果为 --no-provision 传递了一个路径,需求将被序列化为 JSON 文件。
如果指定了需求,它们将包含在 tox --print-deps-to 的结果中。这仅在它们已安装时有效(否则请参见第一点)。
如果指定了最小 tox 版本,它将包含在 tox --print-deps-to 的结果中。这仅在满足版本要求时有效(否则请参见第一点)。
处理此问题的推荐方法是
运行 tox --no-provision provision.json --print-deps-to=... 或类似命令。
如果命令失败,请从 provision.json 安装需求到当前环境并再次尝试。
注意,指定的需求可能包含 其他 tox 插件,其中许多可能会以不期望的方式干扰 tox-current-env。如果是这种情况,推荐的解决方案是在运行 tox 之前从配置中删除这些不期望的插件。
其他限制和已知问题
tox --print-deps-to/tox --print-extras-to 的输出中的 installed: 行显示不相关的输出(基于真实或模拟虚拟环境的内容)。
无论在 tox 的 shebang 中使用了哪些 Python 标志,测试都是以 sys.executable 无任何附加标志调用(除非在 commands 部分中明确使用它们)。
当前环境的 Python 只测试主版本和次版本。具有相同 Python 版本的不同的解释器(如 CPython 和 PyPy)被视为相等。
仅支持 Linux,特别强调 Fedora。此插件可能在其他类 Unix 系统上工作,但不支持 Microsoft Windows。
这是一个 alpha 级别的软件。请自行承担使用风险。欢迎提交改进的 pull 请求。
开发、问题、支持
开发在 GitHub 上进行,位于 fedora-python/tox-current-env 存储库。您可以使用那里的 问题跟踪器 进行任何讨论或发送 Pull Requests。
测试
为了运行测试,您需要安装 tox 和 Python 3.6 到 3.10。集成测试假定所有这些版本都可用。在 Fedora 上,只需运行 dnf install tox。
运行 tox 以调用测试。
使用自己的 --current-env 标志运行此插件的测试可能会崩溃。
许可证
tox-current-env 项目采用所谓的 MIT 许可证,完整文本可在 LICENSE 文件中找到。
行为准则
tox-current-env 项目遵循 Fedora 的行为准则。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。