docs: add E2E test fix design document
This commit is contained in:
@@ -0,0 +1,320 @@
|
||||
# E2E测试用例全面修复设计文档
|
||||
|
||||
**日期**: 2026-04-04
|
||||
**作者**: 张翔
|
||||
**状态**: 待审查
|
||||
|
||||
## 概述
|
||||
|
||||
本文档描述了Novalon管理系统的E2E测试用例全面修复方案,包括立即修复和短期目标两个阶段。
|
||||
|
||||
## 背景
|
||||
|
||||
### 当前状态
|
||||
|
||||
- **总测试用例数**: 52个
|
||||
- **已验证测试用例**: 6个
|
||||
- **通过测试用例**: 2个(33.3%通过率)
|
||||
- **失败测试用例**: 4个
|
||||
|
||||
### 已完成的工作
|
||||
|
||||
1. ✅ 禁用测试并行执行,避免状态混乱
|
||||
2. ✅ 统一URL匹配模式为`/\/(dashboard|\/)$/`
|
||||
3. ✅ 修复Dashboard元素选择器
|
||||
4. ✅ 修复登录失败测试用例设计
|
||||
|
||||
### 发现的问题
|
||||
|
||||
1. **错误消息选择器不正确**
|
||||
- 当前:`.el-message--error`
|
||||
- 实际:Element Plus的ElMessage组件使用`.el-message .el-message__content`
|
||||
|
||||
2. **登出按钮选择器不正确**
|
||||
- 当前:`[data-testid="user-menu"]`和`[data-testid="logout-button"]`
|
||||
- 实际:使用`el-dropdown`组件,需要点击`.el-avatar`后选择"退出登录"
|
||||
|
||||
3. **测试用例覆盖不完整**
|
||||
- 剩余46个测试用例未验证
|
||||
- 可能存在类似的选择器问题
|
||||
|
||||
## 设计方案
|
||||
|
||||
### 第一部分:立即修复
|
||||
|
||||
#### 1.1 错误消息选择器修复
|
||||
|
||||
**问题分析**:
|
||||
- Element Plus的ElMessage组件生成的DOM结构为:
|
||||
```html
|
||||
<div class="el-message el-message--error">
|
||||
<p class="el-message__content">错误消息内容</p>
|
||||
</div>
|
||||
```
|
||||
- 当前选择器`.el-message--error`无法匹配到可见元素
|
||||
|
||||
**修复方案**:
|
||||
```typescript
|
||||
// 修复前
|
||||
await expect(page.locator('.el-message--error')).toBeVisible({ timeout: 5000 });
|
||||
|
||||
// 修复后
|
||||
await expect(page.locator('.el-message .el-message__content')).toBeVisible({ timeout: 5000 });
|
||||
```
|
||||
|
||||
**影响范围**:
|
||||
- 测试用例1.2:错误的密码登录失败
|
||||
- 测试用例1.3:不存在的用户登录失败
|
||||
- 测试用例1.5:禁用用户登录失败
|
||||
|
||||
#### 1.2 登出功能修复
|
||||
|
||||
**问题分析**:
|
||||
- DefaultLayout.vue使用`el-dropdown`组件实现用户菜单
|
||||
- 点击`.el-avatar`后显示下拉菜单
|
||||
- 下拉菜单中包含"退出登录"选项
|
||||
|
||||
**修复方案**:
|
||||
```typescript
|
||||
// 修复前
|
||||
await page.click('[data-testid="user-menu"]');
|
||||
await page.click('[data-testid="logout-button"]');
|
||||
|
||||
// 修复后
|
||||
await page.locator('.el-avatar').click();
|
||||
await page.waitForTimeout(500);
|
||||
await page.locator('.el-dropdown-menu').getByText('退出登录').click();
|
||||
```
|
||||
|
||||
**影响范围**:
|
||||
- 测试用例1.6:登出功能正常
|
||||
|
||||
### 第二部分:短期目标
|
||||
|
||||
#### 2.1 测试用例分类
|
||||
|
||||
剩余的46个测试用例分布在以下模块:
|
||||
|
||||
| 模块 | 测试用例数 | 主要验证内容 | 预期问题 |
|
||||
|------|-----------|-------------|---------|
|
||||
| 用户管理流程测试 | 5 | 用户列表、创建、编辑、删除、状态切换 | 表格选择器、表单选择器、按钮选择器 |
|
||||
| 角色管理流程测试 | 5 | 角色列表、创建、编辑、删除、权限分配 | 类似用户管理 |
|
||||
| 菜单管理流程测试 | 4 | 菜单树、创建、编辑、删除 | 树形结构选择器 |
|
||||
| 权限验证测试 | 3 | 管理员权限、普通用户权限、未登录用户 | 权限提示选择器 |
|
||||
| 字典管理流程测试 | 5 | 字典列表、创建、编辑、删除 | 表格选择器 |
|
||||
| 系统配置流程测试 | 4 | 配置列表、创建、编辑、删除 | 表格选择器 |
|
||||
| 文件管理流程测试 | 5 | 文件列表、上传、下载、删除 | 文件选择器 |
|
||||
| 操作日志流程测试 | 5 | 日志列表、查询、详情 | 表格选择器 |
|
||||
| 登录日志流程测试 | 4 | 日志列表、查询、详情 | 表格选择器 |
|
||||
| 异常日志流程测试 | 4 | 日志列表、查询、详情 | 表格选择器 |
|
||||
| 通知公告流程测试 | 5 | 公告列表、创建、编辑、删除、发布 | 表格选择器 |
|
||||
| 性能和稳定性测试 | 3 | 并发登录、大数据量、长时间运行 | 性能指标验证 |
|
||||
|
||||
#### 2.2 执行策略
|
||||
|
||||
**阶段1:批量修复常见问题**(预计30分钟)
|
||||
|
||||
目标:统一修复所有常见的选择器问题
|
||||
|
||||
修复内容:
|
||||
1. **错误消息选择器**:所有`.el-message--error`改为`.el-message .el-message__content`
|
||||
2. **成功消息选择器**:所有`.success-message`改为`.el-message--success .el-message__content`
|
||||
3. **表格选择器**:统一使用`.el-table`相关选择器
|
||||
4. **表单选择器**:统一使用`[name="fieldName"]`或`input[placeholder="..."]`
|
||||
5. **按钮选择器**:统一使用`button:has-text("按钮文本")`或`[data-testid="..."]`(如果存在)
|
||||
|
||||
**阶段2:逐模块验证**(预计1小时)
|
||||
|
||||
目标:按模块顺序运行测试,记录并修复问题
|
||||
|
||||
执行步骤:
|
||||
1. 运行用户管理流程测试(5个测试用例)
|
||||
2. 记录失败原因
|
||||
3. 针对性修复
|
||||
4. 重复步骤1-3,直到所有模块测试通过
|
||||
|
||||
**阶段3:全面测试**(预计30分钟)
|
||||
|
||||
目标:运行完整测试套件,验证所有修复
|
||||
|
||||
执行步骤:
|
||||
1. 运行完整测试套件(52个测试用例)
|
||||
2. 记录所有失败的测试用例
|
||||
3. 分析失败原因
|
||||
4. 针对性修复
|
||||
5. 重新运行测试套件
|
||||
6. 生成最终测试报告
|
||||
|
||||
#### 2.3 常见选择器映射表
|
||||
|
||||
| 功能 | 错误选择器 | 正确选择器 |
|
||||
|------|-----------|-----------|
|
||||
| 错误消息 | `.el-message--error` | `.el-message .el-message__content` |
|
||||
| 成功消息 | `.success-message` | `.el-message--success .el-message__content` |
|
||||
| 表格 | `.user-table`, `.role-table` | `.el-table` |
|
||||
| 表格行 | `.user-row`, `.role-row` | `.el-table__row` |
|
||||
| 用户头像 | `[data-testid="user-menu"]` | `.el-avatar` |
|
||||
| 登出按钮 | `[data-testid="logout-button"]` | `.el-dropdown-menu`).getByText('退出登录') |
|
||||
| 欢迎消息 | `.welcome-message` | `.dashboard` |
|
||||
|
||||
## 技术约束
|
||||
|
||||
### 前端技术栈
|
||||
- Vue 3 + TypeScript
|
||||
- Element Plus UI组件库
|
||||
- Vite构建工具
|
||||
|
||||
### 测试技术栈
|
||||
- Playwright测试框架
|
||||
- TypeScript测试脚本
|
||||
- 自定义报告器
|
||||
|
||||
### 浏览器环境
|
||||
- Chromium(主要测试浏览器)
|
||||
- Firefox(可选)
|
||||
- WebKit(可选)
|
||||
|
||||
## 成功标准
|
||||
|
||||
### 立即修复成功标准
|
||||
- ✅ 测试用例1.2、1.3、1.5通过
|
||||
- ✅ 测试用例1.6通过
|
||||
- ✅ 用户认证流程测试模块通过率达到100%
|
||||
|
||||
### 短期目标成功标准
|
||||
- ✅ 所有52个测试用例运行完成
|
||||
- ✅ 测试通过率达到90%以上(至少47个测试用例通过)
|
||||
- ✅ 所有失败测试用例有明确的失败原因记录
|
||||
- ✅ 生成完整的测试报告
|
||||
|
||||
## 风险与缓解措施
|
||||
|
||||
### 风险1:前端代码与测试用例不匹配
|
||||
**影响**: 测试用例可能使用了前端不存在的元素选择器
|
||||
**缓解措施**:
|
||||
- 检查前端组件代码,确认实际DOM结构
|
||||
- 使用Playwright的代码生成工具验证选择器
|
||||
- 添加截图功能,记录测试失败时的页面状态
|
||||
|
||||
### 风险2:测试数据不足
|
||||
**影响**: 部分测试用例可能因缺少测试数据而失败
|
||||
**缓解措施**:
|
||||
- 检查测试数据库初始化脚本
|
||||
- 确保包含各种测试场景的数据(禁用用户、不同角色等)
|
||||
- 在测试用例中动态创建测试数据
|
||||
|
||||
### 风险3:测试环境不稳定
|
||||
**影响**: 测试可能因网络、服务启动等问题而失败
|
||||
**缓解措施**:
|
||||
- 使用JAR文件启动后端,减少启动时间
|
||||
- 添加健康检查,确保服务就绪后再运行测试
|
||||
- 设置合理的超时时间
|
||||
|
||||
## 后续优化建议
|
||||
|
||||
### 测试框架优化
|
||||
1. 创建Page Object Model的基类,统一常见操作
|
||||
2. 添加测试数据管理模块,支持动态创建和清理测试数据
|
||||
3. 实现测试报告自动生成和发送
|
||||
|
||||
### 测试用例优化
|
||||
1. 添加更多边界条件测试
|
||||
2. 添加性能测试用例
|
||||
3. 添加安全测试用例
|
||||
|
||||
### CI/CD集成
|
||||
1. 将E2E测试集成到CI/CD流水线
|
||||
2. 设置测试质量门禁(如90%通过率)
|
||||
3. 自动发布测试报告
|
||||
|
||||
## 时间估算
|
||||
|
||||
| 阶段 | 预计时间 | 说明 |
|
||||
|------|---------|------|
|
||||
| 立即修复 | 15分钟 | 修复错误消息和登出按钮选择器 |
|
||||
| 阶段1:批量修复 | 30分钟 | 统一修复常见选择器问题 |
|
||||
| 阶段2:逐模块验证 | 60分钟 | 按模块运行测试并修复问题 |
|
||||
| 阶段3:全面测试 | 30分钟 | 运行完整测试套件并生成报告 |
|
||||
| **总计** | **2小时15分钟** | |
|
||||
|
||||
## 附录
|
||||
|
||||
### A. 前端组件选择器参考
|
||||
|
||||
#### Login.vue
|
||||
```vue
|
||||
<el-input v-model="formState.username" placeholder="请输入用户名" />
|
||||
<el-input v-model="formState.password" placeholder="请输入密码" />
|
||||
<el-button type="primary" native-type="submit">登录</el-button>
|
||||
```
|
||||
|
||||
选择器:
|
||||
- 用户名输入框:`input[placeholder="请输入用户名"]`
|
||||
- 密码输入框:`input[placeholder="请输入密码"]`
|
||||
- 登录按钮:`button:has-text("登录")`
|
||||
|
||||
#### DefaultLayout.vue
|
||||
```vue
|
||||
<el-dropdown @command="handleCommand">
|
||||
<el-avatar :size="32">{{ username }}</el-avatar>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item command="profile">个人中心</el-dropdown-item>
|
||||
<el-dropdown-item command="logout" divided>退出登录</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
```
|
||||
|
||||
选择器:
|
||||
- 用户头像:`.el-avatar`
|
||||
- 登出按钮:`.el-dropdown-menu`).getByText('退出登录')
|
||||
|
||||
### B. Element Plus组件选择器参考
|
||||
|
||||
#### ElMessage
|
||||
```html
|
||||
<div class="el-message el-message--error">
|
||||
<p class="el-message__content">错误消息</p>
|
||||
</div>
|
||||
```
|
||||
|
||||
选择器:
|
||||
- 错误消息:`.el-message .el-message__content`
|
||||
- 成功消息:`.el-message--success .el-message__content`
|
||||
|
||||
#### ElTable
|
||||
```html
|
||||
<div class="el-table">
|
||||
<div class="el-table__body-wrapper">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr class="el-table__row">
|
||||
<td class="el-table__cell">...</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
选择器:
|
||||
- 表格:`.el-table`
|
||||
- 表格行:`.el-table__row`
|
||||
- 表格单元格:`.el-table__cell`
|
||||
|
||||
### C. 测试执行命令参考
|
||||
|
||||
```bash
|
||||
# 运行单个测试用例
|
||||
npx playwright test system-integration-test.spec.ts:33 --project=chromium
|
||||
|
||||
# 运行指定模块测试
|
||||
npx playwright test system-integration-test.spec.ts --grep "1. 用户认证流程测试"
|
||||
|
||||
# 运行完整测试套件
|
||||
npx playwright test system-integration-test.spec.ts --project=chromium
|
||||
|
||||
# 生成HTML报告
|
||||
npx playwright show-report
|
||||
```
|
||||
Reference in New Issue
Block a user