Windows本地无Docker环境下AWS Glue Spark代码开发测试及报错解决
AWS Glue Spark代码本地单元测试与Sonar覆盖率解决方案
针对你在Windows环境下遇到的核心问题,给出以下实操方案:
一、解决ModuleNotFoundError(找不到dynamicframe模块)
现有第三方模拟库无效时,直接手动构建最小化的Glue模块Mock:
- 创建本地Mock目录结构:在项目根目录下新建
mock_awsglue/awsglue文件夹 - 在
mock_awsglue/awsglue下创建dynamicframe.py,仅模拟业务代码中实际用到的DynamicFrame核心方法,示例如下:from pyspark.sql import DataFrame class DynamicFrame: def __init__(self, df: DataFrame, name: str): self.df = df self.name = name @staticmethod def fromDF(df: DataFrame, glue_ctx, name: str): return DynamicFrame(df, name) def selectFields(self, paths): selected_df = self.df.select(paths) return DynamicFrame(selected_df, self.name) def toDF(self): return self.df - 在测试代码最开头添加路径配置,让Python优先加载本地Mock模块:
import sys sys.path.insert(0, './mock_awsglue')
二、解决awsglue.utils.GlueArgumentError(缺少--JOB_NAME参数)
通过Mock Glue的参数解析方法绕过必填参数校验:
- 使用unittest.mock模块替换
awsglue.utils.getResolvedOptions方法(以pytest为例):from unittest.mock import patch import pytest from your_glue_job_code import main # 导入你的业务代码入口 @patch('awsglue.utils.getResolvedOptions') def test_glue_job_logic(mock_get_resolved_options): # 模拟返回必填的JOB_NAME参数 mock_get_resolved_options.return_value = {'JOB_NAME': 'local-test-job'} # 执行业务代码测试逻辑 main() # 添加断言验证结果 assert ... - 若不用pytest,也可在测试代码开头直接设置环境变量(简单场景适用):
import os os.environ['JOB_NAME'] = 'local-test-job'
三、生成Sonar覆盖率报告
- 用coverage.py生成Sonar兼容的覆盖率数据:
# 安装coverage工具 pip install coverage # 运行测试并收集覆盖率 coverage run -m pytest tests/ # 生成Sonar可识别的xml报告 coverage xml -o coverage.xml - 将生成的
coverage.xml与业务代码一同提交给SonarQube扫描即可,Mock模块不会影响业务代码的覆盖率统计。
内容的提问来源于stack exchange,提问作者srikanth sanapathi
相关产品推荐
相关产品推荐

