SuperAPI AI 工具集

e2e-test-conventions

测试与质量

查看项目

更新于 10-15 19:51

技能介绍

用途:为 Playwright + TypeScript 的 E2E 测试提供统一约定,适用于生成、修改或审查测试代码时遵循。技术栈为 Playwright 做浏览器自动化与测试运行,测试代码全部使用 TypeScript,不限定 UI 框架。

主要能力与规则: 项目结构固定为 e2e/ 目录,含 auth/(认证初始化)、fixtures/(自定义 fixture)、helpers/(共享工具,非页面对象)、poms/(页面对象模型,每页一文件)、test-data/(JSON 测试数据)、tests/(按套件分 acceptance、regression、smoke)、playwright.config.ts、tsconfig.json、.env.example。不得在此结构外新建文件,未经许可不得移动文件。

配置按 {browser}:{suite} 命名,浏览器含 chromium、firefox、webkit、mobile-chrome、mobile-safari;套件含 regression(永久)、acceptance(临时,需提升或删除)、smoke(永久)。所有项目依赖处理认证的 setup 项目。

运行命令(在 e2e/ 目录下): npx playwright test npx playwright test --project="chromium:regression" npx playwright test --project=":smoke" npx playwright test --project="firefox:"

命名约定:POM 为 poms/{feature}.page.ts;regression 与 smoke 规格为 tests/{suite}/{feature}.spec.ts;acceptance 为 {TICKET}-{description}.spec.ts;测试数据为 test-data/{feature}.json,{feature} 名称需跨文件一致。

测试独立性与并行:每个测试完全独立、可任意顺序运行,不得依赖前一个测试的状态;并行运行时为测试数据追加唯一后缀(时间戳+随机 ID),不共享可变状态,各自创建、验证并清理数据。

认证:仅在 auth/auth.setup.ts 的 setup 项目中执行一次,会话状态保存后通过 storageState 复用;禁止在 spec、POM、beforeEach、beforeAll 中写登录逻辑。若应用将令牌存于 IndexedDB,使用 indexedDB 选项:await page.context().storageState({ path: authFile, indexedDB: true });

导航:始终使用直接 URL 导航(page.goto('/dashboard')),不点击菜单或侧边栏;导航后断言 URL 与关键标题/元素可见。

选择器优先级:getByRole()、getByLabel()、getByText()、getByPlaceholder(),最后才用 locator() 配合 CSS/filter()。动态渲染属性可能不在 DOM 中,可用 filter() 匹配子内容;图标按钮可用 aria-label 或子图标内容匹配。

环境配置:e2e/ 下每个环境一个 .env.{env} 文件(local、dev、test、uat、production),变量名一致:BASE_URL、LOGIN_EMAIL、LOGIN_PASSWORD、AUTH_FILE。选择环境:TEST_ENV=dev npx playwright test;不指定时默认 production。helpers/env-config.ts 通过 dotenv 两层加载 e2e/.env 与 e2e/.env.{env},两者均可选,已存在的变量不会被覆盖;导出 getEnvConfig()、getBaseUrl()、getCredentials()、getAuthFilePath()。所有变量必填,缺失即报错,不得回退到硬编码默认值;.env.* 含密钥且被 git 忽略,仅提交 .env.example。

测试数据:全部放在 e2e/test-data/{feature}.json,不得硬编码在 spec 或 POM 中;用自定义 fixture 加载并追加唯一后缀;始终从自定义 fixtures 导入 test,而非 @playwright/test。

规格文件规则:所有页面交互经 POM 完成,spec 中不得直接调用 page.getByRole()、page.locator() 等;page 仅可用于传给 POM 构造函数或在 beforeAll 中创建上下文;用 test.beforeAll 配合手动创建的浏览器上下文调用 POM 的 setUp() 做清理;每个测试通过 POM 导航方法独立导航。

限制:资料未提供具体框架适配示例、CI 集成细节及错误处理策略,暂未提供。