使用 pytest 运行测试时出现问题 - 在我自己的包中找不到模块

Posted

技术标签:

【中文标题】使用 pytest 运行测试时出现问题 - 在我自己的包中找不到模块【英文标题】:Problems running tests using pytest - Not finding a module within my own package 【发布时间】:2021-10-12 04:45:52 【问题描述】:

设置

首先,这是文件结构:

BankParser
|--BankParser
|   |-- __init__.py
|   |-- DatabaseManager.py
|   |-- utilities.py
|--Tests
    |-- __init__.py
    |-- test_DatabaseManager.py

在 test_DatabaseManager.py 中,我有:import BankParser.DatabaseManager as dbm

我通过以下方式调用 pytest,从 VSCode 集成命令行:pipenv run pytest --verbosity=1 --color=auto --junit-xml=Output\\TestsReport.xml --no-cov Tests

问题

以上述方式调用pytest会导致:

Tests\test_DatabaseManager.py:3: in <module>
    import BankParser.DatabaseManager as dbm
BankParser\DatabaseManager.py:5: in <module>
    import utilities as u
E   ModuleNotFoundError: No module named 'utilities'

您可以猜到,在 DatabaseManager.py 中,我们有import utilities.py as u

问题

为什么这个导入没有解决?我认为它应该在 BankParser 包的上下文中处理?在 DatabaseManager 中使用实用程序本身可以正常工作,只是在从 Tests 调用时显示为问题。

【问题讨论】:

【参考方案1】:

所以,如果我没看错的话,听起来utilitiesDatabaseManager 在同一个父级下,所以您可以进行绝对导入:import BankParser.utilities as u 或者,您可以使用相对导入:import .utilities as u

问题是utilities.py 本身不在PYTHONPATH 中,所以不能直接导入。

【讨论】:

绝对导入确实解决了这个问题,我的印象是它不应该在活动包中完成。我将研究附加到 python 路径。然而,在添加绝对导入之后,调试 DatabaseManager.py 例如说 BankParser 不是模块。我一直在努力在没有模块错误的情况下执行代码和在没有模块错误的情况下运行测试之间来回斗争。我似乎不能同时做这两件事哈哈【参考方案2】:

正如@ZaketyZach 所指出的,将我的 BankParser 文件夹添加到 PYTHONPATH 是解决方案。由于我的没有设置任何内容,因此将其添加到我的 settings.json 中就可以了(VSCode):

  "terminal.integrated.env.windows":
  
    "PYTHONPATH": "$workspaceFolder\\BankParser",
  ,

【讨论】:

以上是关于使用 pytest 运行测试时出现问题 - 在我自己的包中找不到模块的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 pytest-qt 进行测试时出现致命的 Python 错误?

如何使用pytest正确退出队列和Qthread进行测试?

运行 py.test 时出现错误 ImportMismatchError

使用 Android-Espresso 运行多个测试时出现内存不足异常

仅在运行测试时出现 DexIndexOverflowException

使用 SyncProxy 测试服务:“接收 RPC 响应时出现 IOException”