python - 单元测试 Python;进口中断
问题描述
我有一个我正在尝试进行单元测试的 python 应用程序。代码位于 src 目录中,测试位于测试目录中。
尝试测试包含我的主要方法的类时出现问题。这个类位于 src 目录中,并引用了其他模块中的类,这些模块都位于 src 目录中。为了执行我的应用程序,我有这种格式的引用from <module> import <class>
当我来测试这个主类时,我编写了一个测试类并将其放在测试目录中。运行测试我发现主类中的导入有问题。要解决此问题,我必须将导入更改为 fromfrom src.<module> import <class>
完成此操作后,我的测试现在通过了,但应用程序本身失败了。
如何解决此问题,以便我的导入对我的单元测试和正常执行都有效?
解决方案
由于import
工作方式,它可能会失败。
我建议始终使用绝对导入。这意味着,在创建包时,该包中的所有导入都从顶层向下导入:from package.module import thing
. 更重要的是,安装你的包——不是作为一个普通的 Python 包,而是一个符号链接,允许你编辑你的源代码,同时它仍然被认为是一个已安装的包。这样,您可以根据需要放置测试和脚本,并且事情将始终有效。
安装你的包是用pip install -e .
from完成的root
。如果您不熟悉打包示例,请参阅打包教程。
一个示例包结构可能是:
root/
setup.py
MANIFEST.in
...
package/
__init__.py
app.py
tests.py
module/
__init__.py
component.py
module_test.py
# Or have a tests folder under root
tests/
test_module.py
tests.py
例如在app.py
, 到处都是:
from package.module.component import Class
from package.module import thing # that was declared in module/__init__.py
因此,对于您的情况,如果我理解正确,您将拥有:
root/
setup.py
MANIFEST.in
...
src/
__init__.py
app.py
module.py
tests/
test_module.py
tests.py
推荐阅读
- three.js - 鼠标移动过快时变换对象不起作用
- p5.js - 在基本 p5js 游戏中添加碰撞和得分
- javascript - Google Chart 上的资源管理器不起作用 - Polymer
- php - 在 renderForm PrestaShop 中显示日期/时间字段
- swift - AVSpeechSynthesiser 窃听 ViewDidLoad 函数
- http - 用户的浏览器似乎每天多次触发请求
- android - 使用 MockWebServer 测试 OkHttp 和使用缓冲区主体测试 MockResponse
- python - 如何在python中获取linux系统变量
- d3.js - 更改geoTIFF文件的投影?
- android - 无法在滚动视图内滚动约束布局