# 测试最佳实践 ## 测试设计原则 ### 1. 测试金字塔 - 70% 单元测试 - 20% 集成测试 - 10% E2E测试 ### 2. 测试独立性 每个测试用例应该独立运行,不依赖其他测试。 ### 3. 测试可重复性 测试结果应该稳定可重复,不受环境影响。 ### 4. 测试快速反馈 优先测试核心业务流程,提供快速反馈。 ## 编写测试的最佳实践 ### 1. 使用描述性的测试名称 ```typescript test('TC-USER-001: 用户登录成功', async ({ page }) => { // 测试代码 }); ``` ### 2. 使用测试夹具 ```typescript test('示例测试', async ({ page, testConfig, testLogger, testDataManager }) => { testLogger.startTest('示例测试'); // 测试代码 testLogger.endTest('示例测试', 'passed'); }); ``` ### 3. 记录测试步骤 ```typescript testLogger.startStep('步骤1: 打开登录页面'); await page.goto('/login'); testLogger.endStep('步骤1: 打开登录页面', 'passed'); ``` ### 4. 使用辅助工具 ```typescript const formHelper = new FormHelper(page); await formHelper.fillField('input[name="username"]', 'testuser'); await formHelper.submitForm(); ``` ### 5. 清理测试数据 ```typescript test.afterEach(async ({ testDataManager }) => { await testDataManager.cleanup(); }); ``` ## 常见陷阱 ### 1. 硬编码等待时间 ❌ 不推荐: ```typescript await page.waitForTimeout(5000); ``` ✅ 推荐: ```typescript await page.waitForSelector('.element', { state: 'visible' }); ``` ### 2. 测试数据冲突 ❌ 不推荐: ```typescript const username = 'testuser'; // 固定用户名 ``` ✅ 推荐: ```typescript const username = `testuser_${Date.now()}`; // 唯一用户名 ``` ### 3. 测试用例依赖 ❌ 不推荐: ```typescript test('测试1', async () => { // 创建数据 }); test('测试2', async () => { // 依赖测试1的数据 }); ``` ✅ 推荐: ```typescript test('测试1', async ({ testDataManager }) => { const data = await testDataManager.createTestData(); // 使用数据 }); test('测试2', async ({ testDataManager }) => { const data = await testDataManager.createTestData(); // 使用独立数据 }); ``` ## 性能优化 ### 1. 并行执行 ```typescript // playwright.config.ts export default defineConfig({ workers: 4, // 并行执行 }); ``` ### 2. 跳过慢速测试 ```typescript test.skip('慢速测试', async () => { // 测试代码 }); ``` ### 3. 使用项目分组 ```typescript // playwright.config.ts export default defineConfig({ projects: [ { name: 'fast', testMatch: '**/*.fast.spec.ts' }, { name: 'slow', testMatch: '**/*.slow.spec.ts' } ] }); ```