Status: done
作为测试开发者, 我想要编写平台创建功能的 E2E 测试, 以便验证平台管理模块的创建功能正常工作。
AC1: 创建测试文件 ✅
web/tests/e2e/specs/admin/platform-create.spec.tsPlatformManagementPage Page ObjectAC2: 测试基本创建流程 ✅
AC3: 测试完整表单字段 ✅
AC4: 测试表单验证 ✅
AC5: 测试数据唯一性 ✅
AC6: 代码质量标准 ✅
[x] 任务 1: 创建测试文件和基础结构 (AC: 1, 6)
web/tests/e2e/specs/admin/platform-create.spec.ts[x] 任务 2: 实现测试前置条件 (AC: 1, 2)
test.beforeEach() 登录后台[x] 任务 3: 实现基本创建流程测试 (AC: 2, 5)
[x] 任务 4: 实现完整表单字段测试 (AC: 3, 5)
[x] 任务 5: 实现表单验证测试 (AC: 4)
[x] 任务 6: 实现测试后清理 (AC: 5)
[x] 任务 7: 运行测试并验证 (AC: 2, 3, 4, 6)
pnpm test:e2e:chromium platform-create.spec.tsEpic 11: 基础配置管理测试 (Epic F)
为平台、公司、渠道配置管理编写 E2E 测试,为后续用户管理和跨端测试提供必要的测试数据。
实体关系链:
Platform (平台)
↓ 1:N
Company (公司) - 必须 platformId
↓ 1:N
Order (订单) - 必须 companyId
Story 11.2 在 Epic 中的位置:
测试文件结构参考:
参考现有测试文件的结构模式:
web/tests/e2e/specs/admin/order-create.spec.tsweb/tests/e2e/specs/admin/disability-person-crud.spec.ts标准测试文件结构:
import { test, expect } from '@playwright/test';
import { PlatformManagementPage } from '../../pages/admin/platform-management.page';
test.describe('平台创建功能', () => {
test.beforeEach(async ({ adminLoginPage, platformManagementPage }) => {
// 登录后台
await adminLoginPage.goto();
await adminLoginPage.login('admin', 'admin123');
// 导航到平台管理页面
await platformManagementPage.goto();
});
test.afterEach(async ({ platformManagementPage }) => {
// 清理测试数据
});
test('应该成功创建平台', async ({ platformManagementPage }) => {
// 测试逻辑
});
});
测试夹具配置:
需要确保测试夹具在 web/tests/e2e/fixtures.ts 中定义:
export const test = test.extend<{
adminLoginPage: AdminLoginPage;
platformManagementPage: PlatformManagementPage;
}>({
adminLoginPage: async ({ page }, use) => {
await use(new AdminLoginPage(page));
},
platformManagementPage: async ({ page }, use) => {
await use(new PlatformManagementPage(page));
},
});
来自 Story 11.1 的可用方法:
| 方法 | 描述 | 返回值 |
|---|---|---|
goto() |
导航到平台管理页面 | Promise<void> |
createPlatform(data) |
创建平台(完整流程) | Promise<FormSubmitResult> |
editPlatform(name, data) |
编辑平台 | Promise<FormSubmitResult> |
deletePlatform(name) |
删除平台 | Promise<boolean> |
platformExists(name) |
验证平台是否存在 | Promise<boolean> |
数据接口:
interface PlatformData {
platformName: string; // 必填
contactPerson?: string;
contactPhone?: string;
contactEmail?: string;
}
interface FormSubmitResult {
success: boolean;
hasError: boolean;
hasSuccess: boolean;
errorMessage?: string;
successMessage?: string;
responses?: NetworkResponse[];
}
测试文件存放路径:
web/tests/e2e/specs/admin/
├── order-*.spec.ts # 订单管理测试(参考)
├── disability-person-*.spec.ts # 残疾人管理测试(参考)
└── platform-create.spec.ts # 平台创建测试(已完成)
测试用例 1: 基本创建流程(所有字段)
test('应该成功创建平台(填写所有字段)', async ({ platformManagementPage }) => {
const timestamp = Date.now();
const platformName = `测试平台_${timestamp}`;
const contactPerson = `测试联系人_${timestamp}`;
const contactPhone = '13800138000';
const contactEmail = `test_${timestamp}@example.com`;
// 创建平台
const result = await platformManagementPage.createPlatform({
platformName,
contactPerson,
contactPhone,
contactEmail,
});
// 验证 API 响应成功
const createResponse = result.responses?.find(r => r.url.includes('createPlatform'));
expect(createResponse?.ok).toBe(true);
// 验证平台出现在列表中
const exists = await platformManagementPage.platformExists(platformName);
expect(exists).toBe(true);
// 清理
await platformManagementPage.deletePlatform(platformName);
});
测试用例 2: 表单验证(空平台名称)
test('未填写平台名称时应显示错误', async ({ platformManagementPage }) => {
// 打开创建对话框
await platformManagementPage.openCreateDialog();
// 不填写任何字段,直接提交
const submitButton = platformManagementPage.page.locator('[data-testid="create-submit-button"]');
await submitButton.click();
// 验证对话框仍然打开(表单验证阻止了提交)
const dialog = platformManagementPage.page.locator('[role="dialog"]');
await expect(dialog).toBeVisible();
// 关闭对话框
await platformManagementPage.cancelDialog();
});
使用时间戳确保唯一性:
const timestamp = Date.now();
const uniqueId = `platform_test_${timestamp}`;
测试数据清理:
deletePlatform() 方法删除测试数据运行单个测试文件:
cd web
pnpm test:e2e:chromium platform-create.spec.ts
运行单个测试用例:
cd web
pnpm test:e2e:chromium platform-create.spec.ts -g "应该成功创建平台"
快速失败模式(调试):
cd web
timeout 60 pnpm test:e2e:chromium platform-create.spec.ts
Epic 11 内部依赖:
外部依赖:
@d8d/e2e-test-utils 包(已存在)web/tests/e2e/fixtures.ts: 已包含 platformManagementPage 夹具遵循项目测试标准:
docs/standards/testing-standards.mddocs/standards/web-ui-testing-standards.md关键测试原则:
Toast 消息检测不可靠: ✅ 已修复 (2026-01-12)
platformExists 列顺序问题: ✅ 已修复
nth(1))删除平台超时问题: ✅ 已修复 (2026-01-12)
POST /api/v1/platform/deletePlatform)网络监听器干扰问题: ✅ 已修复 (2026-01-12)
page.on('response') 监听器互相干扰waitForResponse 捕获特定 API 响应测试数据要求:
对话框关闭检测:
Claude (d8d-model)
实施过程中的关键调试记录:
POST /api/v1/platform/deletePlatform + { id: number }page.on('response') 监听器互相干扰waitForResponse 捕获特定 API 响应完成的任务:
web/tests/e2e/specs/admin/platform-create.spec.ts 测试文件platformManagementPage fixture 到 test-setup.ts已修复的问题:
pageTitle 选择器匹配两个元素 - 改用 heading role 精确定位platformExists 检查错误的列 - 改为检查第二列(nth(1))待解决的问题(已知问题):
最新修复 (2026-01-12):
waitForResponse 代替全局监听器创建的文件:
web/tests/e2e/specs/admin/platform-create.spec.ts修改的文件:
web/tests/e2e/utils/test-setup.ts - 添加 platformManagementPage fixtureweb/tests/e2e/pages/admin/platform-management.page.ts:
测试套件结构:
test.describe('平台创建功能', () => {
test.describe('基本创建流程测试', () => {
test('应该成功创建平台(填写所有字段)')
test('创建后平台应该出现在列表中')
})
test.describe('完整表单字段测试', () => {
test('应该保存所有填写的字段数据')
test('应该支持不同的联系人信息')
})
test.describe('表单验证测试', () => {
test('未填写平台名称时应显示内联验证错误')
test('应该能取消创建平台操作')
test('应该能通过关闭对话框取消创建')
})
test.describe('对话框元素验证', () => {
test('应该显示创建平台对话框的所有字段')
})
test.describe('数据唯一性测试', () => {
test('不同测试应该使用不同的平台名称')
})
test.describe('测试后清理验证', () => {
test('应该能成功删除测试创建的平台')
})
})