Python 在运行测试时导入 src 模块

Posted

技术标签:

【中文标题】Python 在运行测试时导入 src 模块【英文标题】:Python import src modules when running tests 【发布时间】:2011-06-13 06:15:17 【问题描述】:

我的源文件位于 src 下,我的测试文件位于 tests 下。当我想运行一个测试文件时,比如 python myTest.py,我得到一个导入错误:“No module named ASourceModule.py”。

如何从源代码中导入运行测试所需的所有模块?

【问题讨论】:

【参考方案1】:

您需要将该目录添加到路径中:

import sys
sys.path.append('../src')

如果你经常使用它,可以把它放到一个模块中。

【讨论】:

这与操作系统无关。请参阅the answer 了解在 linux 和 Windows 上使用相同的代码。【参考方案2】:

如果您不想将源路径添加到每个测试文件或更改您的PYTHONPATH,您可以使用nose 来运行测试。

假设你的目录结构是这样的:

project
    package
        __init__.py
        module.py
    tests
        __init__.py
        test_module.py

您应该在test_module.py(例如from package import module)中正常导入模块。然后通过在项目文件夹中运行nosetests 来运行测试。您还可以通过 nosetests tests/test_module.py 运行特定测试。

如果你想从里面运行测试,tests 目录中的__init__.py 是必需的。

您可以使用easy_installpip 轻松安装鼻子:

easy_install nose

pip install nose

nose 以更多方式扩展了 unittest,要了解更多信息,您可以查看他们的网站:https://nose.readthedocs.org/en/latest/

【讨论】:

+1 表示“如果你想从里面运行测试,测试目录中的__init__.py 是必要的。”【参考方案3】:

在我的系统 (Windows 10) 上,我需要执行以下操作:

import sys
import os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../src")

将相对目录直接附加到sys.path 不起作用

【讨论】:

【参考方案4】:

最好的(最易于管理的)解决方案似乎是使用 virtualenv 和 setuptools/distribute 来安装您的 (src) 包的开发副本。这样,您的测试将针对完全“安装”的系统执行。

在 pystest 文档中有一个关于“良好实践”的部分解释了这种方法,请参阅 here。

【讨论】:

这是最好的解决方案。另外两个工作,但不那么干净。对于初学者来说,使用上面的技巧可能会更简单,而不是花几个小时来理解 Python 打包。如果你有时间,就用这个吧。 答案中的链接已损坏,这是正确的 - docs.pytest.org/en/latest/explanation/…

以上是关于Python 在运行测试时导入 src 模块的主要内容,如果未能解决你的问题,请参考以下文章

Python 导入模块、文件夹结构

Python——模块以及导入注意事项

如何在 Python 中正确导入模块

如果测试模块位于姐妹文件夹中,如何让我的 Python 单元测试导入测试模块?

vs code运行python导入上级目录模块问题

python导入模块ImportError