python - 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
解决方案
您不应该同时制作src/__init__.py
andtest/__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
推荐阅读
- ios - typealias 泛型函数变量
- powerbi - Power BI DAX 从自定义日期获取上个月的值
- laravel - laravel post 方法不工作。虽然 GET 方法工作
- javascript - 如何使用钩子在组件状态下复制 Redux 存储?
- javascript - 如何将 Vue 变量设置为等于函数参数?
- javascript - 在 JavaScript 中使用 forEach() 函数调用 $el 时出现问题
- php - php日期比较问题,我尝试了很多日期,但它根本不起作用
- pine-script - 交易视图 / Pine 脚本平均高点和低点
- c - 如何将 sigaction 与 4 个子进程一起使用?
- docker - Docker Desktop 未启动 - 序列不包含匹配元素