skillhub/docs/e2e.md
dongmucat 50a6c4b7fe test(e2e,ci): migrate web e2e to real API and add PR e2e workflow (#198)
* chore(workflow): align local hooks and e2e guidance

* test(e2e): expand reusable api mock helpers

* test(skill): stabilize share button e2e assertions

* chore(test): add e2e make target and tune playwright workers

* test(web): expand e2e coverage and smoke suite

* test(e2e): migrate to real API flows and add request-based data builder

* ci(e2e): add PR workflow for real-service frontend e2e

* ci(e2e): install playwright chromium in PR workflow

* test(e2e): relax timeout and force single worker in CI

* test(e2e): stabilize not-found assertions and harden CI session bootstrap

* chore(agents): align tester role with web/e2e workflow
2026-04-01 14:41:23 +08:00

159 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SkillHub Web E2E 测试说明(真实请求版)
本文档描述当前 `web/e2e` 的真实请求non-mock测试体系、执行方式与维护规范。
## 1. 当前状态
`web/e2e` 已完成 API mock 迁移,现状如下:
- 不再使用 `helpers/route-mocks.ts``helpers/api-fixtures.ts``helpers/assertions.ts`
- 不在 spec 内使用 `page.route('**/api/...')` 拦截 API
- 通过 Playwright `request``page.context().request`)与后端进行真实认证与数据交互
- 关键会话 helper`web/e2e/helpers/session.ts`
当前 Playwright 配置(`web/playwright.config.ts`
- `baseURL`: `http://localhost:3000`
- 浏览器:`chromium`
- `workers`: `1`(真实请求模式下优先稳定性)
- `fullyParallel`: `false`
- `reporter`: `html`
- `trace: 'on-first-retry'`
- `screenshot: 'on'`
- `webServer.command`: `pnpm exec vite --host 127.0.0.1 --port 3000 --strictPort`
## 2. 目录结构
```text
web/
├── e2e/
│ ├── auth-entry.spec.ts
│ ├── dashboard-shell.spec.ts
│ ├── landing-navigation.spec.ts
│ ├── public-pages.spec.ts
│ ├── route-guard.spec.ts
│ ├── settings-pages.spec.ts
│ ├── tokens.spec.ts
│ └── helpers/
│ ├── auth-fixtures.ts
│ ├── session.ts
│ └── test-data-builder.ts
├── playwright.config.ts
└── playwright.smoke.config.ts
```
职责约定:
- `web/e2e/*.spec.ts`:按用户业务流组织测试
- `web/e2e/helpers/auth-fixtures.ts`locale 等非网络辅助
- `web/e2e/helpers/session.ts`:真实认证会话建立(登录/注册 + worker 级隔离)
- `web/e2e/helpers/test-data-builder.ts`通用测试数据构建与清理namespace/skill/review
## 3. 当前覆盖范围
当前真实请求 E2E 覆盖 23 个 spec
- `auth-entry.spec.ts`:登录入口、注册入口、`returnTo` 保留
- `landing-navigation.spec.ts`:首页导航与匿名受限跳转
- `public-pages.spec.ts`:公开法律页面可达
- `search-flow.spec.ts`:搜索查询状态与匿名收藏筛选跳转登录
- `route-guard.spec.ts`:匿名拦截与登录后访问受保护路由
- `skill-detail-browse.spec.ts`:登录后命名空间/技能详情不存在场景
- `dashboard-shell.spec.ts`Dashboard 基础壳层与快捷入口
- `dashboard-routes.spec.ts`Dashboard 主要子路由可达与命名空间治理页面可达
- `workspace-pages.spec.ts`:我的技能/我的命名空间工作台页面可达
- `my-namespaces-data.spec.ts`:通过 request 创建 namespace 并在工作台验证可见
- `my-skills-data.spec.ts`:通过 request 发布 skill 并在工作台验证可见
- `my-skills-navigation.spec.ts`:从我的技能列表进入技能详情并返回
- `namespace-members-data.spec.ts`:通过 request 准备 namespace 后验证成员管理页可达
- `namespace-page-data.spec.ts`:通过 request 准备 namespace/skill 后验证命名空间公开页可达
- `namespace-reviews-data.spec.ts`:通过 request 造 review 数据并验证命名空间审核页可达
- `publish-flow-ui.spec.ts`:在发布页上传真实 zip 并验证发布后回到我的技能
- `dashboard-personal-modules.spec.ts``/dashboard/stars``/dashboard/notifications` 个人模块可达
- `settings-pages.spec.ts`Profile/Security/Notifications 页面基础行为
- `settings-routing.spec.ts``/settings/accounts` 重定向到 `/settings/security`
- `tokens.spec.ts`Token 管理入口可达
- `protected-routes.spec.ts`:匿名访问 dashboard/admin 受保护路由跳转登录
- `cli-auth.spec.ts`CLI Auth 缺失参数错误路径
- `role-access-control.spec.ts`:登录普通用户访问治理/管理台受限路由会被回退
## 4. 执行命令
推荐优先使用根目录命令:
```bash
make test-e2e-frontend
make test-e2e-smoke-frontend
```
`web` 目录也可直接执行:
```bash
cd web && pnpm test:e2e
cd web && pnpm test:e2e:smoke
cd web && pnpm exec playwright test e2e/<feature>.spec.ts
cd web && pnpm test:e2e:ui
```
说明:
- 在你已手动启动服务时,可直接执行 `cd web && pnpm test:e2e`
- 在 CI 或独立环境中,可让 Playwright 根据配置自动拉起前端服务
## 5. 编写规范(真实请求)
### 5.1 严禁 API mock
新增或修改 E2E 时,禁止:
- 引入 `page.route('**/api/...')`
- 引入页面级 API mock helper
- 在用例中伪造关键业务响应
### 5.2 认证统一走 `session.ts`
- 需要登录态的用例统一复用 `registerSession(page, testInfo)`
- 通过 worker 级账号隔离避免并发冲突
- 不在 spec 内重复手写登录/注册流程
### 5.3 选择器优先级
- `getByRole`
- `getByLabel`
- `getByTestId`
避免结构耦合高的 CSS 深层选择器。
### 5.4 禁止盲等
不要新增 `waitForTimeout`。优先:
- `await expect(locator).toBeVisible()`
- `await expect(page).toHaveURL(...)`
- `await expect(locator).toContainText(...)`
## 6. Smoke 规则
Smoke 只保留关键路径,目标是快且稳,不追求覆盖面最大。
当前 smoke 套件建议包含:
- `auth-entry.spec.ts`
- `landing-navigation.spec.ts`
- `route-guard.spec.ts`
- `dashboard-shell.spec.ts`
## 7. 常见问题排查
- 认证失败:先确认后端可达(`http://localhost:8080`)且注册/登录接口正常
- 用例偶发失败:优先检查选择器歧义和断言时机,不要用固定等待掩盖
- 并发冲突:确认用例是否复用统一 helper并避免共享可变测试数据
## 8. 验收口径
满足以下条件视为迁移完成:
- `web/e2e/**/*.spec.ts` 不含 API mock
- 真实请求路径可达并稳定
- `cd web && pnpm test:e2e` 全量通过
- `cd web && pnpm test:e2e:smoke` 通过