pytest的ModuleNotFoundError

时间:2019-02-26 22:11:53

标签: python python-3.x docker pytest

我希望将tests folder separate添加到我的应用程序代码中。我的项目结构就是这样

myproject/
  myproject/
    myproject.py
    moduleone.py
  tests/
    myproject_test.py

myproject.py

from moduleone import ModuleOne

class MyProject(object)
....

myproject_test.py

from myproject.myproject import MyProject
import pytest

...

我使用myproject.myproject,因为我使用了命令

python -m pytest

从项目根目录./myproject/

但是,然后这些模块中的导入失败并

  

E ModuleNotFoundError:没有名为“ moduleone”的模块

我正在运行Python 3.7,并且已经阅读到从3.3开始,不再需要空的__init__文件,这意味着我的项目成为了implicit namespace package

但是,我尝试在__init__.py中添加myproject/myproject/文件,也尝试在conftest.py中添加myproject/文件,但均无效

我有read answersmess with the paths说,然后对其他问题的评论说not to

正确的方法是什么,我想念什么?

编辑;

可能相关,我使用requirements.txt通过pip安装pytest。这可能有关吗?如果是这样,在这种情况下安装pytest的正确方法是什么?

编辑2:

sys.path中的路径之一是/usr/src/app/,这是一个排在/my/local/path/myproject/上的docker卷。

该卷应该改为/my/local/path/myproject/myproject/吗?

7 个答案:

答案 0 :(得分:11)

不确定此解决方案是否特定于我的问题,但我只是将 mainWindow.webContents.on('did-finish-load', ()=>{ mainWindow.webContents.send('submitted-form', data); }) 添加到我的 __init__.py 文件夹中,这样就解决了问题。

答案 1 :(得分:5)

解决方案:使用PYTHONPATH信封。 var

PYTHONPATH=. pytest

如@J_H所述,您需要显式添加项目的根目录,因为pytest仅添加到测试文件所在的sys.path目录中(这就是@ Mak2006的答案起作用的原因。)


好的做法:使用Makefile或其他自动化工具

如果您很懒惰并且不想一直键入该长命令,则一种选择是在项目的根目录中创建一个Makefile,例如:

.PHONY: install test

default: test

install:
    pip install --upgrade .

test:
    PYTHONPATH=. pytest

这可以让您简单地运行:

make test

或(甚至更短)

make

另一种常见的替代方法是使用某些标准测试工具,例如tox

答案 2 :(得分:1)

保留所有相同内容,只是在根文件夹中添加了一个空白测试文件。已解决

以下是调查结果,这个问题确实困扰了我一段时间。 我的文件夹结构是

mathapp/
    - server.py  
    - configuration.py 
    - __init__.py 
    - static/ 
       - home.html  
tests/            
    - functional 
       - test_errors.py 
    - unit  
       - test_add.py

和pytest会抱怨ModuleNotFoundError。

我介绍了一个与mathsapp和tests目录相同级别的模拟测试文件。该文件不包含任何内容。现在pytest不会抱怨。

没有文件的结果

$ pytest
============================= test session starts =============================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\mak2006\workspace\0github\python-rest-app-cont
collected 1 item / 1 error

=================================== ERRORS ====================================
_______________ ERROR collecting tests/functional/test_func.py ________________
ImportError while importing test module 'C:\mainak\workspace\0github\python-rest-app-cont\tests\functional\test_func.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests\functional\test_func.py:4: in <module>
    from mathapp.service import sum
E   ModuleNotFoundError: No module named 'mathapp'
=========================== short test summary info ===========================
ERROR tests/functional/test_func.py
!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
============================== 1 error in 0.24s ===============================

结果与文件

$ pytest
============================= test session starts =============================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\mak2006\workspace\0github\python-rest-app-cont
collected 2 items

tests\functional\test_func.py .                                          [ 50%]
tests\unit\test_unit.py .                                                [100%]

============================== 2 passed in 0.11s ==============================

答案 3 :(得分:1)

就我而言,我在我的测试目录中添加了一个 __init__.py,其中包含:

import sys
sys.path.append('.')

我的应用代码与我的测试目录处于同一级别。

答案 4 :(得分:0)

请确保在.环境变量中包含$PYTHONPATH点。

您可以使用以下代码片段来调试此类问题:

import pprint
import sys
pprint.pprint(sys.path)

您的问题设法在三个不同的级别上使用myproject。至少在调试过程中,您可能需要使用三个不同的名称,以减少可能的混淆。

答案 5 :(得分:0)

因此,sys.path似乎必须包括应用程序目录,而不是包含应用程序目录和测试目录的项目根文件夹。

因此,在我的情况下,/my/local/path/myproject/myproject/必须位于sys.path中,而不是/my/local/path/myproject/中。

然后我可以在pytest中运行/my/local/path/myproject/(不需要python -m pytest)。这意味着/myproject/myproject/中的模块可以相互查找,也可以进行测试,而无需任何名称空间嵌套。

所以我的测试看起来像

 from moduleone import ModuleOne
 import pytest

 def test_fun():
     assert ModuleOne.example_func() == True

也就是说,似乎有many gotchas,所以我不知道这是否正确。

答案 6 :(得分:0)

我也遇到了这个问题,并且在我的项目特定环境变量中使用诗歌来进行依赖关系管理并使用direnv。请注意,我是Python的新手,所以我不知道这是否正确。

这是我的整个.envrc文件:

layout_poetry() {
  if [[ ! -f pyproject.toml ]]; then
    log_error 'No pyproject.toml found.  Use `poetry new` or `poetry init` to create one first.'
    exit 2
  fi

  local VENV=$(poetry env list --full-path | cut -d' ' -f1)
  if [[ -z $VENV || ! -d $VENV/bin ]]; then
    log_error 'No created poetry virtual environment found.  Use `poetry install` to create one first.'
    exit 2
  fi
  VENV=$VENV/bin
  export VIRTUAL_ENV=$(echo "$VENV" | rev | cut -d'/' -f2- | rev)
  export POETRY_ACTIVE=1
  PATH_add "$VENV"
}

layout poetry
export PYTHONDONTWRITEBYTECODE=1
export PYTHONPATH="$PWD/project_name"

我不知道是否需要布置诗歌,因为它本来应该已经为我们创造了虚拟环境,但这是我同事推荐的,所以我同意了。没有该功能,排版诗歌也无法正常工作,而且我不喜欢将其添加到zshenv中,因此在这里添加了它。

对于这个特定问题,最后一行是赚钱的人。