首页 > 解决方案 > Pytest 和子模块

问题描述

我正在尝试在我的 python 模块上运行 pytest 测试,但遇到了错误。看起来主脚本ircFriend.py找不到我在其中导入的模块。这是我得到的错误。我在每次测试中都会遇到这个错误。

______________________________________________ ERROR collecting test/configuration_test.py ____________________________________
ImportError while importing test module 'C:\Users\munded\Desktop\irc-friend\test\configuration_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
..\..\appdata\local\programs\python\python38\lib\importlib\__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
test\configuration_test.py:2: in <module>
    from src import ircFriend
E   ModuleNotFoundError: No module named 'configuration'

这是我用于测试的文件结构。__init__.py文件是空的。

├───src
│   │   configuration.py
│   │   ircFriend.py
│   │   ircSync.py
│   │   logbook.py
│   │   networkdrive.py
│   │   server.py
│   │   tree.py
│   │   workspace.py
│   │   __init__.py
└───test
    │   configuration_test.py
    │   fileIO_test.py
    │   sandbox_test.py
    │   server_test.py
    │   sync_test.py
    │   __init__.py

如果我们查看其中的导入,ircFriend.py它们看起来像这样。

import sys
import getopt
import logging
from configuration import Configuration
from logbook import LogBook
from networkdrive import NetworkDrive
from ircSync import IRCSync
from workspace import Workspace
from server import Server

最后这些是我的测试的样子。

from src import ircFriend
from unittest import mock
from src import configuration
from src import server


@mock.patch('builtins.input', side_effect=['X'])
def testPropertiesFileExists(mockInput):
    conf = Configuration()
    assert conf.propertiesFileExists() is True


@mock.patch('builtins.input', side_effect=['X'])
def testIrcConfigExists(mockInput):
    conf = Configuration()
    assert conf.ircConfigExists() is True


@mock.patch('builtins.input', side_effect=['devsite.dev', 'user'])
@mock.patch('src.ircFriend.getpass.getpass', return_value="IDK")
def testServerCreation(mock_input, mock_getpass):
    dev = Server()
    if isinstance(dev, ircFriend.Server):
        assert True
    else:
        assert False

任何关于这个主题的指导都会给我一个美好的世界。

最好的问候, E

标签: pythonpython-3.xpytest

解决方案


您不应该同时制作src/__init__.pyandtest/__init__.py文件,因为这些 src 和 test 不是包。这些只是源代码和测试代码的根目录。

在测试代​​码中,您应该删除from src,因为src它不是一个包。

最后,运行 pytest 将 src 添加到 PYTHONPATH 否则 pytest 无法在 src 目录下找到模块。

$ PYTHONPATH=src pytest test

或者,您可以制作src/conftest.py,这是 pytest 的特殊文件。

我检查了这些代码。

# test/conftest.py
import sys
sys.path.append("./src")
# src/a.py
from b import say
def func():
    return say()
# src/b.py
def say():
    return "Hello"
# test/test_a.py
import a
def test_a():
    assert a.func() == "Hello"
$ pytest test

推荐阅读