0

设置如下

/project/src/package/module.py
/project/tests/package/test_module.py

test_module.py 中,我从src分支导入,如下所示:

from package.module import SomeClass

最后,我尝试从/project/调用以下命令

python3 -m pytest tests

我收到以下错误消息:

ModuleNotFoundError: No module named 'package.module'

我无法让它工作。而且我很难理解“pytest”如何甚至有机会找到正确的模块,因为它们位于“src”目录中,并且导入从包层开始。我很困惑。

4

2 回答 2

1

正如其中一条评论所建议的,处理此问题的一种方法是将conftest.py文件添加到src目录中。

该文件不需要包含任何内容。

你的文件树看起来像这样:

/project/src/package/module.py
/project/src/conftest.py
/project/tests/package/test_module.py

添加conftest.py后,您应该可以pytest/project/.

于 2021-06-19T17:01:14.633 回答
0

感谢您的综合帮助。

事实证明,这是几件事的混合。

1.) 通过写入日志文件,我可以确认您需要将 conftest.py 放入 src 目录,以便将其附加到路径中。

2.) /project/tests/ 子目录中不应有__init__.py与/project/src 下的子目录同名的文件。这是因为 /tests/ 子目录在 sys.path 列表中位于 /src/ 子目录之前。因此,pytest 将首先识别 /tests 下的目录 - 如果它们有__init__.py文件,则假设它们是您正在寻找的模块/包。也许将这些目录重命名为“tests/test_module”而不是“tests/module”可能会有所帮助。请注意,这尤其适用于您拥有 test_xy.py 文件的目录。

3.) 最后,你不应该使用python3 -m pytest testsbut python3 -m pytest,以当前目录为起点,让 pytest 有机会在 src 目录中找到 conftest.py 。

__init__.py如果 - 出于某种原因 - 您需要其中的文件,那么在测试中的包(如在源代码下)不具有相同的名称甚至是有意义的。例如,您可以称它们为 test_package。

老实说,我确实想知道为什么从未对此进行过调查。正如你所指出的,已经有很多关于这个的讨论。每个人都贡献了一点。但没有一个是全面的。那么人们在实践中是如何工作的呢?我的意思是,毕竟我们谈论的是测试必需品。

平心而论,我还从 pytest 的文档中了解到,您应该使用 setup.py 文件正确构建您的包。

哇,多么美妙的旅程。我希望其他人可以受益。我感谢大家帮助我。

于 2021-06-19T17:49:04.450 回答