Status: done
作为测试开发者, 我想要编写平台列表显示验证的 E2E 测试, 以便验证平台管理模块的列表展示功能正常工作。
AC1: 创建测试文件
web/tests/e2e/specs/admin/platform-list.spec.tsPlatformManagementPage Page ObjectAC2: 验证列表基础显示
AC3: 验证列表数据字段
AC4: 验证空列表状态
AC5: 验证列表分页功能(如适用)
AC6: 代码质量标准
[x] 任务 1: 创建测试文件和基础结构 (AC: 1, 6)
web/tests/e2e/specs/admin/platform-list.spec.ts[x] 任务 2: 实现测试前置条件 (AC: 1, 2)
test.beforeEach() 登录后台[x] 任务 3: 实现列表基础显示测试 (AC: 2, 3)
[x] 任务 4: 实现列表数据验证测试 (AC: 3)
[x] 任务 5: 实现空列表状态测试 (AC: 4)
[x] 任务 6: 实现分页功能测试 (AC: 5)
[x] 任务 7: 运行测试并验证 (AC: 2, 3, 4, 5, 6)
pnpm test:e2e:chromium platform-list.spec.tsEpic 11: 基础配置管理测试 (Epic F)
为平台、公司、渠道配置管理编写 E2E 测试,为后续用户管理和跨端测试提供必要的测试数据。
实体关系链:
Platform (平台)
↓ 1:N
Company (公司) - 必须 platformId
↓ 1:N
Order (订单) - 必须 companyId
Story 11.3 在 Epic 中的位置:
测试文件结构参考:
参考现有测试文件的结构模式:
web/tests/e2e/specs/admin/order-list.spec.ts - 订单列表测试参考web/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('应该显示平台列表', async ({ platformManagementPage }) => {
// 测试逻辑
});
});
测试夹具配置:
platformManagementPage fixture 已在 web/tests/e2e/utils/test-setup.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> |
expectToBeVisible() |
验证页面关键元素可见 | Promise<void> |
platformExists(name) |
验证平台是否存在 | Promise<boolean> |
searchByName(name) |
按名称搜索平台 | Promise<boolean> |
createPlatform(data) |
创建平台 | Promise<FormSubmitResult> |
deletePlatform(name) |
删除平台 | Promise<boolean> |
页面元素选择器:
// 页面级选择器
readonly pageTitle: Locator; // 页面标题
readonly createPlatformButton: Locator; // 创建平台按钮
readonly searchInput: Locator; // 搜索输入框
readonly searchButton: Locator; // 搜索按钮
readonly platformTable: Locator; // 平台列表表格
测试用例 1: 验证列表基础显示
test('应该显示平台列表', async ({ platformManagementPage }) => {
// 验证页面标题
await expect(platformManagementPage.pageTitle).toBeVisible();
// 验证表格存在
await expect(platformManagementPage.platformTable).toBeVisible();
// 验证创建按钮存在
await expect(platformManagementPage.createPlatformButton).toBeVisible();
});
测试用例 2: 验证列表数据字段
test('应该正确显示平台数据字段', async ({ platformManagementPage }) => {
// 创建测试平台
const timestamp = Date.now();
const platformName = `测试平台_${timestamp}`;
await platformManagementPage.createPlatform({
platformName,
contactPerson: `联系人_${timestamp}`,
contactPhone: '13800138000',
contactEmail: `test_${timestamp}@example.com`,
});
// 刷新页面确保数据加载
await platformManagementPage.page.reload();
await platformManagementPage.goto();
// 验证平台在列表中
const exists = await platformManagementPage.platformExists(platformName);
expect(exists).toBe(true);
// 验证所有字段显示
const platformRow = platformManagementPage.platformTable
.locator('tbody tr')
.filter({ hasText: platformName });
// 验证平台名称(第二列)
await expect(platformRow.locator('td').nth(1)).toContainText(platformName);
// 验证联系人(第三列)
await expect(platformRow.locator('td').nth(2)).toContainText(`联系人_${timestamp}`);
// 验证联系电话(第四列)
await expect(platformRow.locator('td').nth(3)).toContainText('13800138000');
// 验证联系邮箱(第五列)
await expect(platformRow.locator('td').nth(4)).toContainText(`test_${timestamp}@example.com`);
// 清理
await platformManagementPage.deletePlatform(platformName);
});
测试用例 3: 验证操作按钮显示
test('应该显示编辑和删除按钮', async ({ platformManagementPage }) => {
// 创建测试平台
const timestamp = Date.now();
const platformName = `测试平台_${timestamp}`;
await platformManagementPage.createPlatform({
platformName,
});
// 刷新页面
await platformManagementPage.page.reload();
await platformManagementPage.goto();
// 查找平台行
const platformRow = platformManagementPage.platformTable
.locator('tbody tr')
.filter({ hasText: platformName });
// 验证编辑按钮存在
const editButton = platformRow.getByRole('button', { name: '编辑' });
await expect(editButton).toBeVisible();
// 验证删除按钮存在
const deleteButton = platformRow.getByRole('button', { name: '删除' });
await expect(deleteButton).toBeVisible();
// 清理
await platformManagementPage.deletePlatform(platformName);
});
测试用例 4: 验证空列表状态
test('无平台时应显示空状态', async ({ platformManagementPage }) => {
// 注意:此测试需要谨慎执行,避免删除生产数据
// 仅在测试环境中执行,且确保有恢复机制
// 获取当前所有平台数量
const tableRows = platformManagementPage.platformTable.locator('tbody tr');
const initialCount = await tableRows.count();
// 如果有平台数据,跳过此测试
test.skip(initialCount > 0, '环境已有平台数据,跳过空状态测试');
// 或者验证空状态元素
const emptyState = platformManagementPage.page.getByText(/暂无数据|无平台|empty/i);
// 根据实际 UI 实现
});
使用时间戳确保唯一性:
const timestamp = Date.now();
const uniqueId = `platform_list_test_${timestamp}`;
测试数据清理:
deletePlatform() 方法删除测试数据运行单个测试文件:
cd web
pnpm test:e2e:chromium platform-list.spec.ts
运行单个测试用例:
cd web
pnpm test:e2e:chromium platform-list.spec.ts -g "应该显示平台列表"
快速失败模式(调试):
cd web
timeout 60 pnpm test:e2e:chromium platform-list.spec.ts
Epic 11 内部依赖:
外部依赖:
@d8d/e2e-test-utils 包(已存在)web/tests/e2e/utils/test-setup.ts: 已包含 platformManagementPage 夹具遵循项目测试标准:
docs/standards/testing-standards.mddocs/standards/web-ui-testing-standards.md关键测试原则:
从 Story 11.2 中学到的关键经验:
Toast 检测不可靠:
表格列顺序:
nth(1) 检查平台名称列测试数据要求:
页面刷新:
page.reload() 或 goto() 刷新测试环境数据:
空状态测试:
分页功能:
测试文件存放路径:
web/tests/e2e/specs/admin/
├── order-*.spec.ts # 订单管理测试(参考)
├── disability-person-*.spec.ts # 残疾人管理测试(参考)
├── platform-create.spec.ts # 平台创建测试(已完成)
└── platform-list.spec.ts # 平台列表测试(当前)
遵循项目统一结构:
web/tests/e2e/specs/admin/ 目录web/tests/e2e/pages/admin/ 目录test.describe() 组织相关测试用例test.beforeEach() 设置测试前置条件test.afterEach() 清理测试数据Claude (d8d-model)
Story 创建完成:
Story 实施完成 (2026-01-12):
web/tests/e2e/specs/admin/platform-list.spec.ts测试用例覆盖(共 14 个测试用例):
环境注意事项:
Story 文件位置:
_bmad-output/implementation-artifacts/11-3-platform-list-test.story.md新创建的文件(Story 创建):
_bmad-output/implementation-artifacts/11-3-platform-list-test.story.md新创建的文件(Story 实施):
web/tests/e2e/specs/admin/platform-list.spec.ts修改的文件(代码审查修复):
web/tests/e2e/specs/admin/platform-list.spec.ts - 修复搜索测试逻辑错误、移除硬编码超时、修复清理逻辑已有的依赖文件:
web/tests/e2e/pages/admin/platform-management.page.ts - Story 11.1 创建web/tests/e2e/utils/test-setup.ts - 已配置 platformManagementPage fixtureweb/tests/e2e/specs/admin/platform-create.spec.ts - Story 11.2 创建审查发现的 HIGH/MEDIUM 问题修复:
✅ [CRITICAL 已修复] 搜索测试逻辑错误
searchTestTimestamp 变量,确保搜索名称与创建的平台名称一致✅ [CRITICAL 已修复] 空列表状态测试改进
✅ [CRITICAL 已记录] 分页功能测试限制
✅ [MEDIUM 已修复] 移除硬编码超时
waitForTimeout(1000) 等待固定时间waitForLoadState('networkidle') 进行更可靠的等待✅ [MEDIUM 已修复] 改进 afterEach 清理
createdPlatforms 数组存储实际创建的平台名称,并添加 try-catch 错误处理