3

我想使用tox在一个项目上运行py.test,除了将包安装到 virtualenv 之外,该项目还需要额外的设置。创建 virtualenv 并安装依赖项后,需要运行一些命令。

具体来说,我正在谈论使用nodeenv设置节点npm环境:

nodeenv --prebuilt -p

install_command我看到 tox 允许我通过设置来提供用于安装依赖项的自定义命令tox.ini。但我认为这不是我想要的,因为它取代pip了用于安装依赖项的命令(我假设)。

我考虑过使用具有会话范围的 py.test 夹具来处理设置 nodeenv 但这对我来说似乎很棘手,因为我不希望在直接运行 py.test 而不是通过 tox 时发生这种情况。

实现这一目标的最不疯狂的方法是什么?

4

2 回答 2

3

在创建 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

于 2016-05-12T19:43:49.680 回答
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中,我提出了本地支持多个安装命令的可能性。

于 2017-12-15T14:33:47.680 回答