我想使用 tox 在项目上运行 py.test ,除了将软件包安装到virtualenv之外,还需要额外的设置。在创建virtualenv并安装依赖项之后,需要运行一些命令。
具体来说,我正在谈论使用nodeenv设置节点和 npm 环境:
nodeenv --prebuilt -p
我看到tox允许我通过在tox.ini
中设置install_command
来提供用于安装依赖项的自定义命令。但我认为这不是我想要的,因为替换用于安装依赖项的命令(我假设pip
)。
我考虑过使用带有 session 范围的py.test fixture来处理设置nodeenv,但这对我来说似乎很难,因为我不想在直接运行py.test时发生这种情况,不是通过tox。
实现这一目标的最简单方法是什么?
答案 0 :(得分:3)
在commands中创建virtualenv和依赖项安装后,您可以进行所有必要的设置。是的,它说"要调用的命令。"但是如果你需要做额外的工作来准备测试,你可以在那里做。
它按照给出的顺序通过你投掷的任何东西 - 例如:
[testenv:someenv]
deps =
nodeenv
pytest
flexmock
commands =
nodeenv --prebuilt -p
; ... and whatever else you might need to do
py.test path/to/my/tests
如果您有命令/脚本或其他任何产生正确结果的但却返回非零退出状态,您可以通过预先-
(如- naughty-command
中)来忽略它。
如果您需要执行更多步骤,可以将它们包装在一个小的(Python)脚本中,并按https://stackoverflow.com/a/47834447/2626627中所述调用该脚本。
添加使用多个安装命令的能力也存在问题:https://github.com/tox-dev/tox/issues/715已实施。
答案 1 :(得分:2)
我遇到了同样的问题,因为能够在不调用测试的情况下创建环境非常重要(通过--notest
),我希望安装在安装阶段进行而不是运行阶段,所以我做了一些略有不同的事情。首先,我创建了一个create-env
脚本:
#!/usr/bin/env sh
set -e
pip install $@
nodeenv --prebuilt --python-virtualenv --node=8.2.1
使其成为可执行文件,然后在tox.ini中:
[tox]
skipsdist = True
[testenv]
install_command = ./create-env {opts} {packages}
deps = nodeenv
commands = node --version
此完整示例运行并输出以下内容:
$ tox
python create: .../.tox/python
python installdeps: nodeenv
python installed: nodeenv==1.3.0
python runtests: PYTHONHASHSEED='1150209523'
python runtests: commands[0] | node --version
v8.2.1
_____________________________________________________________________ summary ______________________________________________________________________
python: commands succeeded
congratulations :)
这种方法的缺点是它只适用于Unix。
在tox 715中,我提出了对多个安装命令的原生支持的可能性。