如何从父目录导入模块?(用于单元测试)

22 投票
3 回答
17676 浏览
提问于 2025-04-16 22:47

我刚刚完成了我正在做的项目的核心部分,现在想用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 个回答

1

如果你能运行你的代码,那说明你的PYTHONPATH已经设置好了。接下来你需要做的就是指定你想要导入的模块,比如:

import projectPackage.package.someModule
4

如果你是通过命令行工具来运行你的测试,可以参考这份文档,然后你可以写出类似下面的内容:

python -m unittest package.tests.someModuleTests
28

从上级目录运行单元测试,这样你的目录就会在PYTHONPATH中(当前工作目录总是会在里面)。你可以通过从上级目录执行测试文件,或者使用像nosetest这样的工具,它会自动查找你包里的所有测试。

不要使用相对导入,这会导致一些问题。也不要试图通过修改PYTHONPATH或sys.path来解决这个问题。

撰写回答