Status: review
作为测试开发者, 我想要编写后台创建人才用户的 E2E 测试, 以便验证人才用户创建功能的正确性。
Given 用户管理 Page Object (Story 12.1) 已完成 When 编写创建基本人才用户的测试用例 Then 测试应验证以下功能:
Given 基本创建测试已通过 When 编写创建完整信息人才用户的测试用例 Then 测试应验证以下功能:
Given 人才用户创建表单已打开 When 尝试创建人才用户但不选择残疾人 Then 测试应验证以下行为:
Given 人才用户创建表单已打开 When 在不同表单验证场景下提交 Then 测试应验证以下场景:
Given 测试运行环境中可能存在测试数据 When 执行测试 Then 测试应遵循以下策略:
test_talent_${Date.now()}Given 遵循项目测试规范 When 编写测试代码 Then 代码应符合以下标准:
user-create-talent.spec.ts[x] 任务 1: 创建测试文件和基础设施 (AC: #6)
web/tests/e2e/specs/admin/user-create-talent.spec.ts[x] 任务 2: 实现基本人才用户创建测试 (AC: #1)
[x] 任务 3: 实现完整信息人才用户创建测试 (AC: #2)
[x] 任务 4: 实现残疾人关联验证测试 (AC: #3)
[x] 任务 5: 实现表单验证测试 (AC: #4)
[x] 任务 6: 实现测试数据清理策略 (AC: #5)
[x] 任务 7: 验证代码质量 (AC: #6)
pnpm typecheck 验证类型检查(通过)UserManagementPage 可用方法:
goto(): 导航到用户管理页面expectToBeVisible(): 验证页面可见createUser(data, companyName?, personName?): 创建用户(完整流程)
companyName 参数personName 参数userExists(): 验证用户是否存在deleteUser(): 删除用户(API 直接删除策略)用户类型定义:
EMPLOYER: 企业用户,必须关联公司TALENT: 人才用户,必须关联残疾人ADMIN: 管理员,无关联创建用户数据接口:
interface UserData {
username: string;
password: string;
nickname: string;
email?: string;
phone?: string;
name?: string; // 真实姓名
userType: 'ADMIN' | 'EMPLOYER' | 'TALENT';
companyId?: number; // EMPLOYER 类型必须
personId?: number; // TALENT 类型必须
}
残疾人选择器实现:
fillUserForm() 方法支持 TALENT 类型selectRadixOptionAsync 选择残疾人(异步加载选项)残疾人数据:
创建测试残疾人数据参考:
// 参考 Epic 9 的残疾人创建模式
const personData = {
name: `测试残疾人_${Date.now()}`,
idCard: generateTestIdCard(Date.now()),
// ...
};
API 删除策略:
page.evaluate 直接调用 API 删除web/tests/e2e/specs/admin/user-create-talent.spec.tsweb/tests/e2e/pages/admin/user-management.page.tsweb/tests/e2e/utils/timeouts.ts (TIMEOUTS 常量)@d8d/e2e-test-utils 的 selectRadixOptionAsync| 场景 | 描述 | 优先级 | 状态 |
|---|---|---|---|
| 基本创建 | 填写必填字段 + 选择残疾人 | HIGH | 待实现 |
| 完整信息 | 填写所有字段 | HIGH | 待实现 |
| 残疾人关联验证 | 不选择残疾人时验证 | HIGH | 待实现 |
| 用户名验证 | 用户名为空 | MEDIUM | 待实现 |
| 密码验证 | 密码为空 | MEDIUM | 待实现 |
| 邮箱格式验证 | 邮箱格式不正确 | LOW | 待实现 |
残疾人选择器(TALENT 类型专用):
disabledPersonSelector = [data-testid="disabled-person-selector"]disabledPersonSelectorEdit = [data-testid="关联残疾人-edit-trigger"]选择器使用模式(来自 Page Object 实现):
// UserManagementPage.fillUserForm() 方法内部实现
if (userType === UserType.TALENT && data.personId && personName) {
await selectRadixOptionAsync(this.page, '关联残疾人', personName);
}
// Story 12.2 的企业用户创建测试参考
test('应该成功创建基本企业用户', async ({ adminLoginPage, userManagementPage }) => {
await adminLoginPage.goto();
await adminLoginPage.login('admin', 'admin123');
await userManagementPage.goto();
const userData = {
username: `test_employer_${Date.now()}`,
password: 'password123',
nickname: '测试企业用户',
userType: UserType.EMPLOYER,
companyId: 1, // 使用测试公司
};
const result = await userManagementPage.createUser(userData, '测试公司名称');
await expect(result.success).toBe(true);
await expect(userManagementPage.userExists(userData.username)).resolves.toBe(true);
});
UserType.TALENT 替代 UserType.EMPLOYERpersonId 和 personName 替代 companyId 和 companyNameselectRadixOptionAsyncClaude (d8d-model)
关键问题和修复:
测试批量运行超时问题
后端验证未实现(已知问题)
测试文件创建: web/tests/e2e/specs/admin/user-create-talent.spec.ts
测试覆盖:
测试前置条件:
DisabilityPersonManagementPage 进行残疾人管理代码质量:
测试结果:
新建的文件:
web/tests/e2e/specs/admin/user-create-talent.spec.ts - 人才用户创建 E2E 测试文件 (541 行)测试文件位置:
web/tests/e2e/specs/admin/user-create-talent.spec.ts