Python 单元测试模块抛出“ModuleNotFoundError:没有名为‘tests.test_file’的模块”

Bha*_* Nc 19 python unit-testing python-3.x anaconda

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

Python 版本 - 3.7.1

下面的示例代码

import unittest

class MyTestCase(unittest.TestCase):

def test_dummy(self):
    self.assertEqual(2+2,4)
Run Code Online (Sandbox Code Playgroud)

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

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

我的文件夹结构是

 MWE -|
      |_tests - |
                |_test_file.py
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

Bha*_* Nc 24

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

有关其工作原理的更好解释,请参阅__init__.py 的用途是什么?

谢谢@aws_apprentice 的帮助。

  • 我在 github 操作上收到此错误,但在本地没有收到此错误,这并没有为我解决问题。 (10认同)
  • 也不适合我。 (4认同)
  • 对于 python 3.3+,在这种情况下不需要 `__init__.py` 这里有一个不同的问题 (4认同)

Eat*_*ich 6

原因是某些库已经使用了包名称,请参阅: 有关保留包名称的堆栈溢出问题

要理解这个问题:将tests包重命名为tests_packagepackage.json。(test也是保留的包名)

前:

MWE -|
     |- tests -|
               |- test_file.py
Run Code Online (Sandbox Code Playgroud)

后:

MWE -|
     |- tests_package -|
                       |- test_file.py
Run Code Online (Sandbox Code Playgroud)

(从 python 3.3 开始,__init__.py不再需要。)

然后运行python -m unittest tests_package\test_file.py

使用“venv”可以解决tests包名称的问题,但不能解决test

也许一个更Pythonic的解决方案是通过给项目一个唯一的模块名称来不让你的项目在“root”中运行,这样你就不必拥有一个Python库未使用的包名称作为目录tests。例子:

GitFolderOfProject -|
                    |- MWE -|
                            |- tests -|
                                      |- test_file.py
Run Code Online (Sandbox Code Playgroud)

然后从“GitFolderOfProject”运行测试python -m unittest MWE\tests\test_file.py


k_o*_*_o_ 5

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

ModuleNotFoundError: No module named '/home/foobar/projects/foo/mypythonproject/moduleundertest'
Run Code Online (Sandbox Code Playgroud)

解决办法是编辑单元测试的运行配置,将Unittests Target从“Script path”改为“Module name”。