You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成测试结构合理性排查与awsgluedq模块Mock方案咨询

Python Mock测试问题解决指南

1. 测试类结构与main_code导入问题

导入错误的修复方案

出现AttributeError: 'My_app.application' has no attribute 'main_code',核心原因是包结构或导入路径不对:

  • 先确认My_app/application目录下存在__init__.py文件(空文件即可),让Python识别这是合法可导入的包
  • 若main_code.py直接在My_app/application目录下,正确导入方式应为:
    # 导入整个模块
    from My_app.application import main_code
    # 或直接导入要测试的目标函数/类
    from My_app.application.main_code import your_target_func
    
  • 若测试文件不在项目根目录,需确保Python解释器的PYTHONPATH包含项目根目录,避免路径查找失败

测试类结构建议

不管用unittest还是pytest,都遵循简洁聚焦的原则:

  • 用unittest的话,测试类继承unittest.TestCase,每个测试方法以test_开头:
    import unittest
    from unittest.mock import patch
    from My_app.application import main_code
    
    class TestMainCode(unittest.TestCase):
        def test_data_processing(self):
            # 单场景测试逻辑
            pass
    
  • 用pytest的话,无需继承类,直接写test_前缀的函数/类即可,结构更灵活
  • 每个测试用例只验证单一功能,保持独立,避免相互依赖

2. Mock awsgluedq模块的两种方法

要避免本地安装awsgluedq,可以通过以下方式Mock整个模块:

方法一:全局提前Mock模块

在测试文件最开头,给sys.modules添加Mock对象,让Python认为模块已存在:

import sys
from unittest.mock import Mock

# 模拟awsgluedq主模块
sys.modules['awsgluedq'] = Mock()
# 如果有子模块需要用到,同样Mock
sys.modules['awsgluedq.some_submodule'] = Mock()

# 之后再导入main_code就不会触发ModuleNotFoundError
from My_app.application import main_code

方法二:用@patch装饰器针对特定用例Mock

如果只需要在部分测试用例中Mock该模块,使用patch装饰器指定main_code中导入的awsgluedq路径:

import unittest
from unittest.mock import patch, Mock
from My_app.application import main_code

class TestMainCode(unittest.TestCase):
    @patch('main_code.awsgluedq')
    def test_glue_dq_logic(self, mock_gluedq):
        # 给Mock对象设置预期返回值
        mock_gluedq.run_ruleset.return_value = {"status": "passed"}
        
        # 执行要测试的函数
        result = main_code.run_data_quality_checks()
        
        # 断言逻辑
        self.assertEqual(result["status"], "passed")

额外提示:Mock csvReader和dataframeWriter

针对这两个需要替换的函数,同样用patch指定导入路径即可:

@patch('main_code.dataframeWriter')
@patch('main_code.csvReader')
def test_integration_flow(self, mock_reader, mock_writer):
    # 设置mock_reader返回本地测试数据
    mock_reader.return_value = your_test_dataframe
    
    # 执行主逻辑
    main_code.process_data()
    
    # 断言writer是否按预期调用
    mock_writer.assert_called_once_with(expected_output_data)

内容的提问来源于stack exchange,提问作者Haha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:21:06