Playwright 1.63 测试锁:让并行代理与地区 QA 更安全

Playwright 1.63 于 2026 年 9 月 4 日发布,新增命名测试锁。声明相同锁的测试不会并发运行,即使它们位于不同文件、worker 或 project;不相关测试仍可并行。对于使用代理的浏览器 QA,这为无法安全并发修改的稀缺或有状态资源提供了更精确的控制。

多条并行浏览器线路在暖色纸艺全球互联网实验室中有序通过共享代理网关

测试锁不会自动让代理流量正确。它的价值是避免为了少数共享资源而把整个 project 设为串行。团队仍需准确确定资源边界、保证每个测试可独立重复,并保存足够证据来区分资源争用与网络故障。

公开来源说明:Microsoft Playwright《Playwright v1.63.0》,发布于 2026 年 9 月 4 日;Microsoft Playwright《Parallelism — Test locks》,查阅于 2026 年 9 月 10 日。

为什么共享代理测试会互相干扰

并行浏览器任务通常更高效,但以下资源可能包含共享可变状态:

  • 用于验证连续性的同一粘性会话标识;
  • 会被修改地区、币种或同意状态的同一测试账号;
  • 有严格并发上限的网关或白名单来源;
  • 共用的测试手机号、邮箱或购物篮;
  • 会改变目标全局设置的管理夹具;
  • 只能独占写入一个文件的证据收集器。

如果没有协调,两个单独正确的测试也会污染彼此。一个 worker 轮换会话,另一个却在验证粘性;一个 project 把账号切到加拿大,另一个正在断言德国价格。最终故障可能被错误归因于代理池。

新测试锁保证什么

Playwright 测试可以声明一个或多个锁,test.describe() 也能给整个组应用锁。运行器会在测试开始前取得全部所需锁,并在测试结束后释放。

import { test, expect } from '@playwright/test';

test('validate a sticky session', {
  lock: ['proxy-session:qa-a', 'account:market-check'],
}, async ({ page }) => {
  await page.goto(process.env.AUTHORIZED_TEST_URL!);
  await expect(page.getByTestId('market')).toHaveText('CA');
});

锁名应表示逻辑资源,不能包含凭据、客户数据或真实代理端点。使用稳定的匿名 ID,既便于报告关联,又不会暴露秘密。

精确选择加锁边界

只锁住真正不能共享的最小资源。

资源可选锁粒度不应加锁的情况
粘性代理会话一个会话租约每个测试都有独立租约
本地化测试账号一个账号或租户状态只读或每次重置
受限网关一个明确容量桶并发已安全分区
目标夹具一条可变记录测试使用不同记录
证据写入器一个独占输出每个测试有独立路径

避免使用 proxy 这样的全局锁名。它会让无关地区、产品和账号全部串行,既拖慢套件,又掩盖真实并发缺陷。更好的键应描述实际冲突域,例如匿名会话租约或测试租户。

测试锁不等于隔离

锁只控制是否重叠,不会重置状态。每个测试仍需使用干净的浏览器 context、明确的代理配置、有限超时和确定性清理。如果测试留下会话、Cookie、账号设置或服务端记录,下一位锁持有者仍会继承问题。

当流程使用存储状态时,可结合Playwright OPFS 与代理状态隔离评估。测量粘性线路时,可复用住宅代理会话粘性测试的验收指标。

实施步骤

  1. 盘点共享资源:找出会修改同一账号、会话、地区夹具或独占输出的测试,确认这是真正共享,而不是夹具设计不当。
  2. 建立单测基线:加锁前逐个运行,记录线路、地区、匿名出口指纹、账号状态、耗时与内容断言。单独运行也失败的问题不是并发问题。
  3. 重现冲突:固定输入并发运行相关测试,同时保存浏览器 trace 与脱敏代理侧观测,证明哪个重叠操作改变了结果。
  4. 添加窄锁:只给共享同一冲突域的测试使用相同稳定键。一个测试需要多个资源时,显式列出全部锁。
  5. 测量结果:比较失败率、排队时间、总套件耗时和无关测试吞吐。目标是消除指定冲突,同时保留其他并行能力。
  6. 验证异常退出:在受控环境强制断言失败、超时和 worker 重启,确认后续测试仍能取得资源,清理也能恢复账号、会话与产物状态。

注意文件运行模式

Playwright 并行文档说明,在默认和 serial 文件模式下,同一文件的测试会按顺序一起运行;某个测试声明的锁可能因此在整个文件运行期间被持有。若锁看起来比预期更严格,应先检查文件组织。

如果只有一个测试需要独占代理租约,把无关测试放在同一文件中可能会意外扩大临界区。应按真实资源所有权组织测试,而不是广泛添加锁。

建议保留的证据

每个加锁测试可记录:测试 ID、project、worker、匿名锁 ID、等待毫秒、资源租约 ID、代理线路 ID、预期地区、匿名出口指纹、前后账号状态、结果类别、清理结果与总耗时。

禁止记录代理密码、认证头、Cookie、Token、完整个人数据或目标秘密。匿名资源租约与线路 ID 通常已足够定位争用。

如何解释失败

  • 加窄锁后失败消失:更可能是共享资源争用,不代表代理质量一定差;仍要重复运行并验证重置确定性。
  • 单独运行仍失败:检查代理设置、DNS、TLS、目标响应和断言,锁没有处理真正的问题层。
  • 排队时间激增:锁范围可能过大、资源容量不足,或测试在无关准备与报告阶段仍持有锁。
  • 串行后仍出现错误地区:检查租约分配、会话语义、重定向和内容校验;互斥不能保证供应商选择正确出口。
  • 后续测试继承状态:清理或夹具隔离不完整;不再重叠并不等于资源已干净。

上线检查清单

  • [ ] CI 已固定并验证 Playwright 1.63。
  • [ ] 每个锁都映射到有文档的冲突域。
  • [ ] 锁名不含凭据或客户数据。
  • [ ] 并发诊断前,测试能单独通过。
  • [ ] 无锁时可以稳定重现冲突。
  • [ ] 不同地区和账号仍保持并行。
  • [ ] 每个测试都会重置 context 与账号状态。
  • [ ] 超时和 worker 重启后资源可再次取得。
  • [ ] 已监控锁等待时间与总套件耗时。
  • [ ] 线路、出口地区和内容证据分开保存。
  • [ ] 强制代理失败时关闭,不会静默直连。
  • [ ] 仍遵守供应商与目标的并发限制。

常见问题

所有代理测试都应使用同一个全局锁吗?

不应。这样会失去有效并行覆盖,并可能掩盖容量或会话分区缺陷。只锁住无法安全拆分的资源。

测试锁会在供应商端预留一个代理 IP 吗?

不会。它只协调使用相同锁名的 Playwright 测试。供应商的出口分配、会话租约与并发限制是另一套控制。

测试锁可以代替每测试一个浏览器 context 吗?

不能。锁不会隔离 Cookie、缓存、本地存储、OPFS、Service Worker 或目标账号状态。

一个测试能同时持有会话锁和账号锁吗?

可以。Playwright 1.63 支持多个锁,但只有确实需要两个共享资源时才这样做,并保持统一的资源命名规则。

合规说明

浏览器自动化与代理只能用于合法且已授权的测试、市场研究、广告验证和数据采集。遵守目标条款、robots 指令、同意要求、隐私法规、速率限制及供应商政策。测试锁是协调工具,不能成为超出供应商并发额度或目标允许频率的理由,也不得用于规避检测、账号滥用、绕过购买限制或访问控制。