首页 > 解决方案 > 单元测试 Python;进口中断

问题描述

我有一个我正在尝试进行单元测试的 python 应用程序。代码位于 src 目录中,测试位于测试目录中。

尝试测试包含我的主要方法的类时出现问题。这个类位于 src 目录中,并引用了其他模块中的类,这些模块都位于 src 目录中。为了执行我的应用程序,我有这种格式的引用from <module> import <class>

当我来测试这个主类时,我编写了一个测试类并将其放在测试目录中。运行测试我发现主类中的导入有问题。要解决此问题,我必须将导入更改为 fromfrom src.<module> import <class>完成此操作后,我的测试现在通过了,但应用程序本身失败了。

如何解决此问题,以便我的导入对我的单元测试和正常执行都有效?

标签: pythonunit-testingpython-import

解决方案


由于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

推荐阅读