Status: done
作为测试开发者, 我想要编写公司列表查看的 E2E 测试, 以便验证公司列表的基本功能和数据展示。
Given Epic 11.4 (Company 管理 Page Object) 已完成 When 编写公司列表查看测试用例 Then 验证以下场景:
公司列表按预期加载
/admin/companies公司数据的正确展示
列表功能验证
测试在真实浏览器中通过
[x] Task 1: 创建测试文件基础结构 (AC: #1)
web/tests/e2e/specs/admin/company-list.spec.ts[x] Task 2: 实现页面加载和基础验证测试 (AC: #1)
[x] Task 3: 实现数据显示验证测试 (AC: #2)
[x] Task 4: 实现列表功能测试 (AC: #3, #4)
本代码审查由 AI 对抗性代码审查工作流执行,于 2026-01-12 完成。
HIGH 问题(已修复):
测试数据隔离问题 - 添加了 beforeEach/afterEach 钩子
空数据提示测试虚假 - 重写了无数据提示测试
测试静默通过 - 移除了 if (count > 0) 模式
filter({ hasText }) 精确匹配,数据不存在会抛出清晰错误MEDIUM 问题(已修复):
冗余 count() 调用 - 简化了测试代码
first().count() 冗余检查expect().toBeVisible() 验证搜索功能未测试 - 添加了实际搜索测试
分页功能未测试 - 添加了分页控件检查
代码质量改进 - 添加了常量定义
TABLE_COLUMNS 常量避免魔法数字generateTestName() 函数生成唯一测试数据LOW 问题(已修复):
data-testid="company-page-title" 而非依赖 data-slot="card-title",以提高选择器稳定性Epic 11: 基础配置管理测试 (Epic F)
目标: 为平台、公司、渠道配置管理编写 E2E 测试,为后续用户管理和跨端测试提供必要的测试数据。
实体关系链:
Platform (平台)
↓ 1:N
Company (公司) - 必须 platformId
↓ 1:N
Order (订单) - 必须 companyId
当前进度:
Story 11.4 (Company Page Object) 已完成:
web/tests/e2e/pages/admin/company-management.page.ts@d8d/e2e-test-utils 的 selectRadixOptionAsync关键 API:
// 导航到页面
await companyPage.goto();
// 验证页面可见
await companyPage.expectToBeVisible();
// 检查公司是否存在
const exists = await companyPage.companyExists('公司名称');
// 创建公司
const result = await companyPage.createCompany({
companyName: '测试公司',
contactPerson: '张三',
contactPhone: '13800138000'
}, '平台名称');
表格列顺序(重要):
参考 web/tests/e2e/specs/admin/region-list.spec.ts 的测试模式:
测试文件结构:
import { test, expect } from '@playwright/test';
import { CompanyManagementPage } from '@/pages/admin/company-management.page';
test.describe('公司列表管理', () => {
let companyPage: CompanyManagementPage;
test.beforeEach(async ({ adminLoginPage, page }) => {
// 登录
await adminLoginPage.goto();
await adminLoginPage.login('admin', 'admin123');
companyPage = new CompanyManagementPage(page);
});
test.afterEach(async ({ companyPage }) => {
// 清理测试数据
});
test('应该成功加载公司列表页面', async () => {
await companyPage.goto();
// 验证...
});
});
数据验证模式:
使用 page.locator() 定位表格元素
使用 filter({ hasText }) 精确匹配行
使用 nth(index) 定位列
使用 expect().toBeVisible() 验证可见性
使用 expect().toHaveText() 验证文本内容
测试隔离:
每个测试使用唯一数据(时间戳)
测试后清理数据
避免测试间相互影响
选择器策略(来自 Architecture 文档):
data-testidrole + name 组合:text-is() 精确匹配等待策略:
waitForTimeout(除非必要)waitForLoadState('domcontentloaded') 等待页面加载waitFor({ state: 'visible' }) 等待元素可见错误处理:
console.debug() 调试(Vitest 支持)测试平台创建(前置条件): 如果测试需要关联平台,需要先确保测试平台存在:
测试数据清理:
test.afterEach(async ({ companyPage }) => {
// 清理测试创建的公司
const testCompanies = ['测试公司1', '测试公司2'];
for (const name of testCompanies) {
await companyPage.deleteCompany(name);
}
});
测试文件位置:
web/tests/e2e/
├── pages/admin/
│ └── company-management.page.ts ← 已存在
├── specs/admin/
│ └── company-list.spec.ts ← 需要创建
└── fixtures/
└── (测试数据文件)
导入路径:
// Page Object 导入
import { CompanyManagementPage } from '@/pages/admin/company-management.page';
// 测试工具导入
import { selectRadixOptionAsync } from '@d8d/e2e-test-utils';
Epic 文档:
架构文档:
前序故事:
参考测试实现:
项目上下文:
Claude Opus 4.5 (claude-opus-4-5-20251101)
无
web/tests/e2e/specs/admin/company-list.spec.tsgetByRole('heading') 改为使用 data-slot="card-title")已创建/修改的文件:
web/tests/e2e/specs/admin/company-list.spec.ts (新建) - 公司列表 E2E 测试,包含 14 个测试用例web/tests/e2e/pages/admin/company-management.page.ts (修改) - 修复 pageTitle 选择器_bmad-output/implementation-artifacts/11-6-company-list-test.md (修改) - 添加代码审查记录依赖文件:
web/tests/e2e/fixtures/admin-login.fixture.tspackages/e2e-test-utils/src/index.ts配置文件:
web/tests/e2e/playwright.config.ts