使用 test/ 和 src/ 的 Python 单元测试未找到 src 模块

use*_*539 7 python python-unittest visual-studio-code

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

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

Run Code Online (Sandbox Code Playgroud)

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

foo.py

import bar

def start():
  bar.do_stuff()
Run Code Online (Sandbox Code Playgroud)

运行测试时(我使用 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'
Run Code Online (Sandbox Code Playgroud)

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

小智 0

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

根据上述问题的答案,尝试在您的foo.py文件中执行以下操作:

from proj.src.bar import [name of function you're testing here]
Run Code Online (Sandbox Code Playgroud)

do_stuff()在您的具体情况下,如果是一个独立函数,则如下所示:

from proj.src.bar import do_stuff
Run Code Online (Sandbox Code Playgroud)

然后你的foo.py文件将是:

from proj.src.bar import do_stuff

def stuff():
  do_stuff()
Run Code Online (Sandbox Code Playgroud)

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

from proj.src.bar import bar
Run Code Online (Sandbox Code Playgroud)

然后你的foo.py文件将类似于你现在的样子:

from proj.src.bar import bar

def stuff():
  bar.do_stuff()
Run Code Online (Sandbox Code Playgroud)

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