Github Actions运行pytest时遇dbutils相关错误求助
解决方法
因为你测试不需要用到dbutils,核心思路就是让主代码在测试环境下跳过对dbutils的依赖,或者用假的dbutils对象替代,给你三个实用方案:
方案1:用pytest的monkeypatch mock dbutils
在测试文件里直接用pytest的monkeypatch工具模拟一个dbutils对象,让主代码调用dbutils.widgets时不会报错。
比如在单个测试函数里添加:
def test_your_function(monkeypatch): # 模拟一个带widgets的空dbutils对象,get方法可返回测试用默认值 mock_widgets = type('MockWidgets', (), {'get': lambda *args: 'test_default'})() mock_dbutils = type('MockDBUtils', (), {'widgets': mock_widgets})() # 将模拟对象注入全局命名空间 monkeypatch.setitem(globals(), 'dbutils', mock_dbutils) # 导入主代码并执行测试 from your_main_module import target_function result = target_function() assert result == expected_result
如果多个测试都需要,可把这段mock逻辑放到conftest.py里作为全局fixture复用:
import pytest @pytest.fixture(autouse=True) def mock_dbutils(monkeypatch): mock_widgets = type('MockWidgets', (), {'get': lambda *args: 'test_default'})() mock_dbutils = type('MockDBUtils', (), {'widgets': mock_widgets})() monkeypatch.setitem(globals(), 'dbutils', mock_dbutils)
这样所有测试会自动应用该mock,无需重复编写。
方案2:在主代码里做环境兼容判断
修改主代码,仅在Databricks环境下初始化真实dbutils,测试环境则自动使用空实现:
try: # 尝试导入Databricks的dbutils from pyspark.dbutils import DBUtils dbutils = DBUtils(spark) except (ImportError, NameError): # 非Databricks环境,定义空的dbutils及widgets class MockWidgets: @staticmethod def get(param_name): return '' # 可根据测试需求返回默认值 dbutils = type('MockDBUtils', (), {'widgets': MockWidgets()})() # 原有业务代码 def target_function(): param = dbutils.widgets.get('param_name') # 业务逻辑实现...
这样主代码在Github Actions的测试环境下会自动适配,不会因找不到dbutils报错。
方案3:用unittest.mock模块mock dbutils
借助Python标准库的unittest.mock实现对象模拟,比如在测试文件中:
from unittest.mock import Mock, patch def test_your_function(): # 构建mock的widgets和dbutils mock_widgets = Mock() mock_widgets.get.return_value = 'test_default' mock_dbutils = Mock(widgets=mock_widgets) # 将mock对象注入主模块的命名空间 with patch('your_main_module.dbutils', mock_dbutils): from your_main_module import target_function result = target_function() assert result == expected_result
以上方案都能解决问题,推荐方案1或3,无需修改主代码,更符合测试隔离原则;如果主代码本身需要兼容多环境,方案2会更合适。
内容的提问来源于stack exchange,提问作者Alexis Kan
相关产品推荐
相关产品推荐

