跳到主要内容

隔离机制

简介

使用 Playwright 编写的测试在称为浏览器上下文(browser contexts)的独立全新环境中执行。这种隔离模型提高了测试的可重现性,并防止级联测试失败。

什么是测试隔离?

测试隔离是指每个测试完全独立于其他测试运行。每个测试都独立于任何其他测试执行。这意味着每个测试都有自己的本地存储、会话存储、cookies等。Playwright 通过使用BrowserContext实现这一点,这相当于无痕浏览模式。它们创建快速且成本低,并且完全隔离,即使在单个浏览器中运行也是如此。Playwright 为每个测试创建一个上下文,并在该上下文中提供一个默认的Page

为什么测试隔离很重要?

  • 没有失败传递。如果一个测试失败,不会影响其他测试。
  • 更容易调试错误或不稳定性,因为你可以根据需要多次运行单个测试。
  • 在并行运行、分片等情况下不需要考虑执行顺序。

两种测试隔离方式

在测试隔离方面有两种不同的策略:从头开始或在测试之间清理。在测试之间清理的问题是容易忘记清理,而且有些东西如"已访问链接"是无法清理的。一个测试的状态可能会泄漏到下一个测试中,这可能导致测试失败,并使调试更加困难,因为问题来自另一个测试。从头开始意味着一切都是新的,所以如果测试失败,你只需要在该测试内部进行调试。

Playwright 如何实现测试隔离

Playwright 使用浏览器上下文(Browser Context)来实现测试隔离。每个测试都有自己独立的浏览器上下文。每次运行测试时都会创建一个新的浏览器上下文。当使用 Playwright 作为测试运行器时,浏览器上下文会自动创建。否则,您可以手动创建浏览器上下文。

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

test('示例测试', async ({ page, context }) => {
// "context" 是一个独立的浏览器上下文,专为此测试创建
// "page" 属于这个上下文
});

test('另一个测试', async ({ page, context }) => {
// 第二个测试中的 "context" 和 "page"
// 与第一个测试完全隔离
});

浏览器上下文还可用于模拟涉及移动设备、权限、区域设置和配色方案的多页面场景。详情请参阅我们的模拟指南

单测试中的多上下文

Playwright 可以在单个测试场景中创建多个浏览器上下文。这在需要测试多用户功能(如聊天)时非常有用。

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

test('admin and user', async ({ browser }) => {
// 创建两个隔离的浏览器上下文
const adminContext = await browser.newContext();
const userContext = await browser.newContext();

// 创建页面并独立操作上下文
const adminPage = await adminContext.newPage();
const userPage = await userContext.newPage();
});