Pytest不能导入模块,而python可以

我正在用Python编写一个包。我使用virtualenv。我在virtualenv的.pth路径中设置了模块的根路径,这样我就可以在开发代码和测试时导入包的模块(问题1:这是一种好方法吗?)这很好(这是一个例子,这是我想要的行为):

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py
issued command: echo hello
command output: hello

但是,如果我尝试使用PyTest,我会得到一些导入错误消息:

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile:
collected 0 items / 1 errors


================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ns.py:2: in <module>
from rc import ns
E   ImportError: cannot import name ns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================= 1 error in 0.09 seconds ==========================================
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest

我有点困惑,这似乎表明一个导入错误,但Python做得很好,为什么有一个问题,特别是与PyTest?对原因/补救(问题2)有什么建议吗?我在谷歌上搜索了PyTest的“ImportError: cannot import”错误,但我得到的点击率与丢失的python路径和补救措施有关,这似乎不是这里的问题。有什么建议吗?

256831 次浏览

可能是Pytest没有将包作为Python模块读取,而Python是(可能是由于路径问题)。尝试更改pytest脚本的目录或显式地将模块添加到PYTHONPATH中。

也可能是您的机器上安装了两个版本的Python。检查Python源代码中的pytest和您运行的Python shell。如果它们是不同的(即Python 2 vs 3),使用source activate来确保您正在运行为安装模块的同一Python安装的pytest。

找到了答案:

如果你计划使用pytest,不要将__init__.py文件放在包含TESTS的文件夹中。我有一个这样的文件,删除它就解决了问题。

这实际上被隐藏在import terror:没有名为yadayadayada的模块;的第二个答案的评论中,所以我没有看到它,希望它在这里能得到更多的关注。

我也遇到了同样的问题,但原因不是上面提到的那些:

py。测试是全局安装的,而包是安装在虚拟环境中的。

解决方案是在虚拟环境中安装pytest。(如果你的shell像Bash一样散列可执行文件,使用hash -r,或使用py.test的完整路径)

我有一个类似的问题,完全相同的错误,但不同的原因。我运行的测试代码很好,但是针对的是模块的旧版本。在我代码的前一个版本中,一个类存在,而另一个不存在。在更新代码之后,我应该运行以下命令来安装它。

sudo pip install ./ --upgrade

在安装更新的模块时,运行pytest产生了正确的结果(因为我使用了正确的代码库)。

我不能说我理解为什么这样工作,但我有同样的问题,如果我运行python -m pytest,测试工作正常。

我在一个virtualenv中,pytest也在全局范围内可用:

(proj)tom@neon ~/dev/proj$ type -a python
python is /home/tom/.virtualenvs/proj/bin/python
python is /usr/bin/python


(proj)tom@neon ~/dev/proj$ python -V
Python 3.5.2


(proj)tom@neon ~/dev/proj$ type -a pytest
pytest is /home/tom/.virtualenvs/proj/bin/pytest
pytest is /usr/bin/pytest


(proj)tom@neon ~/dev/proj$ pytest --version
This is pytest version 3.5.0, imported from /home/tom/.virtualenvs/proj/lib/python3.5/site-packages/pytest.py

安装包到您的虚拟环境

. 0 .
在我的例子中,导入错误发生是因为包指向另一个包/目录的相同的名称,它的路径比我实际想要的文件夹高一级。 我认为这也解释了为什么有些人需要删除初始化 .py,而另一些人需要添加回来。< / p >

我只是把print(the_root_package.__path__)(在import the_root_package之后)放在python控制台和pytest脚本中,以比较区别

底线:当你执行python时,你导入的包可能与你运行pytest时的包不同。

我刚刚通过在我的项目根中删除__init__.py来解决这个问题:

.
├── __init__.py <--- removed
├── models
│   ├── __init__.py
│   ├── address.py
│   ├── appointment.py
│   └── client.py
├── requirements.txt
├── setup.cfg
├── tests
│   ├── __init__.py
│   ├── models
│   │   ├── __init__.py
│   │   ├── appointment_test.py
│   │   └── client_test.py
│   └── other_test.py
└── script.py

如果你有一个tests.py文件和一个带有tests/__init__.py的tests文件夹,这个问题就会发生。

在收集过程中,pytest找到文件夹,但当它试图从文件夹导入测试文件时,tests.py文件将导致导入问题。

要解决这个问题,只需删除tests.py文件,并将所有测试放在tests/文件夹中。

针对您的特定情况,修复将精确地:

  • 删除文件/home/zz/Desktop/GitFolders/rc/tests.py
  • 确保/home/zz/Desktop/GitFolders/rc/tests/__init__.py存在

对于那些尝试了所有方法仍然出错的人,我有一个解决方法。

安装pytest的文件夹中,进入pytest-env文件夹。

打开pyvenv.cfg文件。

在文件中将include-system-site-packages更改为真正的

home = /usr/bin
include-system-site-packages = true
version = 3.6.6

希望它能起作用。别忘了投票。

另一种特殊情况:

我在使用毒素时遇到了问题。所以我的程序运行良好,但通过tox的单元测试一直抱怨。 在安装包(程序所需)之后,您需要在tox.ini

中额外指定单元测试中使用的包
[testenv]
deps =
package1
package2
...

上面的答案对我不适用。我只是通过将模块的绝对路径附加到test_xxx.py(你的测试模块)顶部的sys.path来解决它,比如:

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

有类似的问题,当我在测试目录下添加__init__.py文件时,它工作了。

如果它与最初在python 2.7中开发,现在迁移到python 3的python代码有关。X认为这个问题可能与进口问题有关。

< p >。 当从位于同一目录的文件:base导入对象时,这将在python 2.x:

中工作
from base import MyClass

在python 3。x你应该替换为base全路径或.base 不这样做会导致上述问题。 所以尝试:< / p >

from .base import MyClass

如果你的文件夹中需要一个初始化.py文件,请复制该文件夹并删除其中的初始化.py来运行你的测试,它适用于本地项目。如果你需要定期运行测试,看看你是否可以将你的初始化.py移动到一个单独的文件。

我得到这个使用VSCode。我有一个conda环境。我不认为VScode python扩展可以看到我正在做的更新。

python c:\Users\brig\.vscode\extensions\ms-python.python-2019.9.34911\pythonFiles\testing_tools\run_adapter.py discover pytest -- -s --cache-clear test
Test Discovery failed:

我必须运行pip install ./ --upgrade

编辑你的conftest.py并添加以下代码行:

import os, sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(file), '..')))

如果试图通过终端运行测试用例,请使用以下ex:

python -m pytest test_some_step_file_steps.py --html=HTML_step_file_output.html --self-contained-html
< p >(解决) 在直接进入删除/添加__init__.py的解决方案之前,我们可能还想看看在你的类中是如何导入的。实际上,我花了一天的时间在__init__.py上,想着这可能是问题所在:)然而,这是相当有意义的

在我的例子中,从一个python类调用类到另一个python类的方式是错误的,这抛出了ImportError。修正了类/模块被调用的方式,它像魅力一样工作。希望,这也能帮助其他人。

是的,对于类似的错误,我们可能有不同的解决方案,这取决于代码的编写方式。最好在自我调试上花更多的时间。经验教训:)快乐的编码!!

我今天遇到了这个问题,并通过从我的项目目录的根调用python -m pytest来解决它。

从相同的位置调用pytest仍然会导致问题。

我的项目总监组织如下:

api/
- server/
- tests/
- test_routes.py
- routes/
- routes.py
- app.py

模块routes在我的test_routes.py中被导入为:from server.routes.routes import Routes

希望有帮助!

我已将所有测试放在测试文件夹中,并得到相同的错误。我通过在该文件夹中添加__init__.py来解决这个问题,如下所示:

.
|-- Pipfile
|-- Pipfile.lock
|-- README.md
|-- api
|-- app.py
|-- config.py
|-- migrations
|-- pull_request_template.md
|-- settings.py
`-- tests
|-- __init__.py <------
|-- conftest.py
`-- test_sample.py

Python导入系统的又一次巨大胜利。我认为没有达成共识的原因是,什么可行可能取决于您的环境和您在其之上使用的工具。

我从VS Code中使用这个,在conda环境下的Windows测试资源管理器中,Python 3.8。

我要工作的设置是:

mypkg/
__init__.py
app.py
view.py
tests/
test_app.py
test_view.py

在这种设置下,智能感知和测试发现都起作用。

注意,我最初尝试了以下建议在这里

src/
mypkg/
__init__.py
app.py
view.py
tests/
test_app.py
test_view.py

我找不到从VS Code得到这个工作的方法,因为src文件夹只是吹了导入系统的头脑。我可以想象,有一种方法可以让它从命令行工作。作为一个相对较新的Python编程转换者,它给了我一种使用COM的怀旧感觉,但没有那么有趣。

我的观点是:如果不使用虚拟环境,pytest可能会失败。有时它会起作用,有时则不会。

因此,解决方案是:

  • 使用PIP卸载删除pytest
  • 创建你的venv
  • 激活你的venv
  • PIP在可编辑模式下安装项目路径,因此pytest将它视为一个模块(否则,pytest不会找到您的内部导入)。为此,您需要一个setup.py文件
  • 安装包,包括pytest
  • 最后,运行测试

代码,使用windows PowerShell:

pip uninstall pytest
python.exe -m venv my_env
.\my_env\Scripts\activate
(my_env) pip install -e .
(my_env) pip install pytest pytest-html pandas numpy

最后

(my_env) pytest --html="my_testing_report.html"

一个setup.py的例子,用于pip install -e:

import setuptools


setuptools.setup(
name='my_package',
version='devel',
author='erickfis',
author_email='erickfis@gmail.com',
description='My package',
long_description='My gooood package',
packages=setuptools.find_packages(),
classifiers=[
'Programming Language :: Python :: 3',
'Operating System :: OS Independent',
],
include_package_data=True
)

我不同意那些说你必须删除任何__init__.py文件的帖子。你必须做的是改变sys.path

运行一个实验,在正常运行代码时打印sys.path。 然后在通过pytest运行代码时打印sys.path。我认为您会发现这两条路径之间存在差异,因此pytest会中断

为了解决这个问题,在第二个实验的第0个索引处插入第一个实验的路径。

'/usr/exampleUser/Documents/foo'为实验1中print(sys.path)的第一个元素。

下面是代码,应该解决你的问题:

< p > <代码>导入系统 sys。path[0] = '/usr/exampleUser/Documents/foo' < /代码> < / p >

把它放在文件的顶部,在实际的import语句之前。

来源:我自己也在处理这个问题,上面的过程解决了这个问题。

解决了

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

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

和pytest将抱怨ModuleNotFoundError,并给出提示:

确保你的测试模块/包有有效的Python名称。

我介绍了一个与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 ==============================

我通过在环境变量中为我正在运行测试的特定配置设置PYTHONPATH来解决我的问题。

当你在PyCharm上查看测试文件时:

  1. __abc0 + __abc1 + __abc2
  2. 类型Edit Configurations
  3. 在Environment >下设置你的PYTHONPATH;环境变量。

更新

  1. 移动到项目的根目录
  2. 创建虚拟环境
  3. 激活新创建的虚拟环境
  4. 将变量$PYTHONPATH设置为项目的根并导出它:
export PYTHONPATH=$(pwd)
  1. 不要从tests/目录或src/目录中删除__init__.py

还要注意:

  • 你的目录的根不是一个python模块,所以不要添加__init__.py
  • conftest.py在项目的根目录中是不必要的。
    $PYTHONPATH变量只在当前终端/控制台会话期间可用;所以你每次都需要设置这个。 (如果您正在使用pycharm,则可以按照此更新之前的步骤操作)
简单地把一个空的conftest.py文件放在项目根目录中,因为当pytest发现一个conftest.py时,它会修改sys.path,这样它就可以从conftest模块导入东西。 一般的目录结构可以是:

Root
├── conftest.py
├── module1
│   ├── __init__.py
│   └── sample.py
└── tests
└── test_sample.py

在我的例子中,我在一个容器中工作,不幸的是,pytest倾向于使用python2.7而不是我选择的python3解释器。

在我的情况下,这是有效的:

python3 -m pytest

我的文件夹结构

/
app/
-module1.py
-module2.py
-tests/
--test_module1.py
--test_module2.py
requirements.txt
README.md

如果你在终端上运行Pytest:

使用--import-mode=append命令行标志运行pytest。

官方文档中的参数描述:https://docs.pytest.org/en/stable/pythonpath.html


< p > < em >乌利希期刊指南: 之前我也写过如果你使用PyCharm,如何做同样的事情,但社区不喜欢扩展的答案,所以我删除了可能对有类似问题的人有帮助的额外信息

我最近也遇到了类似的问题。对我来说,它起作用的方式是意识到“setup.py”;是错误的

之前我删除了我之前的src文件夹,并添加了一个具有其他名称的新文件夹,但我没有在setup.py上更改任何内容(我猜是新手错误)。

因此,将setup.py指向正确的packages文件夹对我来说很有用

from setuptools import find_packages, setup


setup(
name="-> YOUR SERVICE NAME <-",
extras_Require=dict(test=["pytest"]),
packages=find_packages(where="->CORRECT FOLDER<-"),
package_dir={"": "->CORRECT FOLDER<-"},
)

同样,在test文件夹和根文件夹中都没有init.py

希望它能帮助到别人=)

最好!

在我的例子中,问题是文件名和类名完全相同:分别是FrameAnalyzer.pyFrameAnalyzer。一旦我将文件名更改为frame_analyzer.py,一切都工作了。

这是一篇中型文章 !描述问题!

问题是您使用的是哪个pytest以及您使用的是虚拟环境。 如果您在系统范围内(换句话说,在虚拟环境之外)安装了pytest,那么pytest有一个讨厌的习惯,就是只在虚拟环境之外寻找模块!如果你的项目正在使用一个只安装在你的虚拟环境中的模块,并且你正在使用一个系统范围的pytest,即使你已经激活了虚拟环境,它也不会找到这个模块

下面是详细的步骤

  1. 退出任何虚拟环境
  2. 使用Pip卸载pytest
  3. 激活项目的虚拟环境
  4. 在虚拟环境中安装pytest
  5. Pytest现在将找到仅虚拟环境的包!

请检查这里:https://docs.pytest.org/en/documentation-restructure/background/pythonpath.html

我有一个问题与pytest(已解决使用python -m pytest);错误在于

FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.9/site-packages/...

我发现问题是在tests/tests/subfolders中缺少__init__.py

这可以通过在系统的环境变量中添加相应的路径来解决。

由于您正在使用virtualenv,因此pytest可能不会读取虚拟机的环境变量。

我也遇到过这个问题,并通过将路径添加到系统的环境变量(path)来解决它

我在那里找到了答案:单击在这里

如果你有其他的项目结构,将conftest.py放在包的根目录下(包含包但本身不是包,因此不包含初始化.py)

<强> < / >强的另一个建议

我在SO和其他地方探讨了这个问题和其他各种问题……所有关于在项目目录结构的各个部分添加(或删除)空__init__.py的东西,和/或在conftest.py中添加(或删除)空__init__.py的东西,所有关于PYTHONPATH的东西,等等,等等:这些解决方案都不适合我,在实际上是一个非常简单的情况下,这不应该引起任何悲伤。

我认为这是pytest当前设置中的一个缺陷。事实上,我最近收到了一个来自SO的人的消息,他显然知道他的东西。他说pytest不是被设计来与(根据Java/Groovy/Gradle)单独的“src”一起工作的。和“;test"目录结构,并且测试文件应该混合在应用程序目录和文件中。这也许在某种程度上提供了一种解释……然而,测试,特别是集成/功能测试,并不一定总是与特定的目录完全对应,我认为pytest应该在这方面给用户更多的选择。

项目结构:

project_root
src
core
__init__.py
__main__.py
my_other_file.py
tests
basic_tests
test_first_tests.py

导入问题提出:非常简单,__main__.py有一行import my_other_file。这(并不奇怪)工作OK时,我只是运行应用程序,即运行python src/core从根目录。

但是当我用一个导入__main__.py的测试运行pytest时,我得到

ModuleNotFoundError: No module named 'my_other_file'

__main__.py中试图导入“my_other_file”的行中。注意,在我的例子中,这里的问题是,在pytest测试的过程中,一个应用程序文件无法在同一个包中找到另一个应用程序文件

< p > < >强使用PYTHONPATH < / >强 < br > 经过大量的实验,并将一个__init__.py文件和一个confest.py文件放在几乎我能找到的每个目录中(我认为关键文件是__init__.py添加到"test ";和“basic_test ",参见上面的目录结构),然后将PYTHONPATH设置为如下所示

PYTHONPATH=D:\My Documents\software projects\EclipseWorkspace\my_project\src\core

... 我发现它很有效。测试文件中的导入必须稍作调整,一般模式为from core import app, project,但测试文件能够“;看到”;core,最重要的是,没有必要在应用程序文件中乱搞import命令。

然而……由于某种原因,测试现在使用这个方法运行<强> < /慢得多强大> !与下面的解决方案相比,core包只被加载一次,我怀疑PYTHONPATH解决方案可能会导致大量的代码被一次又一次地重新加载。我还不能证实这一点,但我看不出任何其他解释。

< p > < >强替代< / >强 < br > 我的替代相当简单的解决方案是:

1 -在应用程序包中的__init__.py中(即目录"core"),放入以下两行:

import pathlib, sys
sys.path.append(str(pathlib.Path(__file__).parent))

注意,通常在__init__.py中没有任何东西。事实证明,正如我通过实验证实的那样,pytest 通常(见下面的更新)在这种情况下执行__init__.py pytest已经做了它所做的任何事情来弄乱sys.path项。

2 - UPDATE 2022-01: 我发现的原始解决方案涉及将一个conftest.py文件放在应用程序目录中(ies) -没有它就不能工作。这显然是不可取的。我发现另一个解决方案是将这段代码放在根目录下的conftest.py文件中:

def pytest_configure(config):
import src.core # NB this causes `src/core/__init__.py` to run
# set up any "aliases" (optional...)
import sys
sys.modules['core'] = sys.modules['src.core']

... 实际上,从我的实验来看,将conftest.py放在应用程序目录中的效果似乎是pytest随后在该目录中运行__init__.py。这似乎暗示模块正在被导入…

< p >(以前的建议:)< br > 是的,你也<强> < / >强包含一个空的“conftest.py"文件在目录"core"。希望这应该是你唯一需要的conftest.py:我对所有这些都进行了实验,将一个放在根目录中是不必要的(如果没有__init__.py中建议的代码,它也不能解决问题)

3. -最后,在我的测试函数中,在我的例子中调用core.__main__之前,我必须导入我知道即将被导入的文件:

import core.my_other_file
import core.__main__

如果您在文件中的第一个测试中执行此操作,您将发现sys。为该文件中的所有其他测试设置了Modules。更好的是,将import core.my_other_file放在文件的最开始,在第一个测试之前。不幸的是,from core import *似乎不能工作。

晚些时候:这种方法有一些特点和局限性。例如,虽然-k开关可以过滤入/出测试或整个文件,但如果你执行类似pytest tests/tests_concerning_module_x的操作,似乎core.__init__.py没有运行…因此,在测试期间,核心模块中的文件再次相互不可导入。其他限制可能会被揭示出来。


正如我所说,我认为这是pytest设置中的一个缺陷。我完全不知道pytest做了什么来为sys.path建立一个常用性的设置,但它显然是错误的。应该没有必要依赖PYTHONPATH,或者其他什么,如果这确实是“官方的”;解决方案,关于这个主题的文档是非常缺乏

注意,我的这个建议有一个问题:每次pytest在一个模块中运行__init__.py时,都会在sys.path中添加sys.path,这意味着这个新路径之后会在sys.path中变成永久,无论是在测试期间,还是更令人担忧的是,在应用程序本身的运行期间,如果有任何东西实际上调用了__init__.py。(顺便说一句,只是执行python src/core(如我的例子)不会导致这种情况发生。但其他事情可能会。)

为了解决这个问题,我有一个笨拙但有效的解决方案:

import pathlib, sys, traceback
frame_list = traceback.extract_stack()
if len(frame_list) > 2:
path_parts = pathlib.Path(frame_list[2].filename).parts
if len(path_parts) > 2:
module_dir_path_str = str(pathlib.Path(__file__).parent)
if sys.platform.startswith('win'):
if path_parts[-3:-1] == ('Scripts', 'pytest.exe'):
sys.testing_context = True
sys.path.append(module_dir_path_str)
elif sys.platform.startswith('lin'):
if path_parts[-3:-1] == ('_pytest', 'config'):
sys.testing_context = True
sys.path.append(module_dir_path_str)

这是基于我对pytest在W10上下文中和Linux Mint 20上下文中运行某些东西时的堆栈跟踪的检查。这意味着在应用程序运行时,不会混淆sys.path

当然,这可能会与未来的pytest版本有所不同。我的版本是6.2.5。

更新PYTHONPATH直到src文件夹

export PYTHONPATH=/tmp/pycharm_project_968/src

对我来说,这个问题是我的测试文件命名为:xxx.test.py

它解决了我命名文件:xxx_test.py

但我想命名为:test_xxx.py也可以。

我在毒理下使用苯妥酮时也有同样的问题。我通过在setup.cfg文件中包含项目的任何子模块来解决这个问题。

我的项目结构:

src/
main_module
- __init__.py
...
submodule_a
- __init__.py
...
submodule_b
- __init__.py
...
tests/
- __init__.py
- test_a.py
...

我的setup.cfg文件

...
[options]
packages = main_module, main_module.submodule_a, main_module.submodule_b
package_dir =
= src
...

我的情况:

  • 所有配置都是正确的,除了我忘记删除默认的my_app/tests.py

    • 在移除它之后,python -m pytest tests/my_app工作正常
  • < p > pytest.ini:

[pytest]
DJANGO_SETTINGS_MODULE=necktie_hy.settings
python_files=*/tests/*/test_*.py
python_classes=Test

structure

我的问题通过修复导入解决了。我正在导入from project_root.tests.xxxx,当我将其更改为from tests.xxxx时,它工作了。有趣的是,Pycharm在项目树视图中没有将其标记为错误,我不得不进入文件,只有在那里它才显示为红色。

注意事项,顺序如下:

    确保应用程序的每个文件夹和子文件夹都有__init__.py 李文件。< / >
  1. 确保tests文件夹(模块)在app文件夹(模块)中。
  2. 尝试pytest命令,如果不工作,尝试python3 -m pytest

从pytest 7.0开始,你现在可以在pytest.ini中添加pythonpath。不需要在根目录中添加__init__.pyconftest.py

[pytest]
minversion = 7.0
addopts = --cov=src
pythonpath = src
testpaths =
tests

你可以不带任何参数运行pytest

https://docs.pytest.org/en/7.0.x/reference/reference.html#confval-pythonpath

当我试图在我的测试文件中导入一个新类时,我遇到了相同/类似的问题。在我的例子中,我将新导入移动到测试文件中的最后一个导入,然后问题就消失了。但不完全确定原因。