使用 test/ 和 src/ 进行 Python 单元测试找不到 src 模块

问题描述 投票:0回答:5

我有一个简单的目录结构:

proj/
    src/
        __init__.py
        foo.py
        bar.py
    test/
        __init__.py
        test_foo.py

test_foo.py

import unittest

import sys
sys.path.append('../src')

from src import foo

class TestFoo(unittest.TestCase):

  def test_foo(self):
    foo.start()


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

foo.py

import bar

def start():
  bar.do_stuff()

运行我的测试时(我使用的是 vscode),出现以下错误:

Failed to import test module: test_foo
Traceback (most recent call last):
  File "~/.pyenv/versions/3.8.6/lib/python3.8/unittest/loader.py", line 436, in _find_test_path
    module = self._get_module_from_name(name)
  File "~/.pyenv/versions/3.8.6/lib/python3.8/unittest/loader.py", line 377, in _get_module_from_name
    __import__(name)
  File "~/proj/test/test_foo.py", line 6, in <module>
    from src import foo
  File "~/proj/src/foo.py", line 1, in <module>
    import bar
ModuleNotFoundError: No module named 'bar'

我不知道为什么测试在导入 src/foo 时无法发现 src/bar

python visual-studio-code python-unittest
5个回答
1
投票

而不是

import bar
尝试
from src import bar

from src import bar


def start():
    bar.do_stuff()

注意事项

请记住,您仅调整了测试中的路径。您不希望测试工作,但应用程序失败,因为您忘记在某个时刻调整应用程序中的路径。


0
投票

您的

bar.py
文件中有什么?只是
do_stuff()
功能吗?或者
do_stuff()
函数是对象
bar
的方法吗?

根据上述问题的答案,尝试在您的

foo.py
文件中执行以下操作:

from proj.src.bar import [name of function you're testing here]

在您的具体情况下,如果

do_stuff()
是一个独立的函数,就会像这样:

from proj.src.bar import do_stuff

然后你的

foo.py
文件将是:

from proj.src.bar import do_stuff

def stuff():
  do_stuff()

但是,如果

do_stuff()
bar
对象的方法,那么它可能会是这样的,尽管在不知道
bar.py
文件内容的情况下很难判断:

from proj.src.bar import bar

然后您的

foo.py
文件将与您现在的方式类似:

from proj.src.bar import bar

def stuff():
  bar.do_stuff()

我最近在尝试将一个相邻文件导入另一个文件时遇到了类似的问题。这个链接也帮助了我。


0
投票

两处变化:

  1. from src import bar
    foo.py
    ,

  2. test_foo.py
    中导入模块之前,添加

     import sys  
     sys.path.append("./")
    

然后您应该能够成功运行代码。


0
投票

就我而言,我在

bar.py
文件中导入了实际未安装的模块,例如:

import requests

安装这些模块后,VSCode 可以正确显示测试。


0
投票

我也有同样的问题。似乎 python 无法将 src 目录识别为包。因此,我通过创建 setup.py 文件将“src”开发为包,并运行它来创建包分发格式。您可以创建“egg”(旧格式)或“wheel”文件格式。希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.