我有一个关于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
不确定如何从不是根文件夹的其他文件夹导入文件。
答案 0 :(得分:9)
我不认为这是处理此问题的最有效或最安全的方法,但这是我在unittesting
中添加库的方式。
import unittest, os, sys
sys.path.append(os.path.abspath('..'))
from lib.class import Class
这实际上会将上一个文件夹添加到可访问资源列表中,然后使用它来包含父文件夹lib
。
另外,你可能会做import .. from lib.class
之类的事情。有关相关导入的更多信息,请查看here。
答案 1 :(得分:2)
修改sys.path
以包含项目目录
import sys
sys.path.append('/path/to/Project')
在Linux上,你可以做到
import sys, os
sys.path.append(os.path.abspath(sys.path[0]) + '/../')
并且应包括正在运行的Python测试脚本上面的目录,即Project文件夹
答案 2 :(得分:0)
在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()