Python pytest找不到模块
我在遵循这个原则,或者至少我认为我是这样。但是,pytest找不到我的模块。它似乎没有在其Python pytest找不到模块,python,python-3.x,pytest,Python,Python 3.x,Pytest,我在遵循这个原则,或者至少我认为我是这样。但是,pytest找不到我的模块。它似乎没有在其PYTHONPATH中包含当前目录 源文件: def add(x, y): return x + y 测试文件: import pytest from junk.ook import add def test_add_true(): assert add(1, 1) == 2 以及一个名为“p3”的Python3虚拟环境的shell输出 我做错了什么?只需将添加到tests目录中,并
PYTHONPATH
中包含当前目录
源文件:
def add(x, y):
return x + y
测试文件:
import pytest
from junk.ook import add
def test_add_true():
assert add(1, 1) == 2
以及一个名为“p3”的Python3虚拟环境的shell输出
我做错了什么?只需将
添加到tests
目录中,并递归添加到其中包含测试文件的所有目录中。只需在项目根目录中放置一个空的conftest.py
文件:
$ pwd
/home/usr/tmp/junk
$ touch conftest.py
您的项目结构应为:
junk
├── conftest.py
├── junk
│ ├── __init__.py
│ └── ook.py
└── tests
└── test_ook.py
这里会发生什么:当pytest
发现conftest.py
时,它会修改sys.path
,以便从conftest模块导入内容。因此,由于现在在rootdir中找到了一个空的conftest.py
,pytest
将被迫将其附加到sys.path
。这样做的副作用是,您的垃圾
模块变得可导入。如果您将\uuuu init\uuuuuuuuuuuupy
添加到tests文件夹中,它是否也有帮助?在tests目录中添加\uuuuuuu init\uuuuuuuuuuuuuupy
确实有帮助。它应该在没有\uuuu init\uuuu.py
文件的情况下工作。它会带来什么问题?您链接的文章将\uuuu init\uuuuu.py
放在tests
目录中,并递归地将所有目录(包括测试)放在其中。但现在这引入了一个微妙的问题:为了从tests目录加载测试模块,pytest将存储库的根预先添加到sys.path,这增加了一个副作用,即现在mypkg也很重要。如果您在虚拟环境中使用tox之类的工具来测试软件包,这是有问题的,因为您要测试的是软件包的已安装版本,而不是存储库中的本地代码。您必须将软件包安装到virtualenv中。至少我每次都是这样摆脱这个错误的。但现在这引入了一个微妙的问题:为了从tests目录加载测试模块,pytest将存储库的根预先添加到sys.path,这增加了一个副作用,即现在mypkg也是可导入的。如果您在虚拟环境中使用tox之类的工具测试软件包,则会出现问题,因为您希望测试的是软件包的已安装版本,而不是存储库中的本地代码。只有测试已安装版本对您很重要时,这才是问题。如果你在打包方面没有做任何奇怪的事情,那么大多数时候都不会有什么不同。我很担心为什么pytest
不起作用,而python-m pytest
起作用。谢谢。@KiranKumarKotari谢谢你!这解决了我在docker.python中遇到的一个问题-m为您执行导入,然后作为脚本运行该文件,因此它解决了相对导入问题该死!诅咒你的阅读障碍!!!谢谢你的耐心,不用担心!顺便说一句,检查链接问题中的答案,建议在可编辑模式下安装软件包可能是比滥用pytest
测试发现机制更可行的解决方案。我已经尝试过这个解决方案,但它似乎不再起作用了。。。Python 3.7,pytest版本6.2.1。但是,运行python3.7-m pytest
而不仅仅是pytest
works@Expanding-Dev addingconftest.py
继续使用6.2.1,您的项目布局必须有另一个问题。如果您愿意,请在这里的评论中提出一个单独的问题并ping我。谢谢!添加conftest.py
与pytest 6.2.4配合使用。
$ pwd
/home/usr/tmp/junk
$ touch conftest.py
junk
├── conftest.py
├── junk
│ ├── __init__.py
│ └── ook.py
└── tests
└── test_ook.py