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

Dagster 1.3.6中Asset Job测试遇阻:UnresolvedAssetJobDefinition问题

解决Dagster 1.3.6中Asset Job测试的UnresolvedAssetJobDefinition问题

核心解决方案:通过Definitions关联资产与Job

你遇到的错误本质是手动构建的AssetGraph没有正确将Job的资产选择与实际资产定义关联起来。最简洁的解决方式是用Dagster的Definitions统一管理资产和Job,这样测试时可以直接获取已解析的JobDefinition,无需手动处理资产列表。

步骤1:在项目中定义Definitions

在你的包入口文件(比如my_package/__init__.py)中,将所有资产和Job注册到Definitions:

from dagster import Definitions
from .assets import source_asset_1, source_asset_2, asset_1, asset_2
from .jobs import my_job

defs = Definitions(
    assets=[source_asset_1, source_asset_2, asset_1, asset_2],
    jobs=[my_job]
)

步骤2:修改测试代码直接从Definitions获取Job

测试时无需手动构建AssetGraph,直接从Definitions中提取已解析完成的Job:

import pytest
from my_package import defs
from typing import Mapping

@pytest.fixture
def test_resources() -> Mapping[str, object]:
    return {
        "parquet_io_manager": parquet_io_manager.configured({'data_path': DATA_FOLDER }),
    }

def test_my_job(test_resources: Mapping[str, object]):
    # 从Definitions中获取已解析的JobDefinition
    job = defs.get_job_def("name_for_my_job")
    result = job.execute_in_process(resources=test_resources)
    assert result.success

为什么之前的方法报错?

你手动调用AssetGraph.from_assets()时,可能存在以下问题:

  • 资产的实际AssetKey与Job选择中定义的AssetKey不匹配(比如资产名称拼写错误、带命名空间但Job选择未指定)
  • 手动构建的AssetGraph没有包含Job依赖的所有上游资产(即使你列了四个资产,可能还有隐式依赖未加入)
  • UnresolvedAssetJobDefinition的resolve方法需要在完整的资产上下文(即Definitions管理的上下文)中才能正确匹配资产

替代方案:从Job的Selection自动筛选资产

如果不想依赖Definitions,可以通过Job的selection属性提取AssetKey,再从资产集合中筛选对应资产:

import pytest
from my_package import my_job, source_asset_1, source_asset_2, asset_1, asset_2
from dagster._core.definitions.asset_graph import AssetGraph
from typing import Mapping

@pytest.fixture
def test_resources() -> Mapping[str, object]:
    return {
        "parquet_io_manager": parquet_io_manager.configured({'data_path': DATA_FOLDER }),
    }

def test_my_job(test_resources: Mapping[str, object]):
    all_assets = [source_asset_1, source_asset_2, asset_1, asset_2]
    temp_graph = AssetGraph.from_assets(all_assets)
    # 解析Job的selection,获取选中的AssetKey集合
    selected_keys = set(my_job.selection.resolve(temp_graph).keys_by_output_name.keys())
    # 根据AssetKey筛选需要的资产
    selected_assets = [asset for asset in all_assets if asset.key in selected_keys]
    
    # 构建正确的AssetGraph并解析Job
    graph = AssetGraph.from_assets(selected_assets)
    job = my_job.resolve(asset_graph=graph)
    result = job.execute_in_process(resources=test_resources)
    assert result.success

这种方法可以避免手动重复列出资产,但仍需要维护所有资产的集合,不如Definitions方案简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:18:13