我不确定为什么py.test没有将当前目录添加到PYTHONPATH中,但这里有一个解决方法(在存储库的根目录下执行):
python -m pytest tests/
这是因为Python会自动将当前目录添加到PYTHONPATH中,所以它能够正常工作。
project/test/all-my-tests
和project/src/app.py
。由于这种更改,需要通过在project/src
目录中使用__main__.py
文件间接调用app.py
,以便可以使用python -m src
命令进行调用。根据我所知道的情况,这是非常混乱的事情。 - Zelphir Kaltstahl/home/user/dev/projectxyz/src ...
这样的东西通常会很糟糕,而且在其他机器上运行时也不会成功。
我想我的意思是,即使一个模块与运行文件在同一个文件夹中,我仍然必须始终将整个项目根目录写入模块路径。我不知道这被认为是最佳实践,所以这是有用的信息,谢谢。我同意大多数pep8,尽管它仍然不完美。 - Zelphir Kaltstahl__init__.py
文件,这解决了问题。现在我可以使用 pytest
。 - Kiran Kumar Kotaripytest>=7
的方法:使用pythonpath
设置最近,pytest
添加了一个新的核心插件,支持通过pythonpath
配置值修改sys.path
。因此,解决方案现在更简单,并且不再需要任何变通方法:
pyproject.toml
示例:
[tool.pytest.ini_options]
pythonpath = [
"."
]
< p > pytest.ini
示例:
[pytest]
pythonpath = .
.
将添加 repo
目录到 sys.path
中。同时也可以允许多个路径条目: 对于一个布局。repo/
├── src/
| └── lib.py
├── app.py
└── tests
├── test_app.py
└── test_lib.py
配置
[tool.pytest.ini_options]
pythonpath = [
".", "src",
]
或者
[pytest]
pythonpath = . src
将同时添加app
和lib
模块到sys.path
,因此
import app
import lib
pytest<7
):使用 conftest
最不侵入性的解决方案是在 repo/
目录下添加一个名为 conftest.py
的空文件:
$ touch repo/conftest.py
就这样,不需要编写定制代码来操纵sys.path
,也不需要记住带上PYTHONPATH
,或者将__init__.py
放置到不应该存在的目录中(虽然使用Apteryx的答案中建议的python -m pytest
是一个很好的解决方案!)。
之后的项目目录:
repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
└── test_app.py
pytest
在测试集合中查找conftest
模块以收集自定义钩子和固定装置,并为了从中导入自定义对象,pytest
将conftest.py
的父目录添加到sys.path
(在这种情况下是repo
目录)。
如果您有其他项目结构,请将conftest.py
放置在包根目录中(包含包但本身不是包的目录,因此不包含__init__.py
),例如:
repo
├── conftest.py
├── spam
│ ├── __init__.py
│ ├── bacon.py
│ └── egg.py
├── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
src
布局尽管这种方法可以与 src
布局一起使用(将 conftest.py
放置在 src
目录中):
repo
├── src
│ ├── conftest.py
│ ├── spam
│ │ ├── __init__.py
│ │ ├── bacon.py
│ │ └── egg.py
│ └── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
src
添加到PYTHONPATH
会减弱src
布局的含义和好处!这样做将导致测试代码来自存储库而不是安装的包。如果您需要这样做,也许您根本不需要src
目录。
conftest
模块不仅仅是帮助发现源代码的文件;它是pytest
框架的所有项目特定增强和测试套件自定义的地方。pytest
在他们的文档中有很多关于conftest
模块的信息;从conftest.py
:本地每个目录的插件开始。conftest
模块的优秀问题:在py.test中,conftest.py文件有什么用?
pytest
将其视为保留名称,并强烈建议不要这样做。通过这样做,您会为未来的错误埋下伏笔。请创建另一个名为“utils.py”的模块,并在其中放置用于测试复用的代码。 - hoeflingconftest.py
文件不属于应用程序代码,并且我认为将其放在 src/
目录下是不正确的。 - Nik O'Lai我遇到了同样的问题。通过在我的tests
目录中添加一个空的__init__.py
文件来解决这个问题。
避免在测试目录中使用“__init__.py”文件。这样,您的测试可以轻松地针对已安装版本的 mypkg 运行,而与已安装的包是否包含测试无关。
来源:http://pytest.org/latest/goodpractises.html - K.-Michael Aye__init__.py
文件删除解决了这个问题。 - 101test/
子目录中添加一个 __init__.py
文件可以使得针对被安装的模块在该子目录下运行特定测试时绝对导入起作用。谢谢。 - Bryce Guinta是的,如果你切换到测试目录并使用cd
命令,则源文件夹不在Python的路径中。
你有两个选择:
手动将路径添加到测试文件中。类似于这样:
import sys, os
myPath = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, myPath + '/../')
使用环境变量 PYTHONPATH=../
运行测试。
cd
进入一个目录?我正在从我的根目录运行py.test
。除非我误解了你的意思,你是指当pytest
遍历我的文件夹时。 - MattoToddcd
的问题,那我在 Mac 上也会遇到同样的问题吗? - MattoToddvenv
目录的位置来“修复”它。将我的venv/
目录创建在tests/
旁边(而不仅仅是在存储库的根目录),使pytest能够看到它,而无需修改路径。 - Everett使用以下命令将pytest
本身作为模块运行:python -m pytest tests
当项目层次结构为package/src package/tests时,在测试中从src导入时会发生这种情况。作为模块执行将把导入视为绝对路径而不是相对于执行位置的路径。
你可以在项目根目录下使用PYTHONPATH运行
PYTHONPATH=. py.test
或者使用pip install作为可编辑导入
pip install -e . # install package using setup.py in editable mode
test
е’Њsrc
з›®еЅ•зљ„з›®еЅ•дёи°ѓз”ЁпјЊиЂЊдё”test
з›®еЅ•дёЌењЁsrc
з›®еЅ•з»“жћ„дёпјЊиї™еЇ№ж€‘жІЎжњ‰з”ЁгЂ‚ - Zelphir Kaltstahl在Flask中我遇到了同样的问题。
当我添加以下内容时:
__init__.py
将文件移动到tests文件夹后,问题消失了 :)
可能应用程序无法将tests文件夹识别为一个模块。
我创建了这个作为对你的问题和我的困惑的回答。希望它能帮到你。请注意py.test命令行和tox.ini中的PYTHONPATH。
https://github.com/jeffmacdonald/pytest_test
具体来说:您必须告诉py.test和tox在哪里找到您包含的模块。
使用py.test,您可以这样做:
PYTHONPATH=. py.test
使用tox,将以下内容添加到您的tox.ini文件中:
[testenv]
deps= -r{toxinidir}/requirements.txt
commands=py.test
setenv =
PYTHONPATH = {toxinidir}
我通过删除源代码所在父文件夹中的顶级__init__.py
文件来解决了这个问题。
当我不小心向我的 src 目录中添加了 __init__.py
文件(它本不应该是 Python 包,而只是所有源代码的容器)时,我开始出现奇怪的 ConftestImportFailure: ImportError('No module named ...
错误。