隔離
簡介
測試使用 Playwright 編寫並在稱為瀏覽器上下文的隔離乾淨環境中執行。這種隔離模型提高了可重現性並防止連鎖測試失敗。
什麼是測試隔離?
測試隔離是指每個測試完全與其他測試隔離。每個測試獨立於其他任何測試執行。這意味著每個測試都有自己 的本地儲存、會話儲存、cookies 等。Playwright 使用 BrowserContext 來實現這一點,這些相當於類似無痕模式的配置檔。它們建立快速且成本低,並且完全隔離,即使在單一瀏覽器中執行時也是如此。Playwright 為每個測試建立一個 context,並在該 context 中提供一個預設的 Page。
為什麼測試隔離很重要?
- 沒有失敗攜帶。如果一個測試失敗,它不會影響其他測試。
- 容易偵錯錯誤或不穩定,因為你可以根據需要多次執行單個測試。
- 在平行執行、分片等時,不必考慮順序。
兩種測試隔離方法
在測試隔離方面有兩種不同的策略: 從頭開始或在測試之間進行清理。在測試之間進行清理的問題是,容易忘記清理,有些東西是無法清理的,例如"已訪問的連結"。一個測試的狀態可能會洩漏到下一個測試中,這可能會導致測試失敗,並且由於問題來自另一個測試,使得除錯變得更加困難。從頭開始意味著一切都是新的,所以如果測試失敗,你只需要在該測試內進行除錯。
Playwright 如何實現測試隔離
Playwright 使用瀏覽器上下文來實現測試隔離。每個測試都有自己的瀏覽器上下文。執行測試時,每次都會建立一個新的瀏覽器上下文。當使用 Playwright 作為測試執行器時,瀏覽器上下文會預設建立。否則,你可以手動建立瀏覽器上下文。
- Test
- Library
import { test } from '@playwright/test';
test('example test', async ({ page, context }) => {
// "context" is an isolated BrowserContext, created for this specific test.
// "page" belongs to this context.
});
test('another test', async ({ page, context }) => {
// "context" and "page" in this second test are completely
// isolated from the first test.
});
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
瀏覽器上下文也可以用來模擬涉及行動裝置、權限、語言環境和顏色方案的多頁面場景。查看我們的模擬指南以獲取更多資訊。
單一測試中的多個上下文
Playwright 可以在單一情境中建立多個瀏覽器上下文。這在你想測試多使用者功能(如聊天)時非常有用。
- Test
- Library
import { test } from '@playwright/test';
test('admin and user', async ({ browser }) => {
// Create two isolated browser contexts
const adminContext = await browser.newContext();
const userContext = await browser.newContext();
// Create pages and interact with contexts independently
const adminPage = await adminContext.newPage();
const userPage = await userContext.newPage();
});
const { chromium } = require('playwright');
// Create a Chromium browser instance
const browser = await chromium.launch();
// Create two isolated browser contexts
const userContext = await browser.newContext();
const adminContext = await browser.newContext();
// Create pages and interact with contexts independently
const adminPage = await adminContext.newPage();
const userPage = await userContext.newPage();