我想要我的tests folder separate到我的申请代码.我的项目 struct 是这样的

myproject/
  myproject/
    我的项目.py
    moduleone.py
  tests/
    myproject_测试.py

我的项目.py

from moduleone import ModuleOne

class MyProject(object)
....

myproject_测试.py

from myproject.myproject import MyProject
import pytest

...

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

python -m pytest

从项目根目录./myproject/

然而,这些模块中的导入会失败,并导致

E ModuleNotFoundError:没有名为'moduleone'的模块

我正在运行Python3.7,从3.3开始,就不再需要__init__个空文件,这意味着我的项目变成了implicit namespace package

然而,我曾try 在myproject/myproject/中添加一个__init__.py文件,也try 在myproject/中添加一个conftest.py文件,但两者都不起作用

我有read answers条对mess with the paths条的 comments ,然后在其他问题上的 comments 是not to条.

正确的方法是什么?我错过了什么?

EDIT;

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

EDIT 2:

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

音量应该改为/my/local/path/myproject/myproject/吗?

推荐答案

Solution: use the PYTHONPATH env. var

PYTHONPATH=. pytest

正如@J_H所提到的,您需要显式地添加项目的根目录,因为pytest只会添加到sys.path个测试文件所在的目录中(这就是@Mak2006的答案有效的原因)


良好实践:使用Makefile或其他自动化工具

如果不想一直键入长命令,一个选项是在项目的根目录中创建一个Makefile,例如:

.PHONY: test
test:
    PYTHONPATH=. pytest

这让你可以简单地运行:

make test

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

Python-3.x相关问答推荐

为什么vs code返回错误—LocaleError:int对象没有属性where,但相同的代码运行在Google Colab上没有任何问题''''

tkinter/python3.9 中的 Entry 子类和用户输入重复的问题

Pandas教程:如何更新行内数值的位置

根据按不同列中的值分组的平均值划分 DataFrame

如何将元组列表拆分为两个单独的列表?

使用 pandas 数据帧映射到中转( node )点的跨容量请求

过滤查询集和Q运算符的不同值

FastAPI - 调用 API 时设置 response_model_exclude

Pandas数据单调行为

为什么 f-strings 比 str() 更快地解析值?

Python 类型提示语法如何/为什么起作用?

asyncio.Semaphore RuntimeError: Task got Future 附加到不同的循环

ImportError:无法导入名称cross_validate

带百分号的 Python 字符串格式

在 WSL (Ubuntu) 中为 python3 安装 venv

为什么 string.maketrans 在 Python 3.1 中不起作用?

Pruning in Keras

带有 Emacs 的 Python 3

新项目:Python 2 还是 Python 3?

为什么异步库比这个 I/O 绑定操作的线程慢?