Tox 警告:找到测试命令但未安装在 testenv 中

问题描述 投票:0回答:8

我在我的项目中使用 tox。

这是我的

tox.ini
文件:

[tox]
envlist =
    py27,
    lint,
    coverage

skipsdist = True

[testenv:py27]
deps = -rrequirements.txt
commands = python -m unittest discover -s ./tests

[testenv:coverage]
commands =
    coverage run --source=tests -m unittest discover -s tests/
    coverage html
    coverage report


[testenv:lint]
commands = pylint ./foo

每当我运行 tox 时,所有内容都会被执行,基本上就是 linting、覆盖率。

但是 Tox 对所有内容都显示警告。

WARNING:test command found but not installed in testenv
Maybe you forgot to specify a dependency? See also the whitelist_externals envconfig setting.

一切成功,但仍然显示警告和错误。谁能告诉我我做错了什么?

我的

requirements.txt
文件是这样的:

requests==2.18.4
JsonForm==0.0.2
jsonify==0.5
jsonschema==2.6.0
JsonSir==0.0.2
python-dateutil==1.5
DateTime==4.2
urllib3==1.22
contextlib2==0.5.5
mock==2.0.0
patch==1.16
python unit-testing pylint tox
8个回答
31
投票

您在

commands
中使用的程序必须安装在 tox 的虚拟环境中或列入白名单:

[tox]
envlist =
    py27,
    lint,
    coverage

skipsdist = True

[testenv:py27]
deps = -rrequirements.txt
whitelist_externals = python
commands = python -m unittest discover -s ./tests

[testenv:coverage]
whitelist_externals = coverage
commands =
    coverage run --source=tests -m unittest discover -s tests/
    coverage html
    coverage report


[testenv:lint]
whitelist_externals = pylint
commands = pylint ./foo

2
投票

按照错误用途指定:

whitelist_externals = <your command>

例如我的外部命令是curl然后

tox.ini
看起来像

[tox]
envlist = py3
isolated_build = True

[testenv]
whitelist_externals = curl
deps =
    pytest
    chispa
    pyspark
    requests
    requests-mock
commands =
    curl url/hadoop-aws-3.2.0.jar --output ../lib/jars/hadoop-aws-3.2.0.jar
    curl url/aws-sdk-java-2.jar --output ../lib/jars/aws-sdk-java-2.jar
    python3 -m pytest

1
投票

来自毒性文档:

whitelist_externals 与 allowedlist_externals 具有相同的含义和用法,但现已弃用。


既然还没人提,我就介绍一下allowlist_externals解决方案

在虚拟环境中运行 tox (python virtualenv) 向我发出警告:

WARNING: test command found but not installed in testenv
Maybe you forgot to specify a dependency? See also the allowlist_externals envconfig setting.

执行的唯一命令 tox 是

commands = pytest --basetemp={envtmpdir}


按照警告提示,我去检查

allowlist_externals
,它允许我们定义可以在
commands
部分使用哪个命令,而不会触发 “未安装在 virtualenv 中” 警告


我的最终

tox.ini
[testenv]看起来像这样:

...
[testenv]
allowlist_externals = pytest
setenv =
    PYTHONPATH = {toxinidir}
deps =
    -r{toxinidir}\requirements_test_no_conflicts.txt
commands = 
    pytest --basetemp={envtmpdir}
...

附带说明:

allowlist_externals
可用于不同的
tox.ini
部分


0
投票

https://tox.readthedocs.io/en/latest/config.html

这里,设置这个选项,也许,你就通过了

sitepackages=false(true|false) 如果您想创建也可以访问全局安装的软件包的虚拟环境,请设置为 true。

警告 如果还全局安装了命令行工具,则必须确保使用 python -m(如果该工具支持)或 {envbindir}/ 来使用 virtualenv 中安装的工具。

如果您忘记这样做,您将收到如下警告:

WARNING: test command found but not installed in testenv
    cmd: /path/to/parent/interpreter/bin/<some command>
    env: /foo/bar/.tox/python
Maybe you forgot to specify a dependency? See also the whitelist_externals envconfig setting.

0
投票

我不知道为什么,但为了解决这个问题,我必须再次克隆我的仓库。存储库重置不仅仅解决了完整克隆问题。

查看此有毒问题以了解更多详细信息。


0
投票

这个问题很老了,但我相信有些常见情况并不能通过给定的答案得到最好的解决。也就是说,如果 tox 运行在与开发环境不同的机器上,例如作为 CI/CD 的一部分。


您不需要允许由 tox 添加的命令。这可以通过将它们作为额外添加到项目配置中来完成,也可以直接使用

deps
来完成。

直接选项更容易演示。在你的情况下,它会是这样的:

[testenv:coverage]
deps = coverage
commands =
    coverage run --source=tests -m unittest discover -s tests/
    coverage html
    coverage report

这个解决方案比使用

allowlist_externals
更好,因为如果你在不同的机器上运行代码(例如在 CI 中),那么
deps
将安装所需的库,而
allowlist_externals
(没有 deps)将使用预先存在的库一个(如果不存在则失败)。

据我所知,您可以添加这两个选项。但是,如果需要

allowlist_externals
,则您的 tox 配置可能未正确设置某些内容。

附加说明:在极少数情况下,tox 可能会错过它安装的软件包。当我通过kill信号强制停止tox、在tox运行时删除/更改文件等时,这种情况(很少)发生在我身上。在这些(罕见)情况下,通常会重建tox环境(通过

tox -r
或删除
.tox
)解决问题。


-1
投票

这个问题很旧,但答案不适用于我的情况。就我而言,一旦我将

[testenv]
更改为
[env]
,它就起作用了。这是因为我的Python虚拟环境被命名为“env”。


-1
投票

我解决了这个问题。由于已安装在默认虚拟环境中但未安装在 tox 环境中的软件包依赖项,因此会弹出该错误。确保运行 tox 所需的所有软件包都已添加到您的

requirements.txt
中,包括 unittest 和 pytest

© www.soinside.com 2019 - 2024. All rights reserved.