Status: in-progress
作为测试开发者, 我想要编写企业小程序登录的 E2E 测试, 以便验证企业用户可以通过小程序成功登录,并解锁小程序端的测试能力。
Given 企业小程序 Page Object (Story 12.4) 已完成 When 编写企业用户登录成功的测试用例 Then 测试应验证以下功能:
/mini)Given 企业小程序登录页面已加载 When 使用错误的凭据尝试登录 Then 测试应验证以下场景:
Given 企业小程序登录表单已显示 When 在不同表单验证场景下尝试提交 Then 测试应验证以下场景:
Given 企业用户已成功登录 When 刷新页面或重新打开页面 Then 测试应验证以下功能:
Given 企业用户已成功登录 When 执行退出登录操作 Then 测试应验证以下功能:
Given 测试运行环境中需要企业用户数据 When 执行测试 Then 测试应遵循以下策略:
Given 遵循项目测试规范 When 编写测试代码 Then 代码应符合以下标准:
enterprise-mini-login.spec.tspnpm typecheck 类型检查[x] 任务 1: 创建测试文件和基础设施 (AC: #7) ✅
web/tests/e2e/specs/mini/enterprise-mini-login.spec.ts ✅[ ] 任务 2: 实现基本登录成功测试 (AC: #1) ⏸️ 需要预创建用户
[x] 任务 3: 实现登录失败测试 (AC: #2) ✅
[x] 任务 4: 实现表单验证测试 (AC: #3) ✅
[ ] 任务 5: 实现 Token 持久性测试 (AC: #4) ⏸️ 需要预创建用户
[ ] 任务 6: 实现退出登录测试 (AC: #5) ⏸️ 需要预创建用户
[ ] 任务 7: 实现测试数据准备和清理策略 (AC: #6) ⏸️ 部分完成
[x] 任务 8: 验证代码质量 (AC: #7) ✅
pnpm typecheck 验证类型检查 ✅Epic 12 目标: 为用户管理和小程序登录编写 E2E 测试,解锁小程序端的测试能力
小程序技术要点(来自 Epic 12 文档):
http://localhost:8080/minihttp://localhost:8080/talent-miniEpic 12 Story 依赖关系:
Story 12.1: 用户管理 Page Object ✅ (已完成)
Story 12.2: 后台创建企业用户测试 ✅ (已完成)
Story 12.3: 后台创建人才用户测试 ✅ (已完成)
Story 12.4: 企业小程序 Page Object ✅ (已完成)
Story 12.5: 企业小程序登录测试 ← 当前 Story
Story 12.6: 人才小程序 Page Object
Story 12.7: 人才小程序登录测试
Story 12.8: 用户权限验证测试
从已完成的 Story 12.4 中学习到的 Page Object 使用模式:
EnterpriseMiniPage 可用方法:
// 导航方法
async goto(): Promise<void>
async expectToBeVisible(): Promise<void>
// 登录方法
async login(phone: string, password: string): Promise<void>
async fillPhone(phone: string): Promise<void>
async fillPassword(password: string): Promise<void>
async clickLoginButton(): Promise<void>
// 验证方法
async expectLoginSuccess(): Promise<void>
async expectLoginError(expectedMessage?: string): Promise<void>
// Token 管理
async getToken(): Promise<string | null>
async setToken(token: string): Promise<void>
async clearAuth(): Promise<void>
选择器定义(Story 12.4 已添加 data-testid):
private readonly selectors = {
loginPage: '[data-testid="mini-login-page"]',
phoneInput: '[data-testid="mini-phone-input"]',
passwordInput: '[data-testid="mini-password-input"]',
loginButton: '[data-testid="mini-login-button"]',
pageTitle: '[data-testid="mini-page-title"]',
userInfo: '[data-testid="mini-user-info"]',
// ...
};
从已完成的 Story 12.2 中学习到的测试数据准备模式:
企业用户创建模式:
// 使用 UserManagementPage 在测试前创建企业用户
const employerUserData = {
username: `test_employer_${Date.now()}`,
password: 'password123',
nickname: '测试企业用户',
userType: UserType.EMPLOYER,
companyId: 1, // 使用测试公司
};
测试清理策略:
test.afterEach(async ({ userManagementPage }) => {
// 清理测试数据
await userManagementPage.deleteUser(username);
});
预期登录流程:
/mini 页面Token 验证方法:
// 验证 token 存储正确
const token = await enterpriseMiniPage.getToken();
expect(token).toBeTruthy();
// 验证 token 在页面刷新后仍然有效
await page.reload();
const tokenAfterReload = await enterpriseMiniPage.getToken();
expect(tokenAfterReload).toBe(token);
新建文件:
web/tests/e2e/specs/mini/enterprise-mini-login.spec.ts相关参考文件:
web/tests/e2e/pages/mini/enterprise-mini.page.ts (Story 12.4)web/tests/e2e/pages/admin/user-management.page.ts (Story 12.1)web/tests/e2e/specs/admin/user-create-employer.spec.ts (Story 12.2)优先级(遵循项目标准):
data-testid 属性(最高优先级)Story 12.4 已添加的 data-testid:
mini-login-page - 页面容器mini-phone-input - 手机号输入框mini-password-input - 密码输入框mini-login-button - 登录按钮mini-page-title - 页面标题(Navbar 组件)mini-user-info - 用户信息显示测试数据类型:
interface EmployerUserCredentials {
username: string; // 手机号
password: string;
nickname: string;
userType: 'EMPLOYER';
companyId: number;
}
使用 TIMEOUTS 常量:
import { TIMEOUTS } from '../../utils/timeouts';
await expect(page.locator(selectors.userInfo)).toBeVisible({
timeout: TIMEOUTS.default,
});
架构文档:
_bmad-output/planning-artifacts/architecture.mddocs/standards/e2e-radix-testing.md (Radix UI 测试标准)相关 Story 文档:
12-4-enterprise-mini-page-object.md (企业小程序 Page Object)12-2-create-employer-user.md (后台创建企业用户测试)根据 Epic 12 文档:
在 playwright.config.ts 或测试文件中:
import { test as base } from '@playwright/test';
import { EnterpriseMiniPage } from '../../pages/mini/enterprise-mini.page';
type EnterpriseMiniFixtures = {
enterpriseMiniPage: EnterpriseMiniPage;
};
export const test = base.extend<EnterpriseMiniFixtures>({
enterpriseMiniPage: async ({ page }, use) => {
const miniPage = new EnterpriseMiniPage(page);
await use(miniPage);
},
});
Claude (d8d-model)
测试开发过程中的主要问题和解决方案:
Taro Input 组件交互问题
.fill() 方法不支持 Taro 的自定义元素 (<taro-input-core>).click() + .type() 组合,并使用 Control+A 全选已有内容Page Object 选择器严格模式冲突
.or() 选择器时,多个匹配元素导致严格模式冲突data-testid 选择器登录失败测试的表单验证
expect 未定义错误
expect 导入@playwright/test 导入 expect实现摘要:
已完成的验收标准:
部分完成的验收标准:
技术挑战:
Fixture 共享问题:adminLoginPage 和 enterpriseMiniPage 共享同一个 page 实例
Taro 组件兼容性:Taro Input 组件不是标准 HTML 元素
.type() 代替 .fill()后续工作建议:
新建文件:
web/tests/e2e/specs/mini/enterprise-mini-login.spec.ts - 企业小程序登录测试文件修改文件:
web/tests/e2e/utils/test-setup.ts - 添加 enterpriseMiniPage fixtureweb/tests/e2e/pages/mini/enterprise-mini.page.ts - 修复 Taro Input 组件交互方法