|
| 1 | +--- |
| 2 | +job: unit-test-autogen |
| 3 | +intent: generate-unit-tests-from-diff |
| 4 | +version: v1 |
| 5 | +domain: testing |
| 6 | +runner: trae-solo |
| 7 | +parameters: |
| 8 | + sinceBranch: develop |
| 9 | + project: auto |
| 10 | + mode: full |
| 11 | + noSnapshot: false |
| 12 | + onlyNew: false |
| 13 | + reportFormat: md |
| 14 | + applyManualOverrides: true |
| 15 | + replaceAutogen: false |
| 16 | + dryRun: false |
| 17 | + preview: false |
| 18 | + stopOnError: true |
| 19 | + focusChangedOnly: true |
| 20 | + snapshotStrategy: combined |
| 21 | + tempReportPath: .trae/jobs/autotest.report.local.md |
| 22 | + mockDefaults: |
| 23 | + time: fixed(2020-01-01T00:00:00Z) |
| 24 | + random: seed(42) |
| 25 | +constraints: |
| 26 | + framework: jest-ts-jest |
| 27 | + layout: __tests__/*.test.ts |
| 28 | + comments: function-level-jsdoc |
| 29 | +outputs: |
| 30 | + - test_files |
| 31 | + - snapshots |
| 32 | + - coverage_report |
| 33 | + - manual_nodes |
| 34 | + - temp_markdown_report |
| 35 | +success_criteria: |
| 36 | + - tests_generated_for_changed_exports |
| 37 | + - compile_without_errors |
| 38 | + - coverage_increase_or_maintained |
| 39 | +manual_overrides: [] |
| 40 | +--- |
| 41 | + |
| 42 | +# Autotest Job(差异驱动单元测试自动生成) |
| 43 | + |
| 44 | +## 步骤 |
| 45 | + |
| 46 | +1. 差异采集 |
| 47 | + |
| 48 | +- 运行 `git fetch --all --prune` |
| 49 | +- 运行 `git diff --name-status --diff-filter=AMR {{sinceBranch}}...HEAD` |
| 50 | +- 对每个变更文件,运行 `git diff --unified=0 {{sinceBranch}}...HEAD <file>` 获取行级差异 |
| 51 | + |
| 52 | +2. 影响分析 |
| 53 | + |
| 54 | +- 识别导出符号、类型签名与逻辑分支;在包内搜索已有 `__tests__` 及缺口 |
| 55 | + |
| 56 | +3. 测试生成 |
| 57 | + |
| 58 | +- 在 `__tests__` 下创建或更新 `.test.ts` 文件;为每个 `describe/it` 添加函数级注释(JSDoc,说明目的、前置/输入、断言点) |
| 59 | +- 策略: |
| 60 | + - 纯函数/工具:正常/边界/异常分支 |
| 61 | + - 主题 JSON:`toMatchSnapshot()` + 关键字段断言(颜色、字体、间距) |
| 62 | + - 转换器:代表性输入,断言输出结构与关键键值;必要时增量快照 |
| 63 | +- Mock/Spy:固定时间与随机数;隔离外部依赖(网络/FS) |
| 64 | +- 自动化区块命名规则: |
| 65 | + - `describe('autogen:<pkg>/<module>:<export>:<hash>')` |
| 66 | + - `it('autogen:<case>:<hash>')` |
| 67 | + |
| 68 | +4. 放置与命名 |
| 69 | + |
| 70 | +- `src/foo.ts` → `__tests__/foo.test.ts`;若已有则增量插入新的自动化区块 |
| 71 | +- 导入路径优先使用公开 API(例如 `src/index.ts`) |
| 72 | + |
| 73 | +5. 执行与覆盖率 |
| 74 | + |
| 75 | +- 若指定 `project`:`rush run -p {{project}} -s test` 与 `test-cov` |
| 76 | +- 未指定则按变更包批量执行上述命令 |
| 77 | + |
| 78 | +6. 诊断与报告 |
| 79 | + |
| 80 | +- TypeScript 诊断:收集编译错误并在报告中标注阻断项 |
| 81 | +- 报告输出(`{{reportFormat}}`):列出变更文件 → 新增/更新测试 → 通过/失败 → 覆盖率增量 → 人工节点清单 |
| 82 | +- 临时报告写入:将本次执行结果以 Markdown 形式写入 `{{tempReportPath}}` |
| 83 | + |
| 84 | + - 必含内容: |
| 85 | + - 变更摘要(文件列表与关键行级片段定位) |
| 86 | + - 新增/更新测试用例与断言点说明 |
| 87 | + - 运行结果(套件/用例通过统计、覆盖率摘要、TS 诊断) |
| 88 | + - 重点一致性问题与潜在错误点(类型/注释一致性、契约风险、默认值依赖、测试桩稳定性) |
| 89 | + - 建议与后续动作(文档补充、契约确认、健壮性增强) |
| 90 | + - 示例结构: |
| 91 | + |
| 92 | + ```md |
| 93 | + # Autotest 临时报告 |
| 94 | + |
| 95 | + ## 变更摘要 |
| 96 | + |
| 97 | + ## 行级差异(关键片段) |
| 98 | + |
| 99 | + ## 新增/更新的测试 |
| 100 | + |
| 101 | + ## 运行结果 |
| 102 | + |
| 103 | + ## 一致性与潜在风险(重点) |
| 104 | + |
| 105 | + ## 建议与后续动作 |
| 106 | + ``` |
| 107 | + |
| 108 | +7. 人工节点与二次执行 |
| 109 | + |
| 110 | +- 初次生成时对不明确 Mock/快照的用例插入占位并标记:`it('autogen:MANUAL_REQUIRED:<reason>')` 与 `test.skip(...)` |
| 111 | +- 二次执行流程: |
| 112 | + - 在本文件 `manual_overrides` 段中添加结构化覆写策略(见下例)或直接编辑测试文件中的占位并移除 `skip` |
| 113 | + - 默认不覆盖人工命名块(不含 `autogen:` 前缀);仅增量生成缺失的自动化区块 |
| 114 | + - 若 `replaceAutogen=true`,允许替换已有 `autogen:` 区块 |
| 115 | + |
| 116 | +## manual_overrides 示例 |
| 117 | + |
| 118 | +```yaml |
| 119 | +manual_overrides: |
| 120 | + - target: packages/vchart-theme/src/foo.ts#exportedFn |
| 121 | + mocks: |
| 122 | + date: fixed(2020-01-01T00:00:00Z) |
| 123 | + random: seed(42) |
| 124 | + external: "jest.mock('@pkg/bar', () => ({ /* ... */ }))" |
| 125 | + inputs: |
| 126 | + - { args: [1, 2], desc: '正常路径' } |
| 127 | + - { args: [null], desc: '异常路径' } |
| 128 | + asserts: |
| 129 | + - { expect: 'toEqual', value: { ok: true } } |
| 130 | +``` |
| 131 | +
|
| 132 | +## 执行(Solo 模式) |
| 133 | +
|
| 134 | +- 最简用法(使用默认参数):在聊天中发起“执行 Autotest Job(.trae/jobs/autotest.md)”。 |
| 135 | +- 可选覆盖参数示例:`project=@visactor/vchart-theme`、`reportFormat=json`、`replaceAutogen=true`。 |
| 136 | +- 我将按上述步骤顺序执行,并返回报告与人工节点处理结果。 |
| 137 | +- 临时报告路径可通过 `tempReportPath` 覆盖,默认:`.trae/jobs/autotest.report.local.md`。 |
0 commit comments