docs: 补充测试模板实战教训章节(从AI生成按钮bug中总结)
新增第六章「实战教训」: - 「看见不等于测了」陷阱(B07案例分析) - 弹窗测试的「红按钮」规则 - 「测试时绕过=上线时爆炸」警示 - 自我检查Checklist(3个问题) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -204,7 +204,83 @@ Step 3: Healer 验证
|
||||
|
||||
---
|
||||
|
||||
## 六、常用通用方法
|
||||
## 六、实战教训 —— 从 AI 生成按钮 bug 中学到的
|
||||
|
||||
### 6.1 「看见不等于测了」—— 最常见的测试陷阱
|
||||
|
||||
**案例**:题库管理的 AI 生成弹窗测试(B07):
|
||||
|
||||
```typescript
|
||||
// ❌ 错误的写法:只检查了按钮可见就点取消了
|
||||
test('AI生成弹窗交互', async ({ page }) => {
|
||||
const genBtn = page.locator('button').filter({ hasText: /生成/ }).first();
|
||||
await expect(genBtn).toBeVisible({ timeout: 3000 }); // ← 看见了
|
||||
const cancelBtn = page.locator('button').filter({ hasText: /取消/ }).first();
|
||||
await cancelBtn.click(); // ← 没点生成直接关闭
|
||||
// 结果:没发现 knowledgeBaseContent 传了空字符串导致后端 400
|
||||
});
|
||||
```
|
||||
|
||||
**规则:每个「确认/提交/保存/生成」按钮必须至少被实际点击一次。**
|
||||
|
||||
### 6.2 弹窗/抽屉测试的「红按钮」规则
|
||||
|
||||
| 弹窗中的按钮 | 必须测? | 为什么 |
|
||||
|:------------|:--------:|--------|
|
||||
| **红按钮(提交/保存/生成/删除)** | **✅ 必须点** | 不点发现不了传参错误、校验失败、后端 500 |
|
||||
| 灰按钮(取消/关闭/X) | 可选 | 主要测 UI 渲染 |
|
||||
| 输入框/下拉 | ✅ 必须填 | 不填不知道表单绑定是否正确 |
|
||||
|
||||
### 6.3 「测试时绕过」= 「上线时爆炸」
|
||||
|
||||
我们当初故意绕过 AI 生成的点击,理由是「怕 AI 调用太慢」。结果是:
|
||||
|
||||
```
|
||||
测试绕过 → 前端传空字符串 → 后端 400 → 用户报错
|
||||
↑ 如果测试点了「生成」按钮,立即就能发现
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
- UI 测试只验证**弹窗打开 + 参数已填充 + 按钮可点击**(不等待 AI 返回)
|
||||
- API 测试单独覆盖**实际后端调用是否正确**(短 timeout)
|
||||
- 两者结合既不卡 UI 测试,又不遗漏后端验证
|
||||
|
||||
```typescript
|
||||
// ✅ 正确的做法:UI 测弹窗交互,API 测后端逻辑
|
||||
// UI 测试
|
||||
test('弹窗交互', async ({ page }) => {
|
||||
await aiBtn.click();
|
||||
await expect(genBtn).toBeVisible();
|
||||
// 验证内容已填充(不是空的)
|
||||
const countInput = page.locator('input[type="number"]');
|
||||
await expect(countInput).toBeVisible();
|
||||
// 点取消关闭,不等待 AI 返回
|
||||
await cancelBtn.click();
|
||||
});
|
||||
|
||||
// API 测试(单独)
|
||||
test('API 调用验证', async () => {
|
||||
const gen = await fetch(`/api/xxx/generate`, { body: JSON.stringify({ count: 1, content }) });
|
||||
expect(gen.status).toBe(201);
|
||||
});
|
||||
```
|
||||
|
||||
### 6.4 Checklist 自我检查
|
||||
|
||||
写完测试后问自己三个问题:
|
||||
|
||||
```
|
||||
□ 每个「提交/保存/生成/删除」按钮都被实际点击过吗?
|
||||
→ 不只是检查 visible/enabled,是真正调用了 click()
|
||||
□ 弹窗/抽屉关闭前,表单里的关键输入框都被填充验证过吗?
|
||||
→ 不只是打开看了一眼
|
||||
□ 被测试绕过的「太慢/太难测」路径,有没有 API 测试兜底?
|
||||
→ UI 跳过的地方,API 必须补上
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 七、常用通用方法
|
||||
|
||||
```typescript
|
||||
// 通用按钮点击
|
||||
|
||||
Reference in New Issue
Block a user