在父目录中导入另一个模块的模块的运行单元测试失败

时间:2013-11-08 11:40:46

标签: python unit-testing import

项目结构如下:

/root
- /crawler
 - /basic
   - agent.py
 - settings.py
 - main.py
- /tests
 - /basic
   - test_agent.py
 - test_main.py

main.py导入agent.pyagent.py导入settings.py。它运行正常,因为我们在main.py下运行/root/crawler,使得解释器将/root/crawler(因为它位于main.py所在的位置)添加到sys.path,所以当agent.py时导入和解释,import settings没有例外。

但是,在/root下使用 nose 运行单元测试时,除test_agent.py之外的所有其他测试都没有问题,解释器报告它不知道导入的位置{ {1}}。

如果我在导入正在测试的模块之前将settings附加到/root/crawl内的路径,它会起作用,但这被认为是一种不好的做法,对吧?

如果是,如何避免test_agent.py

1 个答案:

答案 0 :(得分:0)

如果settings必须是顶级模块,则可以在测试文件中将/root/crawl添加到sys.path。如果您认为crawl本身可以在其他地方导入并且像其他程序中的库那样使用,那么您应该考虑重构您的包。

您可能想要这样做:

/root $ tree
.
├── crawler
│   ├── __init__.py
│   ├── basic
│   │   ├── __init__.py
│   │   └── agent.py
│   └── settings.py
├── main.py
├── test_main.py
└── tests
    ├── __init__.py
    └── crawler
        ├── __init__.py
        └── basic
            ├── __init__.py
            └── test_agent.py

从主要你会这样做:

from crawler.basic import agent
agent.do_work()

从代理商中你可以导入如下设置:

from crawler import settings # or: from .. import settings
print settings.my_setting

test_main.py:

from tests.crawler.basic import test_agent¬
print 'in test_main'

test_agent.py:

from crawler.basic import agent

一切都像预期的那样有效。诀窍是创建文件夹结构,如库,作为包,并在该结构外部进入程序并输入包。

您还可以将测试目录移动到抓取工具目录中,然后运行crawler.tests.basic.test_agent