进阶掌握
Day 28 - Test Data Management and Environment Strategy
今日目标
- 掌握测试数据准备、隔离和清理思路。
- 理解环境稳定性对自动化的影响。
学习时间安排(60–120 分钟)
| 时间 | 模块 | 做什么 |
|---|---|---|
| 0-20 分钟 | 核心概念与词汇 | 读概念表,重点理解数据隔离和清理策略。 |
| 20-45 分钟 | 学习材料阅读 | 读测试数据与环境的实践文章(官方文档之外)。 |
| 45-75 分钟 | 实操练习 | 为业务流程设计并落地数据策略。 |
| 75-105 分钟 | 示例代码改写 | 用 API 动态创建 + 清理改造一条数据依赖测试。 |
| 105-120 分钟 | 复盘与作业 | 完成测试数据管理方案,完成今日问题。 |
核心概念与词汇
| English | 中文 | 场景用法 |
|---|---|---|
| test data | 测试数据 | Use it when you describe the data a test needs to run. |
| data isolation | 数据隔离 | Use it when each test owns data that no other test touches. |
| data cleanup | 数据清理 | Use it when you remove test data after or before a run. |
| data factory | 数据工厂 | Use it when you generate valid, realistic data on demand. |
| fixture file | 数据夹具文件 | Use it when static data lives in JSON or TypeScript files. |
| environment | 测试环境 | Use it when you distinguish dev, test, staging, and prod. |
| seed data | 预置数据 | Use it when the environment starts with reference data. |
| unique prefix | 唯一前缀 | Use it when names like auto_test_20260814_xxx avoid collisions. |
| leftover data | 残留数据 | Use it when failed tests leave data that breaks future runs. |
| write operation | 写操作 | Use it when risky mutations must be disabled in some environments. |
学习材料
- 必读:[Playwright 官方 best practices](https://playwright.dev/docs/best-practices) 中关于测试数据的建议
- 必读:[API testing](https://playwright.dev/docs/api-testing) 中用 API 准备数据的部分(复习 Day 17)
- 选读:团队内部的测试数据规范文档(如果有)
重点理解
测试数据来源:
- 固定测试账号。
- API 动态创建。
- 数据库预置。
- Mock 数据。
- Fixture 文件。
- 随机数据。
策略:
- 每条测试尽量独立。
- 数据要可重复、可清理。
- 避免依赖线上真实用户数据。
- 区分 dev、test、staging、prod。
- 高风险环境禁用写操作。
- 使用唯一前缀避免冲突,例如
auto_test_yyyyMMdd_xxx。
实操步骤
为业务流程设计测试数据策略:
## 测试数据策略
- 数据创建方式:
- 数据命名规则:
- 数据清理方式:
- 失败后残留处理:
- 多环境差异:
- 风险控制:
示例代码
import { test, expect } from '@playwright/test';
const uniqueName = `auto_test_order_${Date.now()}`;
test.beforeEach(async ({ request }) => {
// 动态创建,保证唯一
const res = await request.post('/api/orders', {
data: { name: uniqueName, status: 'draft' },
});
expect(res.ok()).toBeTruthy();
});
test('edit order', async ({ page, request }) => {
await page.goto('/orders');
await page.getByRole('row').filter({ hasText: uniqueName })
.getByRole('button', { name: 'Edit' }).click();
await page.getByLabel('Status').selectOption('confirmed');
await expect(page.getByText('Saved')).toBeVisible();
});
test.afterEach(async ({ request }) => {
// 无论成败都尝试清理
const list = await (await request.get('/api/orders?name=' + uniqueName)).json();
for (const order of list) {
await request.delete(`/api/orders/${order.id}`);
}
});
常见坑
- 固定测试数据被并行测试抢用,A 改了 B 断言失败。
- 测试失败后数据残留,第二次运行因“已存在”而失败。
- 在 prod 环境跑写操作测试,污染真实业务数据。
- 随机数据没有记录,失败后无法复现现场。
- 测试账号互相踢下线(单端登录),并行时登录态失效。
今日产出
- 一份测试数据管理方案。
- 一个动态创建并清理数据的测试。
今日问题
- 测试数据不稳定会导致什么问题?
- 为什么测试数据要可清理?
- API 创建数据和 UI 创建数据如何取舍?
- 如何避免多个并行测试抢同一条数据?
- 哪些环境不适合跑写操作测试?
复盘要点
- 数据问题的典型症状:串行全绿、并行全红——这是数据隔离没做好。
- 唯一的创建 + 兜底的清理(afterEach 容错执行)是数据管理的基本盘。
- 环境红线要写进规范:prod 禁写、staging 谨慎、dev/test 放开。
AI 时代扩展:AI 辅助 Playwright 测试
新增概念
| English | 中文 |
|---|---|
| data strategy design | 数据策略设计 |
| cleanup robustness | 清理健壮性 |
| environment guardrails | 环境护栏 |
适用场景
让 AI 根据业务流程设计数据创建/命名/清理方案,或者审查现有测试的数据残留风险和并行冲突点。
可复用表达 / 提示词
我的测试需要创建订单并修改状态,请设计数据策略:创建方式、唯一命名、清理机制、失败兜底。
请审查我的测试数据使用,找出并行冲突、数据残留、环境误用三类风险。
追问加练
- AI 建议 afterEach 里无条件 DELETE 所有同名数据,有什么风险?
- 唯一命名用时间戳还是随机串?各自的利弊?
- 哪些环境红线 AI 替你写进方案里,需要你亲自把关?
今日作业
- 完成测试数据管理方案文档(6 项全填)。
- 实现“动态创建 + afterEach 兜底清理”的测试并连跑 3 次。
- 让 AI 审查你的方案,修正 1 个以上风险点。