python - 从测试子目录,导入从基础抽象类继承的模块
问题描述
语境
我正在尝试使用 pytest 运行单元测试,但是,测试文件无法找到模块,因为它们继承自抽象类。
更具体地说,我有以下目录结构:
project
|- __init__.py
|- project.py
|- JsonParser.py
|- Parser.py
|- tests
|__init__.py
|-test_JsonParser.py
JsonParser 具有以下导入:
from Parser import Parser
test_JsonParser.py 具有以下导入:
from project.JsonParser import JsonParser
目标是从位于“项目”父目录中的 JsonParser 导入 JsonParser 类。当我尝试这个时,pytest 会提出以下投诉:
ModuleNotFoundError: No module named 'Parser'
相关修复尝试
由于下面的线程,我选择了相应的目录结构。当没有抽象基类的继承时,Itt 工作得很好。我怀疑问题在于 JsonParser 如何导入 Parser。有一个嵌套的导入,pytest 无法协调这一点,即使从父目录运行也是如此
下面的线程是我最接近答案的,但它变成了鸡和蛋的问题。如果我将路径设为相对路径,则无法执行“project.py”,因为它将无法定位 Parser 的相对路径。
编辑:我应该提到我使用以下内容运行测试:
pytest tests/test_JsonParser.py
解决方案
看起来诀窍是按以下方式执行:
Python -m pytest project/tests
这样做会将根目录添加到搜索路径。仅使用 pytest 运行不包括 Python 文件搜索路径中的根目录。例如,当使用 'pytest' 执行测试时,Parser 将无法导入 JsonParser,因为解释器将仅在 Parser 目录中搜索 Parser.Parser。请注意 Parser.Parser 是相对于根目录的。如果根目录不在搜索路径中,解释器将不会找到同目录中其他文件导入的文件。
推荐阅读
- python - 我们如何使用自然语言处理技术推导出句子中与动词相关的实体?
- python - 无法通过 python paramiko 获取远程服务器上的 cpu 利用率
- django - Django Rest Frame 无法获取自嵌套对象的父 ID
- go - 我们可以在goroutine中实现goroutine吗?
- apache-flink - -m yarn-cluster 的真正含义是什么?
- pyvmomi - 如何使用 pyvmomi 检索 ESXi 主机上所有存储适配器的列表?
- python - 使用 2D 列表和 while 循环创建乘法表
- python - 用户输入以降序排列输出
- android - 将数据保存在 Fragment 中
- service - 带有作业调度程序的 Android 后台服务用于通知