繁体   English   中英

Py.test 没有名为 * 的模块

[英]Py.test No module named *

我有这样的文件夹结构

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py

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

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

$ touch tests/__init__.py

我不擅长打包和导入,但我认为这有助于pytest确定目标App模块所在的位置。

我已经在/App/App目录中有一个__init__.py文件,并希望从项目根目录运行测试而没有任何路径修改魔法:

 python -m pytest tests

输出立即如下所示:

➟  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 ==============================

所以你正在从/App运行py.test 您确定/App/App在您的$PYTHONPATH吗?

如果不是,尝试import app代码将失败并显示此类消息。

EDIT0:为了完整性,包括我下面评论中的信息。

导入 app 的尝试只有在/App/App执行时才会成功,这里不是这种情况。 您可能希望通过将__init__.py放入其中来使/App/App成为一个包,并将您的导入更改为from App import app限定为from App import app

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

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

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

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

myproject
  --app1
    --__init.py__
    --test.py
  --app2
    --__init.py__
    --test.py
  --__init.py__

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

长话短说

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

(如果你看一下问题文件夹结构,那将与“测试”文件夹处于同一级别,而不是在其中)

更多信息:

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

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

最后,您可能想在空的 conftest.py 中编写一些代码,专门用于在不同的测试文件之间共享 fixture,以避免重复代码。 毕竟,在编写测试时也应该遵循 DRY 原则(不要重复自己)。

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

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

由于您当前的包尚未在您的$PYTHONPATHsys.path - pytest 收到此错误。

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

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

我得到了类似的问题。 在尝试了包括在虚拟环境上安装 pytest 和从包中添加/删除__init__.py文件在内的多种方法之后,没有一个对我有用。

对我有用的解决方案是(Windows 解决方案):将项目文件夹(不是包文件夹)添加到 python 路径(设置 PYTHONPATH=%PYTHONPATH%;%CD%)

从项目文件夹和繁荣运行我的脚本,它起作用了。

我有这样的文件夹结构

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py

在我的test_app.py file ,有一行要导入我的应用程序模块。 在根文件夹上运行py.test时,出现此错误,提示没有名为app的模块。 我应该如何配置呢?

这对我有用:转到父应用程序,然后pip install -e . (安装本地和可编辑的应用程序)。

对我有用的是:我必须在我的测试文件中进行绝对导入,并在根文件夹中调用python -m test

我遇到了同样的问题。

my-app
--conf
--my-app
--tests

我设置了__init__.py文件。 我添加了一个conftest.py (用于共享pytest.fixtures )。 我将其添加到我的诗歌文件( pyproject.toml

[tool.pytest.ini_options]
pythonpath = [
  "."

原来这是我使用连字符而不是下划线。 不……

# pytest can't find Module
--my-app

# works
--my_app

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM