我有一个简单的目录结构:
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
而不是
import bar
尝试 from src import bar
。
from src import bar
def start():
bar.do_stuff()
注意事项
请记住,您仅调整了测试中的路径。您不希望测试工作,但应用程序失败,因为您忘记在某个时刻调整应用程序中的路径。
您的
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()
我最近在尝试将一个相邻文件导入另一个文件时遇到了类似的问题。这个链接也帮助了我。
就我而言,我在
bar.py
文件中导入了实际未安装的模块,例如:
import requests
安装这些模块后,VSCode 可以正确显示测试。
我也有同样的问题。似乎 python 无法将 src 目录识别为包。因此,我通过创建 setup.py 文件将“src”开发为包,并运行它来创建包分发格式。您可以创建“egg”(旧格式)或“wheel”文件格式。希望这有帮助