Swi*_*Run 5 python continuous-integration automated-tests pytest tox
tox 中是否可以触发tox -e hellohello 环境并在全局环境列表上运行?
运行tox针对 py2 和 py3 正确运行。
运行tox -e hello仅针对 py3 运行。
[tox]
skipsdist = True
envlist = py{27,37}
[testenv]
deps =
pytest
!py27: mock
commands =
{envpython} --version
; How to run this hello against the complete envlist?
[testenv:hello]
envlist = py{27,37}
commands =
echo hello
Run Code Online (Sandbox Code Playgroud)
似乎这在某种程度上是预期的行为,但除了制作一堆 tox 文件之外,我不知道如何使用 tox 来解决问题:我想要有不同的 tox 命令入口点。例如,仅针对 运行单元测试py27,仅针对 运行单元测试py{27,37},仅针对 运行集成测试py27-{libA,libB},等等。
也许这只是一种反模式,您可以在单个环境中以这种方式使用 tox -e ,但它会破坏 envlist ?
我只需要再制作一个 tox.ini 吗?考虑到与 tox 有关的其他所有内容的灵活性和重用性,这似乎非常笨拙。我觉得我失去了一些东西。
这里有两点主要需要理解:
envlist是该部分中的全局设置[tox]。定义它[testenv:hello]没有效果envlist定义或生成名称列表env。这可以通过提供一个简单的逗号分隔列表静态地完成,或者像您一样从通过特殊语法提供的因素组合生成列表{...}。两种情况的结果都是环境名称列表,然后将在分隔的virtualenvs/中执行venvs。因此,为了完全清楚地表明:最终 anenvlist是一个简单的名称列表env- 没有其他。对这些名称(或其部分(又名因子))所做的操作是在envs.
如果您在不带 .txt 的情况下调用 tox,则会执行所有这些环境-e。在您的示例中,您使用的语法生成一个 envlist{<factorX>,<factorY>},该语法基于与命令行 shell 提供的相同原理。如果您在 tox 配置中询问生成的环境,结果将是:
$ tox -a
py27-hello
py37-hello
hello
Run Code Online (Sandbox Code Playgroud)
这可能已经表明您的配置有点不对劲,因为我认为您不想要一个不合格的hello环境。
因此,您通过生成地创建 envlist 并hello使用[testenv:hello]语法静态提供 testenv 所做的事情是以一种不会产生您想要的结果的方式混合它们。
因此,让我们调整您的内容tox.ini以摆脱不必要的静态定义testenv:hello。我们还摆脱了本地envlist密钥,因为它无论如何都没有效果。它没有抛出错误,因为任意命名的键envs是明确允许的并且有时很有用。
[tox]
skipsdist = True
envlist = py{27,37}-hello
[testenv]
deps =
pytest
!py27: mock
# do not warn that echo is a command not in the venv
whitelist_externals = echo
commands =
{envpython} --version
hello: echo hello
Run Code Online (Sandbox Code Playgroud)
为了确保仅运行 hello 命令,当 env 具有一个hello因子时,您可以使用<factor>[,<factor>]: <some command>它来指定如果 env 名称包含某个因子(由 分隔的名称部分-)应运行的内容,则会生成一个环境名称列表,其中然后作为正在执行的具体环境的信息。
如果我tox -a再次调用更改后的 ini,我会得到:
py27-hello
py37-hello
Run Code Online (Sandbox Code Playgroud)
现在我可以通过调用eg来请求完整的环境或仅获取因子tox -e py27-hello,甚至然后tox -e hello它将使用basepython并执行适合因子的所有操作。
为了更深入地了解正在发生的情况,您可以显示所有环境的完全解析的配置,如下所示:
$ tox --showconfig
[testenv:py27-hello]
envdir = /home/ob/do/play/.tox/py27-hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py27-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py27-hello'}
basepython = python2.7
description =
envtmpdir = /home/ob/do/play/.tox/py27-hello/tmp
envlogdir = /home/ob/do/play/.tox/py27-hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest]
commands = [['/home/ob/do/play/.tox/py27-hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
[testenv:py37-hello]
envdir = /home/ob/do/play/.tox/py37-hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py37-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py37-hello'}
basepython = python3.7
description =
envtmpdir = /home/ob/do/play/.tox/py37-hello/tmp
envlogdir = /home/ob/do/play/.tox/py37-hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest, mock]
commands = [['/home/ob/do/play/.tox/py37-hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
[testenv:hello]
envdir = /home/ob/do/play/.tox/hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/hello'}
basepython = /usr/bin/python
description =
envtmpdir = /home/ob/do/play/.tox/hello/tmp
envlogdir = /home/ob/do/play/.tox/hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest, mock]
commands = [['/home/ob/do/play/.tox/hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
Run Code Online (Sandbox Code Playgroud)