如何从父目录导入模块? (单位测试目的)

时间:2011-08-03 10:27:59

标签: python unit-testing import

我刚刚完成了正在编写的项目的核心部分,我想在继续之前使用unittest为它编写测试。我知道我之前应该这样做,但是当我开始时我不知道Python,所以......无论如何......

我想要实现的目标:我有一个主包的子包,其中包含我要在其中测试的所有模块。我想把一个子包装放在名为'tests'的内容中,或者包含我所有测试用例的东西,我希望能够从包外部汇总到一个测试套件中,这样我最终可以运行所有测试整个项目一气呵成。

结构是这样的:

/projectPackage
/projectPackage/package
/projectPackage/package/\__init__.py (empty)
/projectPackage/package/someModule.py
/projectPackage/package/... (more modules)
/projectPackage/package/testing.py (runs all the tests in /tests/)
/projectPackage/package/tests
/projectPackage/package/tests/\__init__.py (empty)
/projectPackage/package/tests/someModuleTests.py

我遇到的问题:

someModuleTests必须从父包导入someModule,以便它可以测试其方法。这似乎不起作用。我得到了各种错误:

Attempted relative import beyond toplevel package

无论如何,我希望这只是因为我是一个Python菜鸟!我有自己的想法,我将如何为这个项目做这件事,因为当然每个都不同,但是对中大型python项目结构的任何一般建议也很感激。

3 个答案:

答案 0 :(得分:16)

从父目录运行单元测试,使目录位于PYTHONPATH中(当前工作目录始终为)。这是通过从父目录执行测试文件或使用nosetest之类的东西来完成的,它会以递归方式查找程序包中的所有测试。

不要使用相对导入,它们会导致这样的事情。不要破解你的PYTHONPATH和/或sys.path来尝试修复它。

答案 1 :(得分:1)

如果您可以执行代码,那么您的PYTHONPATH应该已经正确设置。您需要做的是指定要导入的模块,例如

import projectPackage.package.someModule

答案 2 :(得分:1)

考虑到您使用命令行工具来运行测试,您可以关注the docs并执行以下操作:

python -m unittest package.tests.someModuleTests