fix(ai): 强化拆解切片和测试粒度
This commit is contained in:
@@ -480,6 +480,32 @@ describe('AiService', () => {
|
||||
expect(testCaseRequired).not.toContain('estimateHours');
|
||||
});
|
||||
|
||||
it('requires structured descriptions for dev task and test case drafts', () => {
|
||||
const devRequired = (DECOMPOSE_TOOL_INPUT_SCHEMA.properties.devTaskDrafts as any).items.required;
|
||||
const testCaseRequired = (DECOMPOSE_TOOL_INPUT_SCHEMA.properties.testCaseDrafts as any).items.required;
|
||||
|
||||
expect(devRequired).toContain('description');
|
||||
expect(testCaseRequired).toContain('description');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('实现范围');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('验收点');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('前置条件');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('操作步骤');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('预期结果');
|
||||
});
|
||||
|
||||
it('tells the model to build deliverable slices before drafting tasks and tests', () => {
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('交付切片');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('UI/交互/接口/数据/异常/边界/状态流转/兼容/回归');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('每条业务规则');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('至少映射到 1 条开发任务或 1 条测试用例');
|
||||
});
|
||||
|
||||
it('forbids classifying clear prototype notes as ambiguous', () => {
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('包含标题、详细说明、字段、异常或验收标准之一');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('不得进入 ambiguous');
|
||||
expect(DECOMPOSE_SYSTEM_PROMPT).toContain('QY0005/QY0019/QY0020');
|
||||
});
|
||||
|
||||
it('passes decomposition target into the model prompt', async () => {
|
||||
const callTool = jest.fn().mockResolvedValue({
|
||||
toolName: 'submit_decompose',
|
||||
|
||||
@@ -12,6 +12,13 @@ export const DECOMPOSE_SYSTEM_PROMPT = `你是 FTB 项目管理系统的产品
|
||||
输入:原型 HTML/文档内容 + 关联需求列表 + 版本成员清单
|
||||
输出:开发任务草案 + 测试用例草案 + 对账报告
|
||||
|
||||
【拆解工作法】
|
||||
- 先在内部把每条 QY 或命中的需求拆成"交付切片",再生成 DevTask/TestCase;交付切片不要输出到工具结果中
|
||||
- 交付切片维度固定按 UI/交互/接口/数据/异常/边界/状态流转/兼容/回归 扫描
|
||||
- 每条业务规则、字段规则、交互规则、异常规则和验收标准都必须至少映射到 1 条开发任务或 1 条测试用例;本次 target 不包含的一侧可以不输出,但另一侧必须覆盖
|
||||
- 若某条规则只能测试不能开发,输出测试用例即可;若某条规则只涉及实现不涉及可独立验证场景,输出开发任务即可
|
||||
- 不允许用一个大标题覆盖多个交付切片;宁可多条小草案,也不要一条含糊大草案
|
||||
|
||||
【硬规则】
|
||||
|
||||
1. 引用必须真实
|
||||
@@ -26,6 +33,8 @@ export const DECOMPOSE_SYSTEM_PROMPT = `你是 FTB 项目管理系统的产品
|
||||
- 没有 QY 编号但文本已命中需求编号或需求概述时,不要因为缺少 QY 就丢弃;可只引用 requirement,并在 matched.noteIds 返回空数组
|
||||
- 既匹配不到需求编号,也匹配不到需求概述语义,但能形成明确功能名称和任务/用例范围的原型批注,必须进入 prototypeOnly 无需求ID分组并继续拆解
|
||||
- 只有无法形成稳定任务/用例的含糊批注才进入 ambiguous
|
||||
- 原型批注包含标题、详细说明、字段、异常或验收标准之一,且能判断用户动作或系统行为时,不得进入 ambiguous;QY0005/QY0019/QY0020 这类有详细说明、字段和验收标准的批注必须拆解
|
||||
- ambiguous 只能用于缺少动作、对象、结果或无法判断改动方向的批注,例如只圈出字段但没有任何说明
|
||||
|
||||
3. 任务来源限定
|
||||
- 只为以下情况拆任务:
|
||||
@@ -43,6 +52,8 @@ export const DECOMPOSE_SYSTEM_PROMPT = `你是 FTB 项目管理系统的产品
|
||||
- 测试用例粒度要和开发任务一样细:每个明确功能点、UI 交互、表单校验、接口、数据保存、权限、状态流转、异常、边界、兼容性或回归点都应拆成独立 TestCase
|
||||
- 不要用一条"验证 XX 完整流程"覆盖多个交互或多个规则
|
||||
- 一条 QY 若同时涉及 UI、接口、数据、异常和状态变化,通常应拆出 3-8 个 TestCase
|
||||
- 开发任务 description 必须写成结构化短文本,至少包含:实现范围、验收点;如有非目标范围或依赖也要说明
|
||||
- 测试用例 description 必须写成结构化短文本,至少包含:前置条件、操作步骤、预期结果;涉及边界/异常/数据时要写明测试数据或状态
|
||||
|
||||
5. 任务类型
|
||||
- 每条开发任务和测试用例都必须输出 categoryCode
|
||||
@@ -186,7 +197,7 @@ export const DECOMPOSE_TOOL_INPUT_SCHEMA = {
|
||||
minItems: 1,
|
||||
},
|
||||
},
|
||||
required: ['title', 'categoryCode', 'priority', 'aiEstimateHours', 'references'],
|
||||
required: ['title', 'description', 'categoryCode', 'priority', 'aiEstimateHours', 'references'],
|
||||
},
|
||||
},
|
||||
testCaseDrafts: {
|
||||
|
||||
Reference in New Issue
Block a user