Files
ZQYY.FQ-ETL/docs/开发笔记/test_inventory.md

141 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 单元测试清单280 passed / 1 skipped
> 最后更新2026-02-12基于 `pytest tests/unit -v` 输出。
## 概览
| 分类 | 测试文件 | 测试数 | 说明 |
|------|---------|--------|------|
| ETL 任务(在线) | `test_etl_tasks_online.py` | 14 | FakeAPI 模拟在线抓取,验证 14 个 ODS 任务 E/T/L |
| ETL 任务(离线) | `test_etl_tasks_offline.py` | 14 | 本地 JSON 回放,验证离线入库链路 |
| ETL 任务(分阶段) | `test_etl_tasks_stages.py` | 42 | 14 个任务 × 3 阶段Extract/Transform/Load |
| ODS 通用任务 | `test_ods_tasks.py` | ~20+ | ODS 通用加载器任务测试 |
| 解析器 | `test_parsers.py` | ~10+ | 数据类型解析(日期/金额/枚举) |
| 配置管理 | `test_config.py` | ~10+ | AppConfig 加载、点号路径、分层覆盖 |
| 接口路由 | `test_endpoint_routing.py` | ~5+ | 近期/历史接口路由规则 |
| 报告工具 | `test_reporting.py` | ~5+ | 汇总格式化工具 |
| 审计扫描 | `test_audit_*.py`6 个文件) | ~40+ | 仓库审计:文件清单、流程树、文档对齐、报告属性 |
| 关系指数 | `test_relation_index_base.py` | ~5+ | RS/OS/MS/ML 指数基础逻辑 |
| **调度器重构(新增)** | 见下方 | **51** | TaskRegistry / TaskExecutor / PipelineRunner / CLI / E2E |
## 调度器重构新增测试51 个)
### `test_task_registry.py` — TaskRegistry 单元测试16 个)
| 测试类 | 测试方法 | 验证内容 |
|--------|---------|---------|
| `TestRegisterAndMetadata` | `test_register_with_defaults` | 仅传 task_code + task_class 时使用默认元数据 |
| | `test_register_with_full_metadata` | 完整元数据注册layer/task_type |
| | `test_register_utility_task` | 工具类任务 requires_db_config=False |
| | `test_case_insensitive_lookup` | task_code 大小写不敏感 |
| | `test_get_metadata_unknown_returns_none` | 未注册任务返回 None |
| `TestCreateTask` | `test_create_task_returns_instance` | 创建任务实例(接口不变) |
| | `test_create_task_unknown_raises` | 未知任务抛 ValueError |
| `TestGetTasksByLayer` | `test_returns_matching_tasks` | 按层查询返回匹配任务 |
| | `test_case_insensitive_layer` | 层名大小写不敏感 |
| | `test_no_match_returns_empty` | 无匹配返回空列表 |
| | `test_none_layer_excluded` | layer=None 不被任何层查询返回 |
| `TestIsUtilityTask` | `test_utility_task` | requires_db_config=False → True |
| | `test_normal_task` | requires_db_config=True → False |
| | `test_unknown_task` | 未注册任务 → False |
| `TestGetAllTaskCodes` | `test_returns_all_codes` | 返回所有已注册代码 |
| | `test_empty_registry` | 空注册表返回空列表 |
### `test_task_registry_properties.py` — TaskRegistry 属性测试3 个类,~300 次迭代)
| 测试类 | 测试方法 | Property | 验证内容 | 迭代次数 |
|--------|---------|----------|---------|---------|
| `TestProperty8MetadataRoundTrip` | `test_metadata_round_trip` | P8 | 任意 task_code/requires_db/layer/task_type 组合注册后get_metadata 返回完全相同的值 | 100 |
| `TestProperty9BackwardCompatibleDefaults` | `test_legacy_register_uses_defaults` | P9 | 仅传 task_code + task_class 时,默认 requires_db_config=True、layer=None、task_type="etl" | 100 |
| `TestProperty10GetTasksByLayer` | `test_get_tasks_by_layer_matches_manual_filter` | P10 | 注册一组任务后,按层查询结果与手动过滤完全一致 | 100 |
### `test_config_properties.py` — 配置映射属性测试1 个类100 次迭代)
| 测试类 | 测试方法 | Property | 验证内容 | 迭代次数 |
|--------|---------|----------|---------|---------|
| `TestProperty11FlowToDataSourceMapping` | `test_pipeline_flow_maps_to_data_source` | P11 | pipeline_flowFULL/FETCH_ONLY/INGEST_ONLY→ data_sourcehybrid/online/offline映射一致 | 100 |
### `test_task_executor_properties.py` — TaskExecutor 属性测试4 个类7 个方法,~700 次迭代)
| 测试类 | 测试方法 | Property | 验证内容 | 迭代次数 |
|--------|---------|----------|---------|---------|
| `TestProperty1DataSourceDeterminesPath` | `test_flow_includes_fetch` | P1 | data_source 为 online/hybrid 时 fetch=Trueoffline 时 fetch=False | 100 |
| | `test_flow_includes_ingest` | P1 | data_source 为 offline/hybrid 时 ingest=Trueonline 时 ingest=False | 100 |
| | `test_fetch_and_ingest_consistency` | P1 | hybrid 两者皆 Trueonline 仅 fetchoffline 仅 ingest | 100 |
| `TestProperty2SuccessAdvancesCursor` | `test_success_with_window_advances_cursor` | P2 | 成功任务调用 cursor_mgr.advance传入正确的 window_start/window_end | 100 |
| `TestProperty3FailureMarksFailAndReraises` | `test_exception_marks_fail_and_reraises` | P3 | 异常时 run_tracker.update_run(status="FAIL") 并重新抛出原始异常 | 100 |
| `TestProperty4UtilityTaskDeterminedByMetadata` | `test_utility_task_skips_cursor_and_run_tracker` | P4 | 工具类任务requires_db_config=False跳过游标和运行记录 | 100 |
| | `test_non_utility_task_uses_cursor_and_run_tracker` | P4 | 非工具类任务使用游标和运行记录 | 100 |
### `test_pipeline_runner_properties.py` — PipelineRunner 属性测试3 个类8 个方法,~800 次迭代)
| 测试类 | 测试方法 | Property | 验证内容 | 迭代次数 |
|--------|---------|----------|---------|---------|
| `TestProperty5PipelineNameToLayers` | `test_layers_match_pipeline_definition` | P5 | run() 返回的 layers 与 PIPELINE_LAYERS[pipeline] 完全一致 | 100 |
| | `test_resolve_tasks_called_with_correct_layers` | P5 | _resolve_tasks 接收的层列表与定义一致 | 100 |
| `TestProperty6ProcessingModeControlsFlow` | `test_increment_executes_iff_mode_contains_increment` | P6 | 增量 ETL 执行当且仅当 mode 包含 "increment" | 100 |
| | `test_verification_executes_iff_mode_contains_verify` | P6 | 校验流程执行当且仅当 mode 包含 "verify" | 100 |
| `TestProperty7PipelineSummaryCompleteness` | `test_summary_has_required_fields` | P7 | 返回字典包含 status/pipeline/layers/results/verification_summary | 100 |
| | `test_results_length_equals_executed_tasks` | P7 | results 长度等于实际执行的任务数 | 100 |
| | `test_pipeline_and_layers_match_input` | P7 | 返回的 pipeline 和 layers 与输入一致 | 100 |
| | `test_increment_only_has_no_verification` | P7 | increment_only 模式下 verification_summary 为 None | 100 |
### `test_filter_verify_tables.py` — 校验表过滤单元测试9 个)
| 测试类 | 测试方法 | 验证内容 |
|--------|---------|---------|
| `TestFilterVerifyTables` | `test_none_input_returns_none` | 输入 None 返回 None |
| | `test_empty_list_returns_none` | 空列表返回 None |
| | `test_dwd_layer_filters_correctly` | DWD 层过滤:保留 dwd_/dim_/fact_ 前缀 |
| | `test_dws_layer_filters_correctly` | DWS 层过滤:保留 dws_ 前缀 |
| | `test_index_layer_filters_correctly` | INDEX 层过滤:保留 v_/wbi_/nci_ 等前缀 |
| | `test_ods_layer_filters_correctly` | ODS 层过滤:保留 ods_ 前缀 |
| | `test_unknown_layer_returns_normalized` | 未知层返回归一化后的全部表名 |
| | `test_layer_case_insensitive` | 层名大小写不敏感 |
| | `test_whitespace_and_empty_entries_stripped` | 空白和空条目被过滤 |
### `test_cli_args.py` — CLI 参数解析单元测试14 个)
| 测试类 | 测试方法 | 验证内容 |
|--------|---------|---------|
| `TestDataSourceArg` | `test_data_source_valid_values` (×3) | --data-source 接受 online/offline/hybrid |
| | `test_data_source_default_is_none` | 未指定时默认 None |
| `TestResolveDataSource` | `test_explicit_data_source_returns_directly` | 显式 --data-source 直接返回 |
| | `test_data_source_takes_priority_over_pipeline_flow` | --data-source 优先于 --pipeline-flow |
| | `test_pipeline_flow_maps_with_deprecation_warning` (×3) | 旧参数映射 + 弃用警告 |
| | `test_neither_arg_defaults_to_hybrid` | 两者都未指定时默认 hybrid |
| `TestBuildCliOverrides` | `test_data_source_online_sets_run_key` | --data-source 写入 run.data_source |
| | `test_pipeline_flow_sets_both_keys` | 旧参数同时写入 pipeline.flow 和 run.data_source |
| | `test_default_data_source_is_hybrid` | 默认 run.data_source 为 hybrid |
| `TestPipelineAndTasks` | `test_pipeline_and_tasks_both_parsed` | --pipeline + --tasks 同时解析 |
### `test_e2e_flow.py` — 端到端流程集成测试4 个)
| 测试类 | 测试方法 | 验证内容 |
|--------|---------|---------|
| `TestTraditionalModeE2E` | `test_run_tasks_executes_utility_task_and_returns_results` | TaskExecutor.run_tasks 工具类任务端到端 |
| `TestPipelineModeE2E` | `test_pipeline_delegates_to_executor_and_returns_structure` | PipelineRunner → TaskExecutor 委托 + 返回结构 |
| | `test_pipeline_verify_only_skips_increment` | verify_only 模式跳过增量 ETL |
| `TestSchedulerThinWrapper` | `test_scheduler_delegates_run_tasks` | ETLScheduler 薄包装层正确委托 TaskExecutor/PipelineRunner |
---
## 属性测试PBT汇总
| Property | 所属组件 | 验证需求 | 迭代次数 |
|----------|---------|---------|---------|
| P1 | TaskExecutor | data_source 参数决定执行路径Req 1.2 | 300 |
| P2 | TaskExecutor | 成功任务推进游标Req 1.3 | 100 |
| P3 | TaskExecutor | 失败任务标记 FAIL 并重新抛出Req 1.4 | 100 |
| P4 | TaskExecutor | 工具类任务由元数据决定Req 1.6, 4.2 | 200 |
| P5 | PipelineRunner | 管道名称→层列表映射Req 2.1 | 200 |
| P6 | PipelineRunner | processing_mode 控制执行流程Req 2.3, 2.4 | 200 |
| P7 | PipelineRunner | 管道结果汇总完整性Req 2.6 | 400 |
| P8 | TaskRegistry | 元数据 round-tripReq 4.1 | 100 |
| P9 | TaskRegistry | 向后兼容默认值Req 4.4 | 100 |
| P10 | TaskRegistry | 按层查询任务Req 4.3 | 100 |
| P11 | AppConfig | pipeline_flow → data_source 映射一致性Req 8.1-8.4, 5.2 | 100 |
总计11 个属性,~1900 次迭代。