在 tox+pytest 中使用自己的包

Posted

技术标签:

【中文标题】在 tox+pytest 中使用自己的包【英文标题】:Use own package in tox+pytest 【发布时间】:2019-03-01 05:04:58 【问题描述】:

我有想要测试的 python 应用程序。 这个应用程序正在导入很多包,例如:

import time
import sys
.
.
.
import mypackage

mypackage 是我自己的包。

当我启动应用程序时,一切正常。但是,一旦我尝试运行 tox 来测试它,我就会收到以下错误:

Collecting mypackage
Could not find a version that satisfies the requirement mypackage (from versions: )
No matching distribution found for mypackage

我了解 tox 无法安装 mypackage 依赖项,因为它不在 pip 中。您知道如何在此类应用程序上运行 tox 或如何使用 tox 安装自己的软件包吗?

我的 tox.ini 文件的内容:

[tox]
envlist = py36

[testenv]
deps =
    pytest
    coverage
    time
    sys
    mypackage
commands =
    python setup.py develop
    coverage erase
    coverage run -m pytest myapp/tests/
    coverage report --omit='.tox/*' 

【问题讨论】:

【参考方案1】:

Tox 遍历 deps 中描述的所有包,并尝试使用pip install 安装所有包。如pip installing packages page 所述,您可以:

pip install /path/my/package

这意味着 deps 部分不仅接受来自 PyPI 的包,还接受路径指定的本地包。

只需将带有 setup.py 的包的根路径添加到 deps 部分即可。

deps =
    pytest
    coverage
    time
    sys
    /projects/py/mypackage

【讨论】:

这里有什么特别的陷阱吗?我尝试在 tox.ini deps 中添加一个条目,其中包含带有 mypackage 的 setup.py 文件的目录的绝对路径。但是 tox 似乎并没有以安装该软件包的方式调用 pip 。错误是ERROR: code: could not install deps [pytest, coverage, pytest-cov, /Users/me/git/github/mywork/mypackage]; v = InvocationError('/Users/me/git/github/mywork/.tox/code/bin/python -m pip install pytest coverage pytest-cov mypackage', 1)【参考方案2】:

如果您使用pip 而不是python setup.py,我认为这应该可以通过多种方式实现:

    您可以通过pip install /path/to/private/dependency 手动安装依赖项,可以在安装要测试的包之前或在同一行中。这具有(次要)优势,您还可以使用-e 在可编辑模式下安装依赖项。 您可以使用pip install--find-links 选项,如对this question 的回答中所述 - 这具有依赖处理本身自动完成的优点,您只需指定自己的安装包并告诉pip在哪里可以找到其他东西。重要的是,这也可以使用 environment variables 指定,因此您不必在 git 存储库的任何地方硬编码本地路径。

注意:我不确定选项 (2) 是否仅适用于 git 存储库或仅适用于适当的档案...我记得不久前与 --find-links 有过相关问题.

【讨论】:

以上是关于在 tox+pytest 中使用自己的包的主要内容,如果未能解决你的问题,请参考以下文章

pytest 配置文件

为啥 PyTest 覆盖率报告中缺少我项目的大部分 Django 文件?

.coveragerc 无法找到我想省略的文件

18-pytest-配置文件pytest.ini使用

pytest进阶之配置文件

pytest-18-配置文件pytest.ini