Py.test没有名为*的模块

zsl*_*ius 26 python pytest

我有这样的文件夹结构

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py
Run Code Online (Sandbox Code Playgroud)

在我test_app.py file,我有一行来导入我的应用程序模块.当我在根文件夹上运行py.test时,我得到关于没有名为app的模块的错误.我该如何配置?

jam*_*esc 38

使用Python 3并在类似的项目布局上获得相同的错误,我通过向模块添加__init__文件来解决它tests.

$ touch tests/__init__.py
Run Code Online (Sandbox Code Playgroud)

我在包装和导入方面不是很出色,但我认为这有助于pytest确定目标App模块的位置.

  • @jamesc我遵循他们的“外部应用程序代码”模式的“最佳实践”,如果我执行“coverage run -m pytest”或“python -m pytest”,它会起作用,但如果我直接运行“pytest”,则失败加载模块错误。 (7认同)
  • 在使用此策略之前,您应该检查对pytest最佳实践的影响:https://docs.pytest.org/en/latest/goodpractices.html#choosing-a-test-layout-import-rules (3认同)
  • 这是我可以让它在 Python 3 中工作的唯一方法。 (2认同)
  • @blong 我已经通过将源代码作为包安装到虚拟环境中解决了我遇到的问题,这需要深入研究 python 打包和 distutils/setuptools。 (2认同)

nch*_*pra 37

pytest使用命令运行python -m pytest有助于解决这个问题。

由于您当前的包尚未在您的$PYTHONPATHsys.path- pytest 中,因此会出现此错误。

通过使用,python -m pytest您可以自动将工作目录添加到sys.path运行中pytest。他们的文档还提到:

这几乎相当于调用命令行脚本pytest

  • python 3.8的最佳答案 (2认同)

ber*_*kyi 36

我已经__init__.py/App/App目录中有一个文件,并且想要从项目根目录运行测试而没有任何路径错误的魔法:

 python -m pytest tests
Run Code Online (Sandbox Code Playgroud)

输出立即如下所示:

?  python -m pytest tests
====================================== test session starts ======================================
platform linux -- Python 3.5.1, pytest-2.9.0, py-1.4.31, pluggy-0.3.1
rootdir: /home/andrew/code/app, inifile: 
plugins: teamcity-messages-1.17
collected 46 items 

... lines omitted ...

============================= 44 passed, 2 skipped in 1.61 seconds ==============================
Run Code Online (Sandbox Code Playgroud)

  • `python -m pytest tests` 拯救了我的一天 (4认同)
  • 您是否能够找出启动`py.test`直接无法发现`/ App/App`的原因? (3认同)
  • python 确实将当前目录添加到 pythonpath 中,因此您仍在使用路径修改魔法,顺便说一句,这就是它起作用的原因! (3认同)

小智 14

我遇到了类似的问题,不得不__init__.py从根目录中删除并__init__.pytests文件夹中添加一个。

  • 我遇到了同样的问题,需要从根目录中删除 __init__ 。有谁知道为什么 root 中的 __init__ 会对 pytest 造成严重破坏? (6认同)

Dun*_*eal 13

所以你跑步py.test/App.你确定/App/App在你的$PYTHONPATH吗?

如果不是,则尝试import app使用此类消息失败的代码.

编辑0:包括我在下面的评论中的信息,以确保完整性.

导入应用程序的尝试只有在内部执行时才会成功/App/App,这不是这里的情况.您可能希望/App/App通过放入其中来创建包,并将__init__.py导入更改为限定应用程序from App import app.

EDIT1:根据要求,在下面的第二条评论中添加进一步的解释.

通过放入__init__.py内部/App/App,该目录成为一个包.这意味着您可以从中导入,只要它 - 目录 - 在中可见$PYTHONPATH.即你可以从做的App import app,如果/App是在$PYTHONPATH.您当前的工作目录会自动添加到$PYTHONPATH,因此当您运行脚本时/App,导入将起作用.

  • @zsljulius:通过在`/ App/App`中放置`__init __.py`,该目录成为一个包.这意味着您可以从中导入,只要它 - 目录 - 在`$ PYTHONPATH`中可见.即如果`/ App`在`$ PYTHONPATH`中,你可以从App导入应用程序中执行.您当前的工作目录会自动添加到`$ PYTHONPATH`,因此当您从`/ App`运行脚本时,导入将起作用. (3认同)
  • 无论你在哪里安装`pip`,都没有理由将`/ App/App`自动添加到`$ PYTHONPATH`中.尝试"导入app"只有在*`/ App/App`中执行*才会成功,这不是这里的情况.您可能希望通过在其中放置`__init __.py`来使`/ App/App`成为一个包,并将您的导入更改为'app`作为`来自App import app`. (2认同)

Jay*_*Jay 9

在为我的应用程序运行测试用例时,我也遇到了同样的错误,如下所示

myproject
  --app1
    --__init.py__
    --test.py
  --app2
    --__init.py__
    --test.py
  --__init.py__
Run Code Online (Sandbox Code Playgroud)

我删除了myproject 的 init.py文件来运行我的测试用例。


Sve*_*imo 8

长话短说

您也可以将一个空conftest.py文件添加到根应用程序文件夹中。

(如果您查看问题文件夹结构,它将与“Tests”文件夹处于同一级别,而不是在其中)

更多信息:

conftest.pyPytest在所有项目文件夹中查找文件。

conftest.py为 pytest 找到它的文件树提供配置。因为 pytest 以某种方式扫描从 conftest.py 文件夹开始的所有子目录,所以它应该在测试文件夹之外找到包/模块(只要 conftest.py 文件位于您的应用程序根文件夹中) 。

最终,您可能想在空的 conftest.py 中编写一些代码,专门用于在不同的测试文件之间共享固定装置,以避免重复代码。毕竟,编写测试时也应该遵循 DRY 原则(Don't Repeat Yourself)。

添加__init.py__到测试文件夹还应该帮助 pytest 在整个应用程序中查找模块。但是,请注意,Python 3.3+ 具有隐式命名空间包,允许它创建没有__init__.py文件的包。话虽如此,__init__.py为此特定目的创建文件似乎更像是 pytest 的解决方法,而不是 python 的要求。有关更多信息,请参阅:Is __init__.py not required for packages in Python 3.3+