如何使用pytest测试Python模块中的__main__.py文件?
解决pytest中导入本地__main__.py的问题
问题原因
当用pytest运行测试时,pytest自身的入口脚本会被当作__main__模块,所以直接import __main__会导入pytest的__main__.py,而非你项目中core包的同名文件——这是Python模块系统的固有特性。
解决方案
方法1:重构代码(推荐)
把__main__.py中的核心逻辑抽离到单独模块,彻底避免依赖__main__模块:
- 在
src/core下新建main.py,将原来__main__.py里的main()函数移到这个文件中 - 修改原
__main__.py内容为:from .main import main if __name__ == "__main__": main() - 测试文件中直接导入并测试:
from core.main import main def test_main(): # 编写测试逻辑 result = main() assert result == expected_value
方法2:通过包名导入本地__main__模块
利用Python包的导入规则,直接通过core包引用它的__main__模块:
- 确保项目根目录或
src目录在Python的搜索路径中。可在项目根目录创建pytest.ini文件添加路径配置:[pytest] pythonpath = src - 测试文件中导入:
from core import __main__ as core_main def test_main(): core_main.main() # 添加断言逻辑
方法3:使用importlib动态导入
如果无法重构代码,可通过importlib手动加载本地__main__.py:
import importlib.util from pathlib import Path def test_main(): # 定位到core包下的__main__.py文件 main_file_path = Path(__file__).parent.parent / "__main__.py" # 创建模块规范 spec = importlib.util.spec_from_file_location("core.__main__", main_file_path) core_main = importlib.util.module_from_spec(spec) # 执行模块加载 spec.loader.exec_module(core_main) # 调用main函数并测试 core_main.main() # 添加断言逻辑
内容的提问来源于stack exchange,提问作者mike rodent
相关产品推荐
相关产品推荐

