diff --git a/docs/superpowers/plans/2026-04-07-e2e-test-simplification.md b/docs/superpowers/plans/2026-04-07-e2e-test-simplification.md new file mode 100644 index 0000000..2df29f1 --- /dev/null +++ b/docs/superpowers/plans/2026-04-07-e2e-test-simplification.md @@ -0,0 +1,363 @@ +# E2E测试精简实现计划 + +> **面向 AI 代理的工作者:** 必需子技能:使用 superpowers:subagent-driven-development(推荐)或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(`- [ ]`)语法来跟踪进度。 + +**目标:** 将E2E测试从38个文件精简为5个核心测试文件,保留关键业务流程验证 + +**架构:** 采用分层测试策略,保留核心用户旅程测试和冒烟测试,删除非核心测试文件 + +**技术栈:** Playwright, TypeScript + +--- + +## 文件结构 + +**创建文件:** +- `novalon-manage-web/e2e/smoke/login-logout.spec.ts` - 冒烟测试 + +**删除文件:** +- 34个非核心测试文件(详见设计文档第8节) + +**修改文件:** +- `novalon-manage-web/package.json` - 更新测试脚本 + +--- + +## 任务 1:创建冒烟测试目录和文件 + +**文件:** +- 创建:`novalon-manage-web/e2e/smoke/login-logout.spec.ts` + +- [ ] **步骤 1:创建smoke目录** + +运行:`mkdir -p novalon-manage-web/e2e/smoke` + +- [ ] **步骤 2:编写冒烟测试代码** + +```typescript +import { test, expect } from '@playwright/test'; + +test.describe('冒烟测试 - 基础流程', () => { + test('管理员登录和登出', async ({ page }) => { + await test.step('导航到登录页面', async () => { + await page.goto('/login'); + await page.waitForLoadState('networkidle'); + }); + + await test.step('输入登录信息', async () => { + await page.fill('input[type="text"]', 'admin'); + await page.fill('input[type="password"]', 'Test@123'); + }); + + await test.step('点击登录按钮', async () => { + await page.click('button:has-text("登录")'); + await page.waitForURL(/.*dashboard/, { timeout: 10000 }); + }); + + await test.step('验证登录成功', async () => { + await expect(page).toHaveURL(/.*dashboard/); + }); + + await test.step('点击用户菜单', async () => { + await page.click('[data-testid="user-menu"]'); + await page.waitForTimeout(500); + }); + + await test.step('点击退出登录', async () => { + await page.click('text=退出登录'); + await page.waitForURL(/.*login/, { timeout: 10000 }); + }); + + await test.step('验证登出成功', async () => { + await expect(page).toHaveURL(/.*login/); + }); + }); +}); +``` + +- [ ] **步骤 3:Commit** + +```bash +git add novalon-manage-web/e2e/smoke/login-logout.spec.ts +git commit -m "test: 添加冒烟测试 - 登录登出基础流程" +``` + +--- + +## 任务 2:删除根目录下的非核心测试文件 + +**文件:** +- 删除:`novalon-manage-web/e2e/auth.spec.ts` +- 删除:`novalon-manage-web/e2e/basic.spec.ts` +- 删除:`novalon-manage-web/e2e/complete-workflow.spec.ts` +- 删除:`novalon-manage-web/e2e/comprehensive-e2e.spec.ts` +- 删除:`novalon-manage-web/e2e/critical-e2e.spec.ts` +- 删除:`novalon-manage-web/e2e/dashboard-operation-log.spec.ts` +- 删除:`novalon-manage-web/e2e/dictionary-management.spec.ts` +- 删除:`novalon-manage-web/e2e/edge-cases.spec.ts` +- 删除:`novalon-manage-web/e2e/exception-log.spec.ts` +- 删除:`novalon-manage-web/e2e/file-management.spec.ts` +- 删除:`novalon-manage-web/e2e/form-test.spec.ts` +- 删除:`novalon-manage-web/e2e/login-log.spec.ts` +- 删除:`novalon-manage-web/e2e/menu-management.spec.ts` +- 删除:`novalon-manage-web/e2e/notification.spec.ts` +- 删除:`novalon-manage-web/e2e/operation-log.spec.ts` +- 删除:`novalon-manage-web/e2e/permission-validation.spec.ts` +- 删除:`novalon-manage-web/e2e/role-management.spec.ts` +- 删除:`novalon-manage-web/e2e/security-e2e.spec.ts` +- 删除:`novalon-manage-web/e2e/system-config.spec.ts` +- 删除:`novalon-manage-web/e2e/system-integration-test.spec.ts` +- 删除:`novalon-manage-web/e2e/test-config-api.spec.ts` +- 删除:`novalon-manage-web/e2e/test-stability.spec.ts` +- 删除:`novalon-manage-web/e2e/uat-file-workflow.spec.ts` +- 删除:`novalon-manage-web/e2e/uat-permission-workflow.spec.ts` +- 删除:`novalon-manage-web/e2e/uat-user-lifecycle.spec.ts` +- 删除:`novalon-manage-web/e2e/user-lifecycle.spec.ts` +- 删除:`novalon-manage-web/e2e/user-management.spec.ts` + +- [ ] **步骤 1:删除根目录下的测试文件** + +```bash +cd novalon-manage-web/e2e +rm -f auth.spec.ts basic.spec.ts complete-workflow.spec.ts comprehensive-e2e.spec.ts critical-e2e.spec.ts dashboard-operation-log.spec.ts dictionary-management.spec.ts edge-cases.spec.ts exception-log.spec.ts file-management.spec.ts form-test.spec.ts login-log.spec.ts menu-management.spec.ts notification.spec.ts operation-log.spec.ts permission-validation.spec.ts role-management.spec.ts security-e2e.spec.ts system-config.spec.ts system-integration-test.spec.ts test-config-api.spec.ts test-stability.spec.ts uat-file-workflow.spec.ts uat-permission-workflow.spec.ts uat-user-lifecycle.spec.ts user-lifecycle.spec.ts user-management.spec.ts +``` + +- [ ] **步骤 2:Commit** + +```bash +git add -A +git commit -m "test: 删除根目录下的非核心E2E测试文件" +``` + +--- + +## 任务 3:删除role-based-tests目录 + +**文件:** +- 删除:`novalon-manage-web/e2e/role-based-tests/` 整个目录 + +- [ ] **步骤 1:删除role-based-tests目录** + +```bash +rm -rf novalon-manage-web/e2e/role-based-tests +``` + +- [ ] **步骤 2:Commit** + +```bash +git add -A +git commit -m "test: 删除role-based-tests目录" +``` + +--- + +## 任务 4:删除journeys目录下的重复测试文件 + +**文件:** +- 删除:`novalon-manage-web/e2e/journeys/system-config-workflow.spec.ts` +- 删除:`novalon-manage-web/e2e/journeys/permission-boundary.spec.ts` + +- [ ] **步骤 1:删除重复的测试文件** + +```bash +rm -f novalon-manage-web/e2e/journeys/system-config-workflow.spec.ts +rm -f novalon-manage-web/e2e/journeys/permission-boundary.spec.ts +``` + +- [ ] **步骤 2:Commit** + +```bash +git add -A +git commit -m "test: 删除journeys目录下的重复测试文件" +``` + +--- + +## 任务 5:更新package.json测试脚本 + +**文件:** +- 修改:`novalon-manage-web/package.json` + +- [ ] **步骤 1:查看当前测试脚本** + +运行:`cat novalon-manage-web/package.json | grep -A 10 '"scripts"'` + +- [ ] **步骤 2:更新测试脚本** + +在 `package.json` 的 `scripts` 部分添加或更新以下内容: + +```json +{ + "scripts": { + "test:e2e:smoke": "playwright test smoke/", + "test:e2e:journeys": "playwright test journeys/", + "test:e2e": "playwright test" + } +} +``` + +- [ ] **步骤 3:验证脚本更新** + +运行:`cat novalon-manage-web/package.json | grep -A 5 '"test:e2e'` + +- [ ] **步骤 4:Commit** + +```bash +git add novalon-manage-web/package.json +git commit -m "test: 更新E2E测试脚本,支持分层运行" +``` + +--- + +## 任务 6:验证测试运行 + +**文件:** +- 无文件变更 + +- [ ] **步骤 1:验证冒烟测试** + +运行:`cd novalon-manage-web && npm run test:e2e:smoke` + +预期:测试运行成功,1个测试通过 + +- [ ] **步骤 2:验证核心旅程测试** + +运行:`cd novalon-manage-web && npm run test:e2e:journeys` + +预期:测试运行成功,4个测试文件通过 + +- [ ] **步骤 3:验证所有测试** + +运行:`cd novalon-manage-web && npm run test:e2e` + +预期:测试运行成功,5个测试文件通过 + +--- + +## 任务 7:更新测试文档 + +**文件:** +- 创建:`novalon-manage-web/e2e/README.md` + +- [ ] **步骤 1:编写测试文档** + +```markdown +# E2E测试说明 + +## 测试结构 + +本项目的E2E测试采用分层测试策略: + +### 冒烟测试(smoke/) + +快速验证基础功能是否正常工作。 + +- `login-logout.spec.ts` - 登录登出基础流程 + +### 核心旅程测试(journeys/) + +验证关键业务端到端流程。 + +- `admin-complete-workflow.spec.ts` - 管理员完整工作流 +- `user-permission-boundary.spec.ts` - 用户权限边界验证 +- `file-management-workflow.spec.ts` - 文件上传下载流程 +- `audit-workflow.spec.ts` - 审计日志查看流程 + +## 运行测试 + +### 运行冒烟测试 + +```bash +npm run test:e2e:smoke +``` + +### 运行核心旅程测试 + +```bash +npm run test:e2e:journeys +``` + +### 运行所有测试 + +```bash +npm run test:e2e +``` + +## 测试数据 + +测试使用的用户账号: + +- 管理员:username: `admin`, password: `Test@123` +- 普通用户:username: `user`, password: `Test@123` + +## 测试策略 + +- **冒烟测试**:每次代码提交时运行,快速反馈 +- **核心旅程测试**:PR合并前运行,验证关键业务流程 +- **单元测试**:补充功能覆盖率,目标80% + +## 维护指南 + +1. 新增核心业务功能时,在 `journeys/` 目录下添加测试 +2. 新增基础功能时,在 `smoke/` 目录下添加测试 +3. 保持测试文件数量精简,避免重复测试 +4. 优先使用单元测试覆盖功能细节 +``` + +- [ ] **步骤 2:Commit** + +```bash +git add novalon-manage-web/e2e/README.md +git commit -m "docs: 添加E2E测试说明文档" +``` + +--- + +## 任务 8:最终验证和清理 + +**文件:** +- 无文件变更 + +- [ ] **步骤 1:统计测试文件数量** + +运行:`find novalon-manage-web/e2e -name "*.spec.ts" -type f | wc -l` + +预期:输出 `5` + +- [ ] **步骤 2:列出所有测试文件** + +运行:`find novalon-manage-web/e2e -name "*.spec.ts" -type f` + +预期输出: +``` +novalon-manage-web/e2e/smoke/login-logout.spec.ts +novalon-manage-web/e2e/journeys/admin-complete-workflow.spec.ts +novalon-manage-web/e2e/journeys/user-permission-boundary.spec.ts +novalon-manage-web/e2e/journeys/file-management-workflow.spec.ts +novalon-manage-web/e2e/journeys/audit-workflow.spec.ts +``` + +- [ ] **步骤 3:运行完整测试套件** + +运行:`cd novalon-manage-web && npm run test:e2e` + +预期:所有测试通过 + +- [ ] **步骤 4:最终Commit** + +```bash +git add -A +git commit -m "test: 完成E2E测试精简,从38个文件减少到5个" +``` + +--- + +## 预期成果 + +完成本计划后,将实现以下成果: + +1. **测试文件数量**:从38个减少到5个(减少87%) +2. **测试运行时间**:从~20分钟减少到~5分钟(减少75%) +3. **测试结构清晰**:冒烟测试 + 核心旅程测试 +4. **维护成本降低**:测试文件数量少,易于维护 +5. **测试稳定性提升**:减少flaky测试