tox 测试,使用 setup.py extra_require 作为 tox deps 来源

tox tests, use setup.py extra_require as tox deps source

我想使用 setup.py 作为安装包的权限进行测试,使用 extra_requires 完成,如下所示:

setup(
    # ...
    extras_require={
        'test': ['pytest', ],
    },
)

Tox 似乎只能 installing from a requirements.txt file which just implies a step of snapshotting requirements before testing (which I'm ignorant how to do automatically) or by duplicating the test dependencies into the tox file, which is all I want to avoid. One mailing list post 建议 tox.ini 应该是测试依赖项的权威,但我不希望将 tox 完全套入项目中。

我想出了一个似乎有效的讨厌的 hack

# tox.ini
...
[testenv]
...
install_command = pip install {opts} {packages} {env:PWD}[test]

默认的 install_commandpip install {opts} {packages},不幸的是 {packages} 是必需的参数。此外,tox 不会将项目目录公开为魔术变量;但它确实暴露了 shell 的 env 那 运行 它。

假设您 运行 tox 来自与您的 setup.pytox.ini 相同的目录,并假设您的 shell 公开 [=18] =] 作为您当前的路径。 Tox 似乎使用 shlex 之类的东西将您的 install_command 拆分为一组 shell 安全的参数,因此我们不能做 {packages}[test] 之类的事情。最终这个 hack 将命名你的包两次,但我认为这没关系,因为 {env:PWD}[test] 命名你的包加上你想要的 extra_require 块。

我不知道更好的方法,PYPA SampleProject 似乎满足于在 setup.py 和 tox.ini 中指定测试依赖项。

您现在有 "extras" 选项:

# tox.ini
...
[testenv]
...
extras = test

来源:https://tox.readthedocs.io/en/latest/config.html#conf-extras

有时“extras”选项无法解决问题(例如,当您的 extras 依赖项需要来自 deps 部分的依赖项时;例如,当您使用 pytest-django 和您的 extras 依赖项不会安装 Django 本身)。

在这种情况下,您可以像这样在 deps 部分简单地安装您的附加功能:

# tox.ini
[testenv]
deps = .[test]

句点.表示当前项目(当前路径),跟往常一样,后面是括号中的extras。这就像 pip install .[test] 一样工作。