项目结构如下:
/root
- /crawler
- /basic
- agent.py
- settings.py
- main.py
- /tests
- /basic
- test_agent.py
- test_main.py
main.py
导入agent.py
,agent.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
?
答案 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
。