如何从python中的测试模块导入src

Posted

技术标签:

【中文标题】如何从python中的测试模块导入src【英文标题】:How to import the src from the tests module in python 【发布时间】:2012-05-04 10:46:23 【问题描述】:

我想使用unittest 测试一个应用程序,但我遇到了一些问题。 我的目录结构如下:

root_dir
├── src
│   ├── cmds
│   │   ├── baz.py
│   │   ├── __init__.py
│   │   └── bar.py
│   └── foo.py
└── tests
    ├── cmds.py
    └── __init__.py

我想测试来自cmdsbazbar 模块,我正在尝试这样做

root_dir> python2.7 -m unittest tests.cmds

但是在tests.cmds 中,我无法在src 目录中导入cmds 包。

我怎样才能做到这一点?

基本上我想分别使用srctests 目录从root_dir 测试应用程序。

我尝试将src 附加到sys.path,但是当我从tests/cmds.py 导入cmds.baz 时,我仍然从unittest 获得AttributeError: 'module' object has no attribute 'cmds'

编辑: 我的导入和sys.path 声明是:

import sys
sys.path.append('../src')
from cmds.baz import about

还有回溯:

Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.7/unittest/__main__.py", line 12, in <module>
    main(module=None)
  File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__
    self.parseArgs(argv)
  File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs
    self.createTests()
  File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests
    self.module)
  File "/usr/lib/python2.7/unittest/loader.py", line 128, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib/python2.7/unittest/loader.py", line 100, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
AttributeError: 'module' object has no attribute 'cmds'

【问题讨论】:

src 不是包,但测试是。这是为什么?你是否正确设置了python路径? 显示您的确切导入和完整的回溯。 @lbp 因为我在做python2.7 -m unittest tests.cmds时必须导入。 也许这是一个问题,你的测试文件被称为cmds.py,模块目录被称为cmds - 没有属性的module 可能是cmds.py - 试试import src.cmds.baz 和看看这是否仍然给出错误? 解决了!我从 tests 目录(不是从 root )运行 test 命令并将 tests/cmds.py 重命名为其他内容,我仍在使用上面发布的 import 语句。 【参考方案1】:

我认为你几乎是对的。但是当您从根目录运行测试时,我猜您的路径 ('../src') 是错误的。也许你可以这样做:

import os
import sys

ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')
sys.path.append(os.path.join(ROOT, 'src'))

from cmds.baz import about

【讨论】:

【参考方案2】:

一个非常错误的做法是将相对路径附加到sys.path。 如果您想确定路径,请按如下方式进行:

# assuming that the code is in test's __init__.py
import os
import sys
sys.path.insert(0, os.path.abspath( os.path.join(os.path.dirname(__file__), 
                                               '../src/') ))
# now you can be sure that the project_root_dir/src comes first in sys.path

【讨论】:

以上是关于如何从python中的测试模块导入src的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Python 中正确导入模块

如何检查 Python 包中的任何模块是不是从另一个包导入?

Django中的Python路径不一致-双模块导入

如何从python中的其他目录导入模块? [复制]

Python 导入模块、文件夹结构