如何在Python中从unittest导入类?

10 投票
3 回答
9828 浏览
提问于 2025-04-17 18:45

我有一个关于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 来正确地定义这个项目。

撰写回答