Skip to content

Commit 2ba684f

Browse files
committed
规则11截图策略定稿:每个蓝本模块第1个场景加1张screenshot,规则12改为按功能模块拆分
1 parent 9026e0d commit 2ba684f

8 files changed

Lines changed: 59 additions & 55 deletions

File tree

docs/blueprint-prompt-golden-rules.md

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -159,34 +159,25 @@
159159

160160
## 规则11:截图策略(省钱省时)
161161

162-
截图会消耗视觉大模型费用和测试时间,必须精确控制使用场景。
163-
164-
### 断言 vs 截图能力对比
165-
166-
| Bug类型 | 检测方式 | 需要截图? |
167-
|---------|---------|-----------|
168-
| 文本值错误(价格、状态) | `assert_text` | ❌ 不需要 |
169-
| 元素缺失/隐藏 | `assert_visible` | ❌ 不需要 |
170-
| 计算逻辑错误(优惠、运费) | `assert_text` | ❌ 不需要 |
171-
| **布局溢出**(文字超出容器) | 视觉检查 | ✅ 需要 |
172-
| **元素遮挡/重叠** | 视觉检查 | ✅ 需要 |
173-
| **样式错乱**(颜色、字号) | 视觉检查 | ✅ 需要 |
174-
| **响应式适配崩坏** | 视觉检查 | ✅ 需要 |
175-
| **图片加载失败** | 视觉检查 | ✅ 需要 |
176-
177-
### 截图使用规则
178-
179-
-**禁止**在每个场景末尾无脑加 `screenshot`
180-
- ✅ 只在以下3种场景使用:
181-
1. **断言失败时**:引擎自动截图留证,蓝本不用写
182-
2. **关键业务流程最终结果页**:如下单成功页,每个模块最多1张
183-
3. **专门的视觉测试场景**:布局溢出、遮挡、适配——这类Bug只有截图能发现
184-
185-
## 规则12:蓝本按功能拆分
186-
187-
- 项目超过3个页面时,必须按功能模块拆分为多个蓝本文件
188-
- 命名规范:`testpilot/<模块名>.testpilot.json`(如 `auth.testpilot.json``cart.testpilot.json`
189-
- 每个蓝本文件独立可运行,场景开头都要从 `navigate` 开始
162+
截图用于发现**视觉Bug**(布局溢出、元素遮挡、样式错乱、响应式崩坏、图片加载失败),断言无法检测这类问题。
163+
164+
### 截图规则
165+
166+
- **每个蓝本模块的第1个场景末尾加1张 `screenshot`**,其余场景不加
167+
- `auth.testpilot.json` 第1个场景末尾 → `screenshot`(覆盖登录页视觉)
168+
- `cart.testpilot.json` 第1个场景末尾 → `screenshot`(覆盖购物车视觉)
169+
- 同模块的第2、3、4…个场景 → 不加
170+
- 断言失败时引擎会自动截图留证,蓝本不用额外写
171+
-**禁止**每个场景末尾都加 `screenshot`(浪费视觉大模型费用和时间)
172+
173+
## 规则12:蓝本按功能模块拆分
174+
175+
-**业务功能模块**拆分蓝本,不要把所有场景塞进一个文件
176+
- 拆分原则:**一个功能模块 = 一个蓝本文件**,改了哪个功能就只跑哪个蓝本
177+
- 例:`auth`(登录注册)、`cart`(购物车)、`checkout`(结算支付)、`profile`(个人中心)
178+
- 跨页面的端到端流程归属到终点功能模块(如"加购→结算→下单"归入 `checkout`
179+
- 命名规范:`testpilot/<模块名>.testpilot.json`
180+
- 每个蓝本独立可运行,场景开头都要从 `navigate` 开始
190181
- 全量测试时通过 `run_blueprint_batch` 批量运行所有蓝本
191182

192183
## 规则13:蓝本增量修改(省Token)

extension/src/sidebarProvider.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -490,17 +490,21 @@ export class SidebarProvider implements vscode.WebviewViewProvider {
490490
- 如果没有文档,则从代码注释、变量命名、函数名中推断业务意图,对比实际行为是否一致
491491
492492
【规则11:截图策略(省钱省时)】
493-
- ❌ 禁止在每个场景末尾无脑加 screenshot,这会浪费视觉大模型费用和测试时间
494-
- ✅ 只在以下3种情况使用 screenshot:
495-
1. 断言失败时(引擎会自动截图留证,蓝本不用写)
496-
2. 关键业务流程的最终结果页(如下单成功页、支付结果页,每个模块最多1张)
497-
3. 专门的视觉测试场景:布局溢出、遮挡重叠、响应式适配、图片加载等——这类Bug只有截图能发现
498-
- 普通的文本断言、元素可见性断言场景,绝对不要加 screenshot
499-
500-
【规则12:蓝本按功能拆分】
501-
- 项目超过3个页面时,必须按功能模块拆分为多个蓝本文件
502-
- 命名规范:testpilot/ 目录下 <模块名>.testpilot.json(如 auth.testpilot.json、cart.testpilot.json)
503-
- 每个蓝本文件独立可运行,场景开头都要从 navigate 开始
493+
- 截图用于发现视觉Bug(布局溢出、元素遮挡、样式错乱、响应式崩坏),断言无法检测这类问题
494+
- 规则:每个蓝本模块的第1个场景末尾加1张 screenshot,其余场景不加
495+
* 例:auth.testpilot.json 的第1个场景末尾 → screenshot(覆盖登录页视觉)
496+
* 例:cart.testpilot.json 的第1个场景末尾 → screenshot(覆盖购物车视觉)
497+
* 同模块的第2、3、4…个场景 → 不加 screenshot
498+
- 断言失败时引擎会自动截图留证,蓝本不用额外写
499+
- ❌ 禁止每个场景末尾都加 screenshot(浪费视觉大模型费用和时间)
500+
501+
【规则12:蓝本按功能模块拆分】
502+
- 按业务功能模块拆分蓝本,不要把所有场景塞进一个文件
503+
- 拆分原则:一个功能模块 = 一个蓝本文件,改了哪个功能就只跑哪个蓝本
504+
* 例:auth(登录注册)、cart(购物车)、checkout(结算支付)、profile(个人中心)
505+
* 跨页面的端到端流程归属到终点功能模块(如"加购→结算→下单"归入 checkout)
506+
- 命名规范:testpilot/<模块名>.testpilot.json
507+
- 每个蓝本独立可运行,场景开头都要从 navigate 开始
504508
- 全量测试时通过 run_blueprint_batch 批量运行所有蓝本
505509
506510
【规则13:蓝本增量修改(省Token)】

mobile-demo/testpilot/auth.testpilot.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
{"action": "fill", "target": "#loginPass", "value": "123456"},
2727
{"action": "click", "target": "#loginBtn"},
2828
{"action": "assert_visible", "target": "#tabHome", "description": "验证跳转到首页"},
29-
{"action": "assert_visible", "target": ".product-card", "description": "验证商品列表显示"}
29+
{"action": "assert_visible", "target": ".product-card", "description": "验证商品列表显示"},
30+
{"action": "screenshot"}
3031
]
3132
},
3233
{

mobile-demo/testpilot/cart.testpilot.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
{"action": "click", "target": "#guestBtn"},
1717
{"action": "click", "target": "#navCart"},
1818
{"action": "assert_visible", "target": "#cartEmpty"},
19-
{"action": "assert_text", "target": ".empty-text", "expected": "购物车是空的"}
19+
{"action": "assert_text", "target": ".empty-text", "expected": "购物车是空的"},
20+
{"action": "screenshot"}
2021
]
2122
},
2223
{

mobile-demo/testpilot/checkout.testpilot.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
{"action": "assert_text", "target": "#checkoutDelivery", "expected": "¥8.00"},
2929
{"action": "click", "target": "#submitOrderBtn"},
3030
{"action": "assert_visible", "target": "#orderResultPage"},
31-
{"action": "assert_text", "target": "#resultTitle", "expected": "下单成功"}
31+
{"action": "assert_text", "target": "#resultTitle", "expected": "下单成功"},
32+
{"action": "screenshot"}
3233
]
3334
},
3435
{

mobile-demo/testpilot/home.testpilot.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
{"action": "assert_visible", "target": ".product-card"},
2828
{"action": "assert_text", "target": "#pname-1", "expected": "红富士苹果"},
2929
{"action": "assert_text", "target": "#pname-2", "expected": "进口香蕉"},
30-
{"action": "assert_text", "target": "#pstock-3", "expected": "已售罄"}
30+
{"action": "assert_text", "target": "#pstock-3", "expected": "已售罄"},
31+
{"action": "screenshot"}
3132
]
3233
},
3334
{

mobile-demo/testpilot/me.testpilot.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
{"action": "assert_text", "target": "#userName", "expected": "用户8000"},
2121
{"action": "assert_text", "target": "#userPhone", "expected": "13800138000"},
2222
{"action": "assert_text", "target": "#couponCount", "expected": "2"},
23-
{"action": "assert_visible", "target": "#logoutBtn"}
23+
{"action": "assert_visible", "target": "#logoutBtn"},
24+
{"action": "screenshot"}
2425
]
2526
},
2627
{

src/core/prompts.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -571,17 +571,21 @@
571571
- 如果没有文档,则从代码注释、变量命名、函数名中推断业务意图,对比实际行为是否一致
572572
573573
【规则11:截图策略(省钱省时)】
574-
- ❌ 禁止在每个场景末尾无脑加 screenshot,这会浪费视觉大模型费用和测试时间
575-
- ✅ 只在以下3种情况使用 screenshot:
576-
1. 断言失败时(引擎会自动截图留证,蓝本不用写)
577-
2. 关键业务流程的最终结果页(如下单成功页、支付结果页,每个模块最多1张)
578-
3. 专门的视觉测试场景:布局溢出、遮挡重叠、响应式适配、图片加载等——这类Bug只有截图能发现
579-
- 普通的文本断言、元素可见性断言场景,绝对不要加 screenshot
580-
581-
【规则12:蓝本按功能拆分】
582-
- 项目超过3个页面时,必须按功能模块拆分为多个蓝本文件
583-
- 命名规范:testpilot/ 目录下 <模块名>.testpilot.json(如 auth.testpilot.json、cart.testpilot.json)
584-
- 每个蓝本文件独立可运行,场景开头都要从 navigate 开始
574+
- 截图用于发现视觉Bug(布局溢出、元素遮挡、样式错乱、响应式崩坏),断言无法检测这类问题
575+
- 规则:每个蓝本模块的第1个场景末尾加1张 screenshot,其余场景不加
576+
* 例:auth.testpilot.json 的第1个场景末尾 → screenshot(覆盖登录页视觉)
577+
* 例:cart.testpilot.json 的第1个场景末尾 → screenshot(覆盖购物车视觉)
578+
* 同模块的第2、3、4…个场景 → 不加 screenshot
579+
- 断言失败时引擎会自动截图留证,蓝本不用额外写
580+
- ❌ 禁止每个场景末尾都加 screenshot(浪费视觉大模型费用和时间)
581+
582+
【规则12:蓝本按功能模块拆分】
583+
- 按业务功能模块拆分蓝本,不要把所有场景塞进一个文件
584+
- 拆分原则:一个功能模块 = 一个蓝本文件,改了哪个功能就只跑哪个蓝本
585+
* 例:auth(登录注册)、cart(购物车)、checkout(结算支付)、profile(个人中心)
586+
* 跨页面的端到端流程归属到终点功能模块(如"加购→结算→下单"归入 checkout)
587+
- 命名规范:testpilot/<模块名>.testpilot.json
588+
- 每个蓝本独立可运行,场景开头都要从 navigate 开始
585589
- 全量测试时通过 run_blueprint_batch 批量运行所有蓝本
586590
587591
【规则13:蓝本增量修改(省Token)】

0 commit comments

Comments
 (0)