如何从python中的unittest导入一个类?

时间:2013-03-12 01:06:10

标签: python unit-testing

我有一个关于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 个答案:

答案 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()