我在我的项目中使用 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
您在
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
按照错误用途指定:
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
whitelist_externals 与 allowedlist_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
部分
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.
我不知道为什么,但为了解决这个问题,我必须再次克隆我的仓库。存储库重置不仅仅解决了完整克隆问题。
查看此有毒问题以了解更多详细信息。
这个问题很老了,但我相信有些常见情况并不能通过给定的答案得到最好的解决。也就是说,如果 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
)解决问题。
这个问题很旧,但答案不适用于我的情况。就我而言,一旦我将
[testenv]
更改为 [env]
,它就起作用了。这是因为我的Python虚拟环境被命名为“env”。
我解决了这个问题。由于已安装在默认虚拟环境中但未安装在 tox 环境中的软件包依赖项,因此会弹出该错误。确保运行 tox 所需的所有软件包都已添加到您的
requirements.txt
中,包括 unittest 和 pytest