Python 如何在main.py中构造本地导入以允许测试?
我正在尝试测试我的应用程序。我有一个非常标准的项目,结构如下:Python 如何在main.py中构造本地导入以允许测试?,python,python-3.x,testing,module,package,Python,Python 3.x,Testing,Module,Package,我正在尝试测试我的应用程序。我有一个非常标准的项目,结构如下: root ├── app │ ├── __init__.py │ ├── main.py │ └── logic │ └── calc.py ├── tests │ └── test_main.py │ └── pyproject.toml My main.py使用了logic/calc.py文件中的一个类,如下所示: # app/main.py from logic.calc import Mode
root
├── app
│ ├── __init__.py
│ ├── main.py
│ └── logic
│ └── calc.py
├── tests
│ └── test_main.py
│
└── pyproject.toml
My main.py使用了logic/calc.py
文件中的一个类,如下所示:
# app/main.py
from logic.calc import Model
def main() -> None:
m = Model()
print(m.some_attribute)
if __name__ == "__main__":
main()
我可以运行python应用程序/main.py
,它会工作得很好。测试过程中出现问题:
# tests/test_main.py
from app.main import main
def test_main():
assert main() is None
运行pytest
将导致ModuleNotFoundError:没有名为“logic”的模块
。main.py
中的导入出错
因此,我们可以通过将app.logic.calc导入模型的导入调整为来解决此问题。测试现在运行顺利。但是,现在我不能再运行python main.py
!这将导致错误:ModuleNotFoundError:没有名为“app”的模块。
。所以这似乎是第二十二条军规
安装软件包
使用pyproject.toml
将项目作为软件包安装解决了这个问题,因为app
模块现在随处可用。但是,我不希望安装包,因为我正在Docker中打包项目,包安装会产生一些我试图避免的影响
我可以让直接执行和测试同时工作,而不需要将项目作为一个包安装吗?
这似乎是一个基本问题,但不知何故,我一直无法找到答案或解决它。非常感谢您的帮助 解决方法是在单独的包中运行单元测试。这不仅修复了相关的依赖关系,还允许批量运行单元测试,而不是基于每个文件。感谢您的输入。在对名称空间如何工作进行了更多思考之后,我认为我的文章中描述的预期结果是不可能的。我最终还是安装了这个包,并以python-m app.main的身份运行了main。解决方法是在一个单独的包中运行单元测试。这不仅修复了相关的依赖关系,还允许批量运行单元测试,而不是基于每个文件。感谢您的输入。在对名称空间如何工作进行了更多思考之后,我认为我的文章中描述的预期结果是不可能的。我最终还是安装了这个包,并以python-m app.main运行了我的main。