ワンクリックで
shanxi-resilience-unit-test-writer
陕交控项目单元测试生成工具 - 按模块分目录组织,自动生成 pytest 单元测试,覆盖核心逻辑与边界情况
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
陕交控项目单元测试生成工具 - 按模块分目录组织,自动生成 pytest 单元测试,覆盖核心逻辑与边界情况
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
陕交控项目专用路网路径查询工具 - 提供相邻节点查询、最短路径、Top N 替代路径、排除节点查询等功能,支持递归 CTE 和 pgRouting 两种实现方式
陕交控项目专用 pgRouting 路网优化工具 - 基于 PostgreSQL + PostGIS + pgRouting 构建高速路网拓扑,支持最短路径、Top N 路径、排除节点查询等高性能路径分析功能
陕交控项目专用数据导入工具 - 处理收费单元路径、收费站信息、收费路段等基础数据的Excel/CSV多版本导入,严格遵循数据字典,自动生成建表语句和导入脚本
陕交控项目专用文档更新工具 - 自动更新会话记录、业务逻辑记录、表口径总表等项目文档,保持文档与代码同步
陕交控项目专用 Git 操作管理 - 规范化的提交、分支管理、GitHub 协作流程,包含常用 Git 操作命令模板和最佳实践
陕交控项目批量处理并行化工具 - 将单进程 ETL/统计任务改造为多进程并行模式,含 CSV 分区读取、fork-safe DB、ON CONFLICT 累加、mini-batch 即时刷盘等完整模式
| name | shanxi-resilience-unit-test-writer |
| description | 陕交控项目单元测试生成工具 - 按模块分目录组织,自动生成 pytest 单元测试,覆盖核心逻辑与边界情况 |
编写涉及数据库操作的测试前,必须先阅读 docs/数据表说明.md,确认:
version_yyyomm 字段命名约定禁止凭记忆假设字段名或构造不符合数据字典的 Mock 返回值。
用户需要编写单元测试时自动激活:
测试文件必须按源码模块路径分目录存放,不允许平铺:
src/tests/unit/
├── __init__.py
├── app/ # 对应 src/app/
│ ├── __init__.py
│ ├── test_enums.py
│ └── test_settings.py
├── common/ # 对应 src/common/
│ ├── __init__.py
│ ├── test_time_utils.py
│ └── test_validators.py
├── m0_data_engineering/ # 对应 src/modules/m0_data_engineering/
│ ├── __init__.py
│ └── ...
├── m1_capacity/ # 对应 src/modules/m1_capacity/
│ ├── __init__.py
│ └── ...
├── m2_od_flow/ # 对应 src/modules/m2_od_flow/
│ ├── __init__.py
│ ├── test_interval_fixer.py
│ ├── test_csv_reader.py
│ ├── test_flow_stat_service.py
│ └── test_flow_stat_schema.py
├── m3_impact_analysis/ # 对应 src/modules/m3_impact_analysis/
│ └── ...
├── m4_path_optimization/ # 对应 src/modules/m4_path_optimization/
│ └── ...
├── m5_toll_impact/ # 对应 src/modules/m5_toll_impact/
│ └── ...
└── m6_od_section_path/ # 对应 src/modules/m6_od_section_path/
└── ...
| 源码路径 | 测试目录 |
|---|---|
src/app/ | src/tests/unit/app/ |
src/common/ | src/tests/unit/common/ |
src/modules/m{N}_xxx/ | src/tests/unit/m{N}_xxx/ |
test_{源文件名}.py(如 test_flow_stat_service.py)__init__.py"""
{module_name} 的单元测试
测试覆盖:
1. {Function1} — {简述}
2. {Function2} — {简述}
3. {Class1} — {简述}
"""
import pytest
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent.parent))
from src.modules.m{N}_xxx.{module} import (
{Import1},
{Import2},
)
关键:sys.path 的层级 = 测试文件到项目根的相对深度:
unit/ 下1层 → parent.parent.parent.parent.parent(5层).parentclass Test{FunctionName}:
"""{中文简述}"""
def test_{scenario}(self):
"""{中文描述}"""
# Arrange
...
# Act
result = ...
# Assert
assert result == expected
def _make_{dependency}(self, ...) -> MagicMock:
"""Build a mock {Dependency} for testing"""
mock = MagicMock(spec={DependencyClass})
mock.{method}.side_effect = lambda a, b: ...
return mock
Mock 注意事项:
side_effect = lambda a, b: ... 时确保参数签名与实际调用一致dict.get 不能直接作为 side_effect(参数语义不匹配),需包一层 lambda:
# WRONG: mock.shortest_path.side_effect = paths.get
# RIGHT:
mock.shortest_path.side_effect = lambda a, b: paths.get((a, b))
defaultdict(int) 不能用普通 {} 替代(+= 操作需要默认值)每个被测函数/方法必须覆盖:
| 层次 | 说明 | 示例 |
|---|---|---|
| 正常路径 | 典型输入的正确输出 | _truncate_to_hour("2026-03-15 14:30:00") → "2026-03-15 14:00:00" |
| 边界值 | 最小/最大/恰好 | 空字符串、None、长度边界、0、-1 |
| 异常输入 | 非法/缺失参数 | 无效时间格式、缺少字段 |
| 去重/幂等 | 重复输入的稳定性 | 同一 section 在同一小时去重 |
| 累积/聚合 | 多条记录的行为 | 不同记录的流量累加 |
测试方法和类的 docstring 使用中文,描述测试意图:
def test_same_section_same_hour_dedup(self):
"""同一section在同一小时内只算1次"""
_map_and_dedupe 等 pair dedup 逻辑有边界追加行为,断言关键值存在而非精确长度os.path.join 构造预期值,避免 Windows/Linux 差异# GOOD: 平台无关
expected = os.path.join("/tmp/data", "file.csv")
assert result == expected
# BAD: 硬编码分隔符
assert result == "/tmp/data/file.csv" # Windows 下失败
Repository 涉及数据库操作,统一 Mock:
class TestXxxRepository:
"""Xxx 数据访问层测试"""
def _make_repo(self) -> MagicMock:
repo = MagicMock(spec=XxxRepository)
repo.sql_runner = MagicMock()
repo.sql_runner.fetch_one.return_value = {"id": 1, ...}
repo.sql_runner.fetch_all.return_value = [...]
return repo
不直接连接数据库,所有 SQL 执行通过 Mock sql_runner。
Service 层重点测试业务逻辑编排:
class TestXxxService:
"""Xxx 业务编排层测试"""
def _make_service(self, **overrides) -> XxxService:
"""Build a service with mocked dependencies"""
service = XxxService()
service.repository = MagicMock()
# Override specific attributes
for key, value in overrides.items():
setattr(service, key, value)
return service
重点覆盖:
defaultdict 正确使用)Pydantic 模型测试重点:
class TestXxxParams:
"""参数模型测试"""
def test_defaults(self): ... # 默认值
def test_custom_values(self): ... # 自定义值
def test_model_dump(self): ... # 序列化
class TestXxxResult:
"""结果模型测试"""
def test_success_result(self): ... # 成功场景
def test_failed_result(self): ... # 失败场景
def test_defaults(self): ... # 默认值
从用户输入确定:
src/modules/m2_od_flow/flow_stat_service.py)根据目录映射关系确定测试路径:
src/modules/m{N}_xxx/{file}.pysrc/tests/unit/m{N}_xxx/test_{file}.py如果目录不存在,创建并添加 __init__.py。
逐函数分析,确定:
按照上述模板和规范生成测试代码。
cd /d/BaiduSyncdisk/shy_product/shanxi_resilience_enhancement
uv run pytest src/tests/unit/m{N}_xxx/ -v
常见失败原因及修复:
sys.path 层级错误 → 调整 .parent 数量side_effect 参数签名不匹配 → 包一层 lambdadefaultdict vs 普通 dict → 确保使用 defaultdict(int)os.path.join__init__.pysys.path.insert 层级正确spec= 约束接口uv run pytest 全部通过