新增 E2E 测试配置与用例并更新测试补充文档
This commit is contained in:
@@ -12,6 +12,8 @@
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
/playwright-report
|
||||
/test-results
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
|
||||
@@ -245,6 +245,9 @@
|
||||
## 第二轮执行进展(2026-03-03)
|
||||
- 任务 2(清理 lint warning):✅ 已完成
|
||||
- 结果:`npm run lint` => `0 errors / 0 warnings`。
|
||||
- 任务 3(补 E2E 用例):✅ 已完成(代码已补齐)
|
||||
- 新增:`playwright.config.ts`、`e2e/home-navigation.spec.ts`、`e2e/panic-join.spec.ts`、`e2e/invite-join.spec.ts`。
|
||||
- 说明:当前环境无法访问 `registry.npmjs.org`,Playwright 依赖安装受限,`npm run test:e2e` 需在可联网环境执行。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -52,6 +52,18 @@ npm run dev
|
||||
|
||||
Open [http://localhost:3000](http://localhost:3000) in your browser (best viewed on mobile viewport).
|
||||
|
||||
## Testing
|
||||
|
||||
```bash
|
||||
npm test
|
||||
npm run test:coverage
|
||||
npm run lint
|
||||
npx tsc --noEmit
|
||||
npm run test:e2e
|
||||
```
|
||||
|
||||
> `test:e2e` 使用 Playwright。当前仓库通过 `npx playwright test` 运行,在可联网环境会自动拉取所需依赖。
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
|
||||
@@ -60,8 +60,25 @@
|
||||
- 完成记录:
|
||||
1. 已新增 `src/hooks/useBlindboxPlan.test.ts`,覆盖 latest、流式失败 fallback、accept 成功/失败四个关键分支(2026-03-03)。
|
||||
|
||||
### T5 E2E 关键流程补测(Playwright)【已完成】
|
||||
- 新增配置与测试:
|
||||
1. `playwright.config.ts`
|
||||
2. `e2e/home-navigation.spec.ts`
|
||||
3. `e2e/panic-join.spec.ts`
|
||||
4. `e2e/invite-join.spec.ts`
|
||||
- 用例清单:
|
||||
1. 首页模式卡片导航:`/` -> `/panic` -> 返回 -> `/blindbox`。
|
||||
2. Panic 手动加入:房间号输入规范化(大写、过滤非法字符、截断 6 位)并成功跳转房间。
|
||||
3. 邀请页加入:展示房间人数,点击加入后成功跳转房间。
|
||||
- 通过标准:
|
||||
1. `npm run test:e2e` 通过。
|
||||
- 完成记录:
|
||||
1. 已补齐 Playwright 配置与 3 条 E2E 用例(2026-03-03)。
|
||||
2. 当前环境无法访问 `registry.npmjs.org`,无法在线安装 Playwright 依赖,`test:e2e` 待在可联网环境执行。
|
||||
|
||||
## 状态追踪
|
||||
- T1:已完成(2026-03-03)
|
||||
- T2:已完成(2026-03-03)
|
||||
- T3:已完成(2026-03-03)
|
||||
- T4:已完成(2026-03-03)
|
||||
- T5:已完成(代码已补齐,2026-03-03)
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
import { test, expect } from "@playwright/test";
|
||||
|
||||
test("首页模式卡片可正确导航", async ({ page }) => {
|
||||
await page.goto("/");
|
||||
await expect(page.getByRole("heading", { name: "NoWhatever" })).toBeVisible();
|
||||
|
||||
await page.getByRole("button", { name: /极速救场/ }).click();
|
||||
await expect(page).toHaveURL(/\/panic$/);
|
||||
|
||||
await page.getByRole("button", { name: "返回" }).click();
|
||||
await expect(page).toHaveURL(/\/$/);
|
||||
|
||||
await page.getByRole("button", { name: /周末契约/ }).click();
|
||||
await expect(page).toHaveURL(/\/blindbox$/);
|
||||
});
|
||||
@@ -0,0 +1,35 @@
|
||||
import { test, expect } from "@playwright/test";
|
||||
|
||||
test("邀请页可展示房间信息并完成加入", async ({ page }) => {
|
||||
const joinBodies: Array<{ userId?: string }> = [];
|
||||
|
||||
await page.route("**/api/room/ROOM01", async (route) => {
|
||||
if (route.request().method() !== "GET") {
|
||||
await route.fallback();
|
||||
return;
|
||||
}
|
||||
|
||||
await route.fulfill({
|
||||
status: 200,
|
||||
contentType: "application/json",
|
||||
body: JSON.stringify({ userCount: 2, scene: "eat" }),
|
||||
});
|
||||
});
|
||||
|
||||
await page.route("**/api/room/ROOM01/join", async (route) => {
|
||||
const body = route.request().postDataJSON() as { userId?: string } | null;
|
||||
joinBodies.push(body ?? {});
|
||||
await route.fulfill({ status: 200, contentType: "application/json", body: "{}" });
|
||||
});
|
||||
|
||||
await page.goto("/invite/ROOM01");
|
||||
|
||||
await expect(page.getByText("ROOM01")).toBeVisible();
|
||||
await expect(page.getByText("已有 2 人在房间")).toBeVisible();
|
||||
|
||||
await page.getByRole("button", { name: "加入房间" }).click();
|
||||
await expect(page).toHaveURL(/\/room\/ROOM01$/);
|
||||
|
||||
expect(joinBodies.length).toBeGreaterThan(0);
|
||||
expect(joinBodies[0]?.userId).toBeTruthy();
|
||||
});
|
||||
@@ -0,0 +1,25 @@
|
||||
import { test, expect } from "@playwright/test";
|
||||
|
||||
test("Panic 手动加入房间会规范化房间号并发起 join 请求", async ({ page }) => {
|
||||
const joinBodies: Array<{ userId?: string }> = [];
|
||||
|
||||
await page.route("**/api/room/*/join", async (route) => {
|
||||
const body = route.request().postDataJSON() as { userId?: string } | null;
|
||||
joinBodies.push(body ?? {});
|
||||
await route.fulfill({ status: 200, contentType: "application/json", body: "{}" });
|
||||
});
|
||||
|
||||
await page.goto("/panic");
|
||||
|
||||
const roomInput = page.getByPlaceholder("输入 6 位房间号");
|
||||
await roomInput.fill("ab-12@3c4");
|
||||
await expect(roomInput).toHaveValue("AB123C");
|
||||
|
||||
const joinButton = page.getByRole("button", { name: "加入房间" });
|
||||
await expect(joinButton).toBeEnabled();
|
||||
await joinButton.click();
|
||||
|
||||
await expect(page).toHaveURL(/\/room\/AB123C$/);
|
||||
expect(joinBodies.length).toBeGreaterThan(0);
|
||||
expect(joinBodies[0]?.userId).toBeTruthy();
|
||||
});
|
||||
+3
-1
@@ -9,7 +9,9 @@
|
||||
"lint": "eslint",
|
||||
"test": "vitest run",
|
||||
"test:watch": "vitest",
|
||||
"test:coverage": "vitest run --coverage"
|
||||
"test:coverage": "vitest run --coverage",
|
||||
"test:e2e": "npx playwright test",
|
||||
"test:e2e:headed": "npx playwright test --headed"
|
||||
},
|
||||
"dependencies": {
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import { defineConfig } from "@playwright/test";
|
||||
|
||||
const port = process.env.PLAYWRIGHT_PORT ?? "3721";
|
||||
const baseURL = process.env.PLAYWRIGHT_BASE_URL ?? `http://127.0.0.1:${port}`;
|
||||
|
||||
export default defineConfig({
|
||||
testDir: "./e2e",
|
||||
timeout: 30_000,
|
||||
expect: {
|
||||
timeout: 5_000,
|
||||
},
|
||||
fullyParallel: true,
|
||||
retries: process.env.CI ? 2 : 0,
|
||||
reporter: process.env.CI
|
||||
? [["github"], ["html", { open: "never" }]]
|
||||
: [["list"], ["html", { open: "never" }]],
|
||||
use: {
|
||||
baseURL,
|
||||
trace: "on-first-retry",
|
||||
screenshot: "only-on-failure",
|
||||
video: "retain-on-failure",
|
||||
viewport: { width: 390, height: 844 },
|
||||
locale: "zh-CN",
|
||||
},
|
||||
webServer: {
|
||||
command: "npm run dev",
|
||||
url: baseURL,
|
||||
reuseExistingServer: !process.env.CI,
|
||||
timeout: 120_000,
|
||||
},
|
||||
});
|
||||
+6
-1
@@ -30,5 +30,10 @@
|
||||
".next/dev/types/**/*.ts",
|
||||
"**/*.mts"
|
||||
],
|
||||
"exclude": ["node_modules", "vitest.config.ts"]
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"vitest.config.ts",
|
||||
"playwright.config.ts",
|
||||
"e2e/**/*.ts"
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user