【问题标题】:Python Unit test module throws "ModuleNotFoundError: No module named 'tests.test_file'"Python 单元测试模块抛出“ModuleNotFoundError: No module named 'tests.test_file'”
【发布时间】:2023-03-03 07:37:22
【问题描述】:

我正在尝试为我一直在从事的项目执行测试用例。我以前曾成功执行单元测试,但现在出错了。我确定没有任何库的更新或路径中的更改。我试图查看源代码并弄清楚为什么它会出错但还没有运气。对此的任何帮助将不胜感激。

Python 版本 - 3.7.1

下面的示例代码

import unittest

class MyTestCase(unittest.TestCase):

def test_dummy(self):
    self.assertEqual(2+2,4)

我在cmd中使用了如下命令来执行测试。

C:\Users\Yadada\Desktop\repo\mwe\mwe>python -m unittest tests\test_file.py

我的文件夹结构是

 MWE -|
      |_tests - |
                |_test_file.py

预期的输出是正在成功执行的测试,因为它是一个简单的测试。但我最终得到以下错误

strclass
ERROR: test_file (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: test_file
Traceback (most recent call last):
  File "C:\Users\yadada\AppData\Local\Continuum\anaconda3\lib\unittest\loader.py", line 156, in loadTestsFromName
    module = __import__(module_name)
ModuleNotFoundError: No module named 'tests.test_file'


----------------------------------------------------------------------
Ran 1 test in 0.001s

【问题讨论】:

  • 您在tests 目录中是否有一个__init__.py 文件以使它们作为模块的一部分被发现?
  • 不,我没有,我之前在同一个 tests 目录中从未有过 __init.py__ 文件,但测试工作正常。
  • @aws_apprentice - 我在测试文件夹中放了一个空的__init__.py 文件,令人惊讶的是,单元测试现在可以工作了。我想知道为什么?如果可以的话,你能简要解释一下这种行为吗?如果您将其发布为答案,我会接受。谢谢
  • 我也有这个错误,__init__.py 在 Python 3.3+ 中是不需要,除非您需要在该目录中运行安装脚本

标签: python python-3.x unit-testing anaconda


【解决方案1】:

在测试文件夹中放置一个空的__init__.py 文件后问题得到解决。

有关其工作原理的更好解释,请参阅What is __init__.py for?

感谢@aws_apprentice 的帮助。

【讨论】:

  • 我在 github 操作上收到此错误,但不是在本地,这并没有为我解决。
【解决方案2】:

在 PyCharm 2020.2 中,在从被测父文件夹导入模块的子文件夹中运行单元测试时,也会发生“ModuleNotFoundError: No module named”错误。 PyCharm 默认采用脚本路径来执行失败的测试,例如出现此错误:

ModuleNotFoundError: No module named '/home/foobar/projects/foo/mypythonproject/moduleundertest'

解决方法是编辑单元测试的run configuration,将Unittests Target从“Script path”改为“Module name”。

【讨论】:

    【解决方案3】:

    我的解决方案是添加:

    if __name__ == '__main__':
        unittest.main()
    

    到我的测试文件的底部。

    然后我就可以跑了:

    python -m <test-file>
    

    还需要从我的python -m 命令中删除.py 后缀:

    详情请见this answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2022-12-19
      • 2022-08-24
      • 2019-02-07
      • 2018-07-29
      • 2022-12-27
      • 2022-12-27
      相关资源
      最近更新 更多