Python ModuleNotFoundError Testsuite(导入错误)

时间:2018-01-18 20:07:10

标签: python python-import

当我运行带有一些测试的文件时(例如python test_website_loads.py ),测试运行完美且没有问题,但是当我尝试测试套件时(例如python test_suite .py ),发生下一个错误:

    from special_module.special_module_file import Special_Class
ModuleNotFoundError: No module named 'specialmodule'

我的目录如下:

test_suite.py
tests/
  __init__.py
  test_website_loads.py
  special_module/
    __init__.py
    special_module_file.py

在我的special_module_file中,我有一个名为 Special_Class 的类,我在 test_website_loads.py 中导入这样的目录:

from special_module.special_module_file import Special_Class

我的 test_suite.py 代码为:

import unittest
import HtmlTestRunner
from tests.test_website_loads import Test_Website_Loads

init_tests = unittest.TestLoader().loadTestsFromTestCase(Test_Website_Loads)

test_suite = unittest.TestSuite([
    init_tests
])

runner = HtmlTestRunner.HTMLTestRunner(output='reports', report_title='Test Report')
runner.run(test_suite) 

我的 test_website_loads.py 代码是:

import unittest
import HtmlTestRunner
from special_module.special_module import Special_Class

class Test_Website_Loads(unittest.TestCase):

    def setUp(self):
        special = Special_Class()

    def ...():
        ...

    def tearDown():
        ...

if __name__ == "__main__":

    unittest.main(
        testRunner=HtmlTestRunner.HTMLTestRunner(output='init')
    )

总之,有3个文件(A,B,C)。 A调用B,B调用C.当我运行B时,它正确导入C.但是当运行A时,B抛出ModuleNotFoundError。

1 个答案:

答案 0 :(得分:1)

这是因为它位于tests目录中,但您从test_suite.py的父目录运行tests。运行test_website_loads.py时它运行的原因是因为您在tests目录中运行它。解析导入时,Python解释器会检查模块的一系列位置,从当前目录开始,然后移动到其他位置(例如PYTHONPATH环境变量中的位置)和Python安装位置中的site-packages目录。

我在我的系统上复制了这个,但是将import语句更改为tests.special_module.special_module_file并且它有效。如果您不喜欢此解决方案,则需要更改special_module目录或add it to your PYTHONPATH或类似内容的位置。

修改:在回复下面的评论时,我认为您的test_suite.py文件看起来像这样:

from tests.test_website_loads import some_function, some_class

result = some_function()
obj = some_class()

这仍然会遇到上述问题,因为Python解释器仍然在顶级目录中运行。当它搜索模块时,它会搜索当前只查找test_suite.pytests/的目录。然后它会检查您的PYTHONPATH环境变量。如果它仍然没有找到任何内容,它将检查然后依赖于安装的默认位置(例如site-packages目录),如果没有找到这样的模块,则会抛出异常。我认为最好的解决方案是将special_module添加到PYTHONPATH环境变量中,如上面链接中所述。否则,您可以使用ln -s tests/special_module special_module创建指向顶级目录中模块的符号链接,假设您在类UNIX系统上运行。但是,这不是最佳做法;第一种方法是首选。