如何在Playwright中实现CRUD应用测试的真正隔离?
核心问题拆解
你遇到的本质是共享数据库资源导致的测试冲突——并行测试时,一个测试的truncate table会直接清除另一个测试刚创建的测试数据,完全破坏了隔离性。
实现真正测试隔离的实用方案
每个测试用独立的数据库实例/ Schema
启动测试时,为每个测试(或测试进程)创建专属的数据库Schema,测试结束后直接删除整个Schema。比如在Playwright的globalSetup里动态生成唯一的Schema名称,每个测试用例连接到自己的Schema,彻底避免数据交叉。用事务包裹单个测试,测试结束回滚
在beforeEach里开启数据库事务,afterEach里回滚事务,而非清空整张表。这种方式速度更快,且事务是数据库级别的隔离,并行测试之间完全看不到对方的数据。
示例伪代码:test.beforeEach(async ({ page }) => { await db.startTransaction(); // 创建当前测试需要的用户数据 }); test.afterEach(async ({ page }) => { await db.rollbackTransaction(); });为测试数据加唯一标识前缀
每个测试生成唯一前缀(比如测试名称+随机字符串),所有创建的测试数据都带上这个前缀。查询、更新、删除操作只针对带当前前缀的数据,清空时也只删除自己前缀的数据,不会影响其他测试。比如创建用户时用username: test-user-${testId},删除时只处理username LIKE 'test-user-${testId}%'的记录。禁用并行(最后备选)
如果以上方案暂时无法落地,直接在playwright.config.js里设置workers: 1,强制串行执行测试。虽然牺牲了速度,但能保证测试稳定。
正确理解“测试隔离”
测试隔离的核心是每个测试的执行环境和数据都是独立的,不受其他测试的执行状态影响——不管其他测试是成功、失败还是并行运行,当前测试都能在干净、预期的环境里执行,输出可预测的结果。
内容的提问来源于stack exchange,提问作者Amy Blankenship

