Python的单元测试模块报错:"ModuleNotFoundError: No module named 'tests.test_file'"

54

我正在尝试执行一个测试用例,这是我一直在工作的项目。以前我可以成功地执行单元测试,但现在出现了错误。我确定没有更新任何库或更改路径。我试图查看源代码并找出为什么出错了,但还没有找到。如果有人能提供帮助,将不胜感激。

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

3
你在tests目录下有一个__init__.py文件吗?这样可以将测试文件作为模块的一部分进行发现。 - gold_cy
不,我没有,在同一个“tests”目录中之前从未有过“__init.py__”文件,但测试工作得很好。 - Bee
1
@aws_apprentice - 我在测试文件夹中放了一个空的__init__.py文件,令人惊讶的是,单元测试现在可以工作了。我不知道为什么?如果您能给出一个简要解释这种行为的原因,我将接受它作为答案。谢谢。 - Bee
1
https://dev59.com/kHRB5IYBdhLWcg3w-8A9 这个链接会比我更好地解释。 - gold_cy
1
我也遇到了这个错误,除非你需要在该目录下运行安装脚本,否则在Python 3.3+中不需要__init__.py。 - boardtc
7个回答

54
在测试文件夹中放置一个空的__init__.py文件后,问题得以解决。如需更好地解释为什么有效,请参阅What is __init__.py for?。感谢@aws_apprentice的帮助。

8
我在GitHub Actions上遇到了这个错误,但本地没有出现,而且这个解决方法对我没有用。 - szeitlin
3
我也没成功。 - alelom
2
在 Python 3.3+ 中,此处不需要 init.py。这里存在一个不同的问题。 - Eaton Emmerich

16

使用PyCharm 2020.2时,在子文件夹中运行引用父文件夹下的模块的单元测试也可能出现“ModuleNotFoundError: No module named”错误。PyCharm默认使用脚本路径来执行测试,导致测试失败并出现此错误:

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

解决方案是编辑单元测试的运行配置,并将Unittests目标从“脚本路径”更改为“模块名称”。


如果在一个文件夹中运行测试,请将目标设置为文件夹的名称,例如 unit - Voy

4
原因是某些库已经使用了该包名称,请参见:关于保留包名称的此Stack Overflow问题 为了理解这个问题:将tests包重命名为tests_package包。(test也是一个保留的包名称)
之前:
MWE -|
     |- tests -|
               |- test_file.py

之后:

MWE -|
     |- tests_package -|
                       |- test_file.py

(自Python 3.3起,不需要__init__.py文件)

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

使用"venv"可以解决tests包名称的问题,但对于test则无法解决

也许更加符合Python风格的解决方案是,通过为项目命名一个唯一的模块名称,使其不在“root”中运行,并摆脱要求在tests目录中使用未使用Python库的包名称。

举个例子:
GitFolderOfProject -|
                    |- MWE -|
                            |- tests -|
                                      |- test_file.py

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


3
我的解决方案是添加以下内容:
if __name__ == '__main__':
    unittest.main()

将内容翻译成中文:

到我的测试文件底部。

然后我可以运行:

python -m <test-file>

从我的python -m命令中删除.py后缀也是必需的:

有关详细信息,请参见此答案


1

这是一个简单的设置魔法。

首先,在PyCharm中:

  1. 右键单击包含测试的文件夹(在项目树中),将此文件夹标记为“测试文件夹”。

  2. 右键单击包含源代码的文件夹(在项目树中),将此文件夹标记为“源文件夹”。

  3. 删除错误的“运行配置”(或不删除,由您选择)。

  4. 右键单击已标记为“测试文件夹”的测试文件夹 - 选择“运行”。

就是这样。非常简单。逻辑清晰。我花了大约一个小时才找到它。


问题中没有提到 PyCharm。 - Andy Mikhaylenko

0

我在Pycharm 2023.1(详细版本如下)遇到了类似的问题

Git项目文件夹 -| |- src-| |- utests -| |- test_file.py

我可以从/src文件夹中通过命令行运行测试

python -m unittest discover  .\utest\ 

然而在IDE上,我遇到了ModuleNotFound错误。

除了将脚本路径更改为模块路径外,我还必须将/utest文件夹的工作目录更改为/src。我能够从IDE中运行测试。

PyCharm 2023.1.3(Community Edition) Build # PC-231.9161.41,建立于2023年6月20日 运行时版本:17.0.7+10-b829.16 amd64 VM:由JetBrains s.r.o提供的OpenJDK 64位服务器VM。 Windows 10.0 GC:G1 Young Generation,G1 Old Generation 内存:2012M 核心:16 非捆绑插件: net.seesharpsoft.intellij.plugins.csv(3.2.0-231)


0
即使在添加了__init__.py并将我的测试重命名为Django的命名约定之后,我仍然遇到了这个错误。我的问题是测试文件的结构是错误的。我原本的结构是:
apps -|
      |- reports -|
                  |- tests -|
                            |- test_file.py

在我的情况下,我应该在tests包和test_file.py之间添加另一个名为我所在应用程序的包,即reports。因此,新的结构如下:
apps -|
      |- reports -|
                  |- tests -|
                            |- reports -|
                                        |- test_file.py

我不知道为什么会变成这样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接