如何在Python中从unittest导入类?
我有一个关于Python和unittest的非常基础的问题。
我的文件夹结构是这样的。
Project
|
|-lib
|
|-__init__.py
|-class.py
|
|-tests
|
|-__init__.py
|-test_class.py
现在这是我test_class.py的内容。如果我从根文件夹导入lib.class,运行得很好。但是如果我从其他地方导入这个文件,就不行了。
import unittest
from lib.class import Class
class TestClass(unittest.TestCase):
def testClass(self):
// do some test
def main():
unittest.main()
if __name__ == '__main__':
main()
当我运行测试时,我遇到了这个错误。
Traceback (most recent call last):
File "tests/test_class.py", line 2, in
from lib.class import Class
ImportError: No module named lib.class
我不太确定怎么从不是根文件夹的其他文件夹导入这个文件。
3 个回答
-1
在TestClass的setUp方法中
添加:
file_path = Path(__file__).parent.parent / 'lib' / 'class.py'
self.assertTrue(file_path.exists())
spec = spec_from_file_location(file_path.name, location=file_path, loader=None, submodule_search_locations=None)
self.module = module_from_spec(spec)
self.module.__spec__.loader.exec_module(self.module)
访问:
aclass = self.module.AClass()
或者
AClass = self.module.AClass
aclass = AClass()
5
修改 sys.path
以包含项目目录
import sys
sys.path.append('/path/to/Project')
在Linux系统上,你可以这样做
import sys, os
sys.path.append(os.path.abspath(sys.path[0]) + '/../')
这样做应该会把运行中的Python测试脚本所在的上级目录,也就是项目文件夹,包含进来
10
更好的解决办法是创建一个虚拟环境,并以开发模式安装项目。这样你就可以修改和运行代码,而不需要每次都重新安装。
virtualenv venv
source venv/bin/activate
pip install -e .
在测试中,你只需简单地包含完整的域名。
from project.lib.class import Class
记住,你需要使用 setuptools 来正确地定义这个项目。