pytest 无法导入模块,而 python 可以
pytest cannot import module while python can
我正在 Python 开发一个包。我使用虚拟环境。我在我的 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 路径和补救措施有关,这似乎不是这里的问题。有什么建议吗?
可能是 Pytest 没有将包作为 Python 模块读取,而 Python 是(可能是由于路径问题)。尝试更改 pytest 脚本的目录或将模块显式添加到 PYTHONPATH。
或者您的计算机上安装了两个版本的 Python。检查 pytest 的 Python 源和 运行 的 python shell。如果它们不同(即 Python 2 vs 3),请使用 source activate
确保您 运行 安装的 pytest 与模块安装的相同 python英寸
找到答案:
如果您计划使用 pytest,请不要将 __init__.py
文件放入包含 TESTS 的文件夹中。我有一个这样的文件,删除它解决了问题。
这个其实埋在了PATH issue with pytest 'ImportError: No module named YadaYadaYada'的第二个回答的评论里所以没看到,希望能在这里得到更多的关注。
我遇到了同样的问题,但原因与上述原因不同:
我在全局安装了 py.test,而软件包是在虚拟环境中安装的。
解决方案是在虚拟环境中安装 pytest
。 (如果你的 shell 散列可执行文件,就像 Bash 那样,使用 hash -r
,或者使用 py.test
的完整路径)
我遇到了类似的问题,错误完全相同,但原因不同。我 运行 测试代码很好,但针对的是旧版本的模块。在我的代码的前一个版本中,一个 class 存在,而另一个不存在。更新我的代码后,我应该 运行 以下内容来安装它。
sudo pip install ./ --upgrade
安装更新后的模块 运行ning 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
将软件包安装到您的虚拟环境中。
然后启动一个新的 shell 并再次获取您的虚拟环境。
在我的例子中,导入错误发生是因为包指向另一个 package/directory 具有 相同的名称 并且它的路径比我实际的文件夹高一级通缉。
我认为这也解释了为什么有些人需要删除 _ init _.py 而其他人需要添加回来。
我只是将 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
的测试文件夹,就会出现此问题。
在收集过程中 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 从 false 更改为 true .
home = /usr/bin
include-system-site-packages = true
version = 3.6.6
希望它有用。别忘了投票。
另一个特例:
我在使用 tox 时遇到了问题。所以我的程序 运行 很好,但是通过 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.x 中的 python 代码相关,那么问题可能与导入有关问题。
例如
从文件导入对象时:位于同一目录中的 base
这将适用于 python 2.x:
from base import MyClass
in python 3.x 你应该替换为 base
完整路径或 .base
不这样做会导致上述问题。
所以尝试:
from .base import MyClass
如果您的文件夹中需要 init.py 文件,请复制该文件夹并删除其中的 init.py 运行 你的测试适用于本地项目。如果你需要 运行 定期测试,看看你是否可以将你的 init.py 移动到一个单独的文件中。
我是用 VSCode 得到这个的。我有一个康达环境。我不认为 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), '..')))
如果尝试通过终端 运行 测试用例,请使用以下示例:
python -m pytest test_some_step_file_steps.py --html=HTML_step_file_output.html --self-contained-html
[已解决]
在直接进入删除/添加 __init__.py
的解决方案之前,我们可能还想看看导入是如何在您的 classes 中完成的。实际上,我只是 __init__.py
认为这可能是问题所在 :) 但是,这提供了很多信息。
在我的例子中,调用 classes 从一个 python class 到另一个 python class 的错误方式是 python class =12=]。修正了 classes/ 模块被调用的方式,它工作得很好。希望,这对其他人也有帮助。
是的,对于类似的错误,我们可能会根据代码的编写方式有不同的解决方案。最好花更多的时间进行自我调试。经验教训 :) 快乐编码!!!
我今天遇到了这个问题,通过从项目目录的根目录调用 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 中使用它,在 Windows 下的测试资源管理器中,在 conda 环境中,Python 3.8.
我必须进行的设置是:
mypkg/
__init__.py
app.py
view.py
tests/
test_app.py
test_view.py
在此设置下,智能感知有效,测试发现也有效。
请注意,我最初尝试了以下建议 here。
src/
mypkg/
__init__.py
app.py
view.py
tests/
test_app.py
test_view.py
我找不到让它在 VS Code 中运行的方法,因为 src
文件夹让导入系统大吃一惊。我可以想象有一种方法可以从命令行让它工作。作为一个相对较新的 Python 编程转换者,它给我一种使用 COM 的怀旧感觉,但乐趣稍差。
我的 2 美分:如果您不使用虚拟环境,pytest 将有机会失败。有时它会起作用,有时不起作用。
因此,解决方案是:
- 使用 pip uninstall 删除 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, for 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)
的第一个元素。
以下代码应该可以解决您的问题:
import sys
sys.path[0] = '/usr/exampleUser/Documents/foo'
将其放在文件的顶部,实际导入语句之前。
来源:我自己在处理这个问题,上面的过程解决了。
保持一切不变,只是在根文件夹中添加了一个空白测试文件..解决了
这是调查结果,这个问题确实困扰了我一段时间。
我的文件夹结构是
mathapp/
- server.py
- configuration.py
- __init__.py
- static/
- home.html
tests/
- functional
- test_errors.py
- unit
- test_add.py
并且 pytest 会抱怨 ModuleNotFoundError
并给出提示:
make sure your test modules/packages have valid Python names.
我在 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[=11=]github\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[=11=]github\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[=12=]github\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 上查看测试文件时:
- Ctrl + Shift + A
- 类型
Edit Configurations
- 在“环境”>“环境变量”下设置
PYTHONPATH
。
更新
- 移至项目的根目录
- 创建虚拟环境
- 激活您新创建的虚拟环境
- 将变量
$PYTHONPATH
设置为项目的根目录并导出它:
export PYTHONPATH=$(pwd)
- 不要从
tests/
目录或 src/
目录中删除 __init__.py
。
另请注意:
- 你的根目录不是 python 模块所以不要添加
__init__.py
conftest.py
在项目的根目录中不是必需的。
$PYTHONPATH
变量仅在当前 terminal/console 会话期间可用;所以你每次都需要设置这个。
(如果您在 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
更新:
之前我还写过如果你使用 PyCharm 如何做同样的事情,但社区不喜欢扩展答案,所以我删除了可能对有类似问题的人有帮助的额外信息。
我最近遇到了类似的问题。它对我有用的方式是意识到“setup.py”是错误的
之前我删除了我以前的 src
文件夹,并添加了一个具有其他名称的新文件夹,但我没有更改 setup.py
上的任何内容(我猜是新手错误)。
所以将 setup.py
指向正确的包文件夹对我有用
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<-"},
)
此外,init.py
不在测试文件夹中,也不在根文件夹中。
希望对大家有所帮助=)
最好!
在我的例子中,问题是文件名和 class 名称完全相同:分别是 FrameAnalyzer.py
和 FrameAnalyzer
。一旦我将文件名更改为 frame_analyzer.py
,一切正常。
这里是a medium article!描述问题!
问题在于你使用的是哪个pytest以及你对虚拟环境的使用。
如果你在系统范围内安装了 pytest,换句话说,在虚拟环境之外,pytest 有一个坏习惯,它只在你的虚拟环境之外寻找模块!如果您的项目使用的模块仅安装在您的虚拟环境中,并且您使用的是系统范围的 pytest,即使您已激活虚拟环境,它也找不到该模块。1
步骤如下:1
- 退出任何虚拟环境
- 使用pip卸载pytest
- 激活项目的虚拟环境
- 在虚拟环境中安装pytest
- 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) 中解决了这个问题
我在那里找到了答案:点击here
If you have other project structure, place the conftest.py in the package root dir (the one that contains packages but is not a package itself, so does not contain an init.py)
另一个建议
我在 SO 和其他地方探讨了这个问题和其他各种问题......所有关于在 and/or conftest.py 中添加(或删除)空 __init__.py
的内容项目目录结构,所有关于 PYTHONPATH 的东西,等等:NONE 这些解决方案对我有用,实际上是在一个非常简单的情况下,不应该引起任何悲伤。
我认为这是 pytest 当前设置中的一个缺陷。事实上,我最近从 SO 上的某个人那里收到了一条消息,他清楚地知道他的东西。他说 pytest 并非设计用于(根据 Java/Groovy/Gradle)单独的“src”和“test”目录结构,并且测试文件应该混合在应用程序目录和文件中。这可能在某种程度上提供了一种解释......然而,测试,特别是 integration/functional 测试,并不总是与特定目录完全对应,我认为 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
。当我只是 运行 应用程序时,这(毫不奇怪)工作正常,即来自根目录的 运行 python src/core
。
但是当我 运行 pytest
进行导入 __main__.py
的测试时,我得到
ModuleNotFoundError: No module named 'my_other_file'
在 __main__.py
中试图导入“my_other_file”的行中。请注意,在我的例子中,这里的问题是,在 pytest 测试过程中,一个应用程序文件无法在同一包中找到另一个应用程序文件。
使用 PYTHONPATH
经过大量实验,将一个 __init__.py
文件和一个 confest.py 文件放在我能找到的几乎每个目录中(我认为关键文件是 __init__.py
添加到“测试”和“ basic_tests”,见上面的目录结构),然后设置PYTHONPATH如下
PYTHONPATH=D:\My Documents\software projects\EclipseWorkspace\my_project\src\core
...我发现它有效。测试文件中的导入必须稍微调整一下,一般模式是 from core import app, project
,但测试文件能够“看到”core
,关键是没有必要乱用 import
应用程序文件中的命令。
然而...出于某种原因,现在使用此方法进行的测试运行慢得多!与我下面的解决方案相比,可以看到 core
包只加载了一次,我怀疑 PYTHONPATH 解决方案可能导致大量代码被一次又一次地重新加载。我还不能证实这一点,但我看不到任何其他解释。
替代方案
我的另一种相当简单的解决方案是:
1 - 在 __init__.py
该应用程序包(即目录“core”)中,放入以下两行:
import pathlib, sys
sys.path.append(str(pathlib.Path(__file__).parent))
注意通常 __init__.py
中当然没有任何内容。事实证明,正如我通过实验证实的那样,pytest usually(见下面的更新)在这种情况下执行 __init__.py
,after pytest已经做了它所做的一切来搞乱 sys.path
条目。
2 - 2022-01 更新:
我发现的原始解决方案涉及将 conftest.py 文件放在 application 目录中 - 没有它就无法工作。这显然是不可取的。我发现另一种解决方案是将此代码放入根目录中的 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然后运行s __init__.py
在该目录中。这似乎暗示正在导入模块...
(之前的建议:)
是的,您还 HAVE 在目录中包含一个空的 "conftest.py" 文件“核”。希望这应该是您唯一需要的 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 *
似乎不起作用。
Later:此方法有一些特殊性和局限性。例如,尽管 -k
开关可以正常过滤 in/out 测试或整个文件,但如果您执行 pytest tests/tests_concerning_module_x
之类的操作,则 core.__init__.py
似乎无法过滤 [=159] =]... 所以核心模块中的文件在测试期间再次相互不可导入。其他限制可能会曝光...
正如我所说,我认为这是 pytest 设置中的一个缺陷。我完全不知道 pytest 做了什么来为 sys.path
建立常识性设置,但它显然是错误的。应该不需要依赖 PYTHONPATH 或其他任何东西,如果这确实是“官方”解决方案,那么关于这个主题的文档非常缺乏。
NB 我的这个建议有一个问题:通过在模块中每次 pytest 运行s __init__.py
时添加到 sys.path
,这意味着此后的新路径变为 permanent in sys.path
,在测试期间,更令人担忧的是,在应用程序本身的 运行s 期间,如果有任何实际调用 __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
sys_platform = sys.platform
if sys_platform.startswith('win'):
if len(path_parts) > 2 and path_parts[-3:-1] == ('Scripts', 'pytest.exe'):
sys.testing_context = True
sys.path.append(str(pathlib.Path(__file__).parent))
elif sys_platform.startswith('lin'):
if len(path_parts) > 2 and path_parts[-3:-1] == ('_pytest', 'config'):
sys.testing_context = True
sys.path.append(str(pathlib.Path(__file__).parent))
这是基于我在 W10 上下文和 Linux Mint 20 上下文中进行 pytest 运行 时对堆栈跟踪的检查。这意味着在应用程序 运行 中不会与 sys.path
.
混淆
当然,这可能会与未来版本的 pytest 中断。我的版本是 6.2.5.
更新 PYTHONPATH 到 src 文件夹
export PYTHONPATH=/tmp/pycharm_project_968/src
对我来说,这个问题是我的测试文件被命名为:xxx.test.py
解决了我命名文件的问题:xxx_test.py
但我想将其命名为:test_xxx.py
也可以。
我在 tox 下使用 pytest 时遇到了同样的问题。我通过在我的 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
工作正常
pytest.ini:
[pytest]
DJANGO_SETTINGS_MODULE=necktie_hy.settings
python_files=*/tests/*/test_*.py
python_classes=Test
我正在 Python 开发一个包。我使用虚拟环境。我在我的 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 路径和补救措施有关,这似乎不是这里的问题。有什么建议吗?
可能是 Pytest 没有将包作为 Python 模块读取,而 Python 是(可能是由于路径问题)。尝试更改 pytest 脚本的目录或将模块显式添加到 PYTHONPATH。
或者您的计算机上安装了两个版本的 Python。检查 pytest 的 Python 源和 运行 的 python shell。如果它们不同(即 Python 2 vs 3),请使用 source activate
确保您 运行 安装的 pytest 与模块安装的相同 python英寸
找到答案:
如果您计划使用 pytest,请不要将 __init__.py
文件放入包含 TESTS 的文件夹中。我有一个这样的文件,删除它解决了问题。
这个其实埋在了PATH issue with pytest 'ImportError: No module named YadaYadaYada'的第二个回答的评论里所以没看到,希望能在这里得到更多的关注。
我遇到了同样的问题,但原因与上述原因不同:
我在全局安装了 py.test,而软件包是在虚拟环境中安装的。
解决方案是在虚拟环境中安装 pytest
。 (如果你的 shell 散列可执行文件,就像 Bash 那样,使用 hash -r
,或者使用 py.test
的完整路径)
我遇到了类似的问题,错误完全相同,但原因不同。我 运行 测试代码很好,但针对的是旧版本的模块。在我的代码的前一个版本中,一个 class 存在,而另一个不存在。更新我的代码后,我应该 运行 以下内容来安装它。
sudo pip install ./ --upgrade
安装更新后的模块 运行ning 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
将软件包安装到您的虚拟环境中。
然后启动一个新的 shell 并再次获取您的虚拟环境。
在我的例子中,导入错误发生是因为包指向另一个 package/directory 具有 相同的名称 并且它的路径比我实际的文件夹高一级通缉。 我认为这也解释了为什么有些人需要删除 _ init _.py 而其他人需要添加回来。
我只是将 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
的测试文件夹,就会出现此问题。
在收集过程中 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 从 false 更改为 true .
home = /usr/bin
include-system-site-packages = true
version = 3.6.6
希望它有用。别忘了投票。
另一个特例:
我在使用 tox 时遇到了问题。所以我的程序 运行 很好,但是通过 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.x 中的 python 代码相关,那么问题可能与导入有关问题。
例如
从文件导入对象时:位于同一目录中的 base
这将适用于 python 2.x:
from base import MyClass
in python 3.x 你应该替换为 base
完整路径或 .base
不这样做会导致上述问题。
所以尝试:
from .base import MyClass
如果您的文件夹中需要 init.py 文件,请复制该文件夹并删除其中的 init.py 运行 你的测试适用于本地项目。如果你需要 运行 定期测试,看看你是否可以将你的 init.py 移动到一个单独的文件中。
我是用 VSCode 得到这个的。我有一个康达环境。我不认为 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), '..')))
如果尝试通过终端 运行 测试用例,请使用以下示例:
python -m pytest test_some_step_file_steps.py --html=HTML_step_file_output.html --self-contained-html
[已解决]
在直接进入删除/添加 __init__.py
的解决方案之前,我们可能还想看看导入是如何在您的 classes 中完成的。实际上,我只是 __init__.py
认为这可能是问题所在 :) 但是,这提供了很多信息。
在我的例子中,调用 classes 从一个 python class 到另一个 python class 的错误方式是 python class =12=]。修正了 classes/ 模块被调用的方式,它工作得很好。希望,这对其他人也有帮助。
是的,对于类似的错误,我们可能会根据代码的编写方式有不同的解决方案。最好花更多的时间进行自我调试。经验教训 :) 快乐编码!!!
我今天遇到了这个问题,通过从项目目录的根目录调用 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 中使用它,在 Windows 下的测试资源管理器中,在 conda 环境中,Python 3.8.
我必须进行的设置是:
mypkg/
__init__.py
app.py
view.py
tests/
test_app.py
test_view.py
在此设置下,智能感知有效,测试发现也有效。
请注意,我最初尝试了以下建议 here。
src/
mypkg/
__init__.py
app.py
view.py
tests/
test_app.py
test_view.py
我找不到让它在 VS Code 中运行的方法,因为 src
文件夹让导入系统大吃一惊。我可以想象有一种方法可以从命令行让它工作。作为一个相对较新的 Python 编程转换者,它给我一种使用 COM 的怀旧感觉,但乐趣稍差。
我的 2 美分:如果您不使用虚拟环境,pytest 将有机会失败。有时它会起作用,有时不起作用。
因此,解决方案是:
- 使用 pip uninstall 删除 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, for 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)
的第一个元素。
以下代码应该可以解决您的问题:
import sys
sys.path[0] = '/usr/exampleUser/Documents/foo'
将其放在文件的顶部,实际导入语句之前。
来源:我自己在处理这个问题,上面的过程解决了。
保持一切不变,只是在根文件夹中添加了一个空白测试文件..解决了
这是调查结果,这个问题确实困扰了我一段时间。 我的文件夹结构是
mathapp/
- server.py
- configuration.py
- __init__.py
- static/
- home.html
tests/
- functional
- test_errors.py
- unit
- test_add.py
并且 pytest 会抱怨 ModuleNotFoundError
并给出提示:
make sure your test modules/packages have valid Python names.
我在 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[=11=]github\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[=11=]github\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[=12=]github\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 上查看测试文件时:
- Ctrl + Shift + A
- 类型
Edit Configurations
- 在“环境”>“环境变量”下设置
PYTHONPATH
。
更新
- 移至项目的根目录
- 创建虚拟环境
- 激活您新创建的虚拟环境
- 将变量
$PYTHONPATH
设置为项目的根目录并导出它:
export PYTHONPATH=$(pwd)
- 不要从
tests/
目录或src/
目录中删除__init__.py
。
另请注意:
- 你的根目录不是 python 模块所以不要添加
__init__.py
conftest.py
在项目的根目录中不是必需的。
$PYTHONPATH
变量仅在当前 terminal/console 会话期间可用;所以你每次都需要设置这个。 (如果您在 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
更新: 之前我还写过如果你使用 PyCharm 如何做同样的事情,但社区不喜欢扩展答案,所以我删除了可能对有类似问题的人有帮助的额外信息。
我最近遇到了类似的问题。它对我有用的方式是意识到“setup.py”是错误的
之前我删除了我以前的 src
文件夹,并添加了一个具有其他名称的新文件夹,但我没有更改 setup.py
上的任何内容(我猜是新手错误)。
所以将 setup.py
指向正确的包文件夹对我有用
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<-"},
)
此外,init.py
不在测试文件夹中,也不在根文件夹中。
希望对大家有所帮助=)
最好!
在我的例子中,问题是文件名和 class 名称完全相同:分别是 FrameAnalyzer.py
和 FrameAnalyzer
。一旦我将文件名更改为 frame_analyzer.py
,一切正常。
这里是a medium article!描述问题!
问题在于你使用的是哪个pytest以及你对虚拟环境的使用。 如果你在系统范围内安装了 pytest,换句话说,在虚拟环境之外,pytest 有一个坏习惯,它只在你的虚拟环境之外寻找模块!如果您的项目使用的模块仅安装在您的虚拟环境中,并且您使用的是系统范围的 pytest,即使您已激活虚拟环境,它也找不到该模块。1
步骤如下:1
- 退出任何虚拟环境
- 使用pip卸载pytest
- 激活项目的虚拟环境
- 在虚拟环境中安装pytest
- 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) 中解决了这个问题
我在那里找到了答案:点击here
If you have other project structure, place the conftest.py in the package root dir (the one that contains packages but is not a package itself, so does not contain an init.py)
另一个建议
我在 SO 和其他地方探讨了这个问题和其他各种问题......所有关于在 and/or conftest.py 中添加(或删除)空 __init__.py
的内容项目目录结构,所有关于 PYTHONPATH 的东西,等等:NONE 这些解决方案对我有用,实际上是在一个非常简单的情况下,不应该引起任何悲伤。
我认为这是 pytest 当前设置中的一个缺陷。事实上,我最近从 SO 上的某个人那里收到了一条消息,他清楚地知道他的东西。他说 pytest 并非设计用于(根据 Java/Groovy/Gradle)单独的“src”和“test”目录结构,并且测试文件应该混合在应用程序目录和文件中。这可能在某种程度上提供了一种解释......然而,测试,特别是 integration/functional 测试,并不总是与特定目录完全对应,我认为 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
。当我只是 运行 应用程序时,这(毫不奇怪)工作正常,即来自根目录的 运行 python src/core
。
但是当我 运行 pytest
进行导入 __main__.py
的测试时,我得到
ModuleNotFoundError: No module named 'my_other_file'
在 __main__.py
中试图导入“my_other_file”的行中。请注意,在我的例子中,这里的问题是,在 pytest 测试过程中,一个应用程序文件无法在同一包中找到另一个应用程序文件。
使用 PYTHONPATH
经过大量实验,将一个 __init__.py
文件和一个 confest.py 文件放在我能找到的几乎每个目录中(我认为关键文件是 __init__.py
添加到“测试”和“ basic_tests”,见上面的目录结构),然后设置PYTHONPATH如下
PYTHONPATH=D:\My Documents\software projects\EclipseWorkspace\my_project\src\core
...我发现它有效。测试文件中的导入必须稍微调整一下,一般模式是 from core import app, project
,但测试文件能够“看到”core
,关键是没有必要乱用 import
应用程序文件中的命令。
然而...出于某种原因,现在使用此方法进行的测试运行慢得多!与我下面的解决方案相比,可以看到 core
包只加载了一次,我怀疑 PYTHONPATH 解决方案可能导致大量代码被一次又一次地重新加载。我还不能证实这一点,但我看不到任何其他解释。
替代方案
我的另一种相当简单的解决方案是:
1 - 在 __init__.py
该应用程序包(即目录“core”)中,放入以下两行:
import pathlib, sys
sys.path.append(str(pathlib.Path(__file__).parent))
注意通常 __init__.py
中当然没有任何内容。事实证明,正如我通过实验证实的那样,pytest usually(见下面的更新)在这种情况下执行 __init__.py
,after pytest已经做了它所做的一切来搞乱 sys.path
条目。
2 - 2022-01 更新: 我发现的原始解决方案涉及将 conftest.py 文件放在 application 目录中 - 没有它就无法工作。这显然是不可取的。我发现另一种解决方案是将此代码放入根目录中的 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然后运行s __init__.py
在该目录中。这似乎暗示正在导入模块...
(之前的建议:)
是的,您还 HAVE 在目录中包含一个空的 "conftest.py" 文件“核”。希望这应该是您唯一需要的 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 *
似乎不起作用。
Later:此方法有一些特殊性和局限性。例如,尽管 -k
开关可以正常过滤 in/out 测试或整个文件,但如果您执行 pytest tests/tests_concerning_module_x
之类的操作,则 core.__init__.py
似乎无法过滤 [=159] =]... 所以核心模块中的文件在测试期间再次相互不可导入。其他限制可能会曝光...
正如我所说,我认为这是 pytest 设置中的一个缺陷。我完全不知道 pytest 做了什么来为 sys.path
建立常识性设置,但它显然是错误的。应该不需要依赖 PYTHONPATH 或其他任何东西,如果这确实是“官方”解决方案,那么关于这个主题的文档非常缺乏。
NB 我的这个建议有一个问题:通过在模块中每次 pytest 运行s __init__.py
时添加到 sys.path
,这意味着此后的新路径变为 permanent in sys.path
,在测试期间,更令人担忧的是,在应用程序本身的 运行s 期间,如果有任何实际调用 __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
sys_platform = sys.platform
if sys_platform.startswith('win'):
if len(path_parts) > 2 and path_parts[-3:-1] == ('Scripts', 'pytest.exe'):
sys.testing_context = True
sys.path.append(str(pathlib.Path(__file__).parent))
elif sys_platform.startswith('lin'):
if len(path_parts) > 2 and path_parts[-3:-1] == ('_pytest', 'config'):
sys.testing_context = True
sys.path.append(str(pathlib.Path(__file__).parent))
这是基于我在 W10 上下文和 Linux Mint 20 上下文中进行 pytest 运行 时对堆栈跟踪的检查。这意味着在应用程序 运行 中不会与 sys.path
.
当然,这可能会与未来版本的 pytest 中断。我的版本是 6.2.5.
更新 PYTHONPATH 到 src 文件夹
export PYTHONPATH=/tmp/pycharm_project_968/src
对我来说,这个问题是我的测试文件被命名为:xxx.test.py
解决了我命名文件的问题:xxx_test.py
但我想将其命名为:test_xxx.py
也可以。
我在 tox 下使用 pytest 时遇到了同样的问题。我通过在我的 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
工作正常
- 删除后,
pytest.ini:
[pytest]
DJANGO_SETTINGS_MODULE=necktie_hy.settings
python_files=*/tests/*/test_*.py
python_classes=Test