运行测试时出现Python ModuleNotFoundError

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

我有一个按预期正确运行的 Python 程序,但由于某种原因我无法执行测试。

在文件夹层次结构中,testssrc的同级文件夹,执行测试时遇到的错误是:

ModuleNotFoundError: No module named 'sub'

这里,层次结构加上代码的MWE:

- src/
  - __init__.py
  - dummyA.py
  - main.py
  - sub/
    -__init__.py
    - dummyB.py
- tests/
  - __init__.py
  - test_s.py

src/dummyA.py

from sub.dummyB import Sub
class Sup:
    def __init__(self):
        self.sub_var = Sub()

    def hello_sup(self, s):
        sub_word = self.sub_var.hello_sub(s)
        return f"Super {sub_word}!"

src/sub/dummyB.py(在“sub”文件夹内)

class Sub:
    def hello_sub(self, a):
        return f"{a}"

src/main.py

from sub.dummyB import Sub
from dummyA import Sup

def main():
    sub = Sub()
    sup = Sup()

    dummy_text = "cat"

    sub_word = sub.hello_sub(dummy_text)
    sup_word = sup.hello_sup(dummy_text)

    print("Sub is:", sub_word) # cat
    print(f"Sup is: {sup_word}") # Super cat!

if __name__ == "__main__":
    main()

测试/test_s.py

from src.dummyA import Sup

def test_sub_sup():
    dummy_sup = Sup()
    expected_res = dummy_sup.hello_sup("cat")
    assert expected_res == "Super cat!"

错误日志:

ImportError: Failed to import test module: test_s
Traceback (most recent call last):
  File "/usr/lib/python3.11/unittest/loader.py", line 162, in loadTestsFromName
    module = __import__(module_name)
             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/demo/tests/test_s.py", line 1, in <module>
    from src.dummyA import Sup
  File "/home/user/demo/src/dummyA.py", line 1, in <module>
    from sub.dummyB import Sub
ModuleNotFoundError: No module named 'sub'

无论我使用pytest还是unittest,错误总是相同的。 看起来系统在 dummyA.py 的第一行中断,因为它无法导入名为 sub 的模块。奇怪的是,因为应用程序运行时同一行被正确执行。

如你所见,我还在每个文件夹中使用了init.py,但这没有帮助。

我错过了什么吗? 谢谢!

python unit-testing testing pytest python-unittest
1个回答
0
投票

有这个结构

./src/dummyA.py
./src/sub/dummyB.py
./src/sub/__init__.py
./src/main.py
./src/__init__.py
./tests/test_s.py

修复

test_s.py

from dummyA import Sup

def test_sub_sup():

然后运行

PYTHONPATH=$PYTHONPATH:$PWD/src pytest -v tests

您会收到

collected 1 item                                                                                                              

tests/test_s.py::test_sub_sup PASSED                                                                                    [100%]

====================================================== 1 passed in 0.02s ======================================================
© www.soinside.com 2019 - 2024. All rights reserved.