跳到主要內容

JUnit (實驗性)

簡介

透過幾行程式碼,您可以將 Playwright 連接到您最愛的 Java 測試執行器。

JUnit 中,您可以使用 Playwright fixtures 自動初始化 PlaywrightBrowserBrowserContextPage。在以下範例中,所有三個測試方法都使用相同的 Browser。每個測試都使用自己的 BrowserContextPage

package org.example;

import com.microsoft.playwright.Page;
import com.microsoft.playwright.junit.UsePlaywright;
import org.junit.jupiter.api.Test;

import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;

@UsePlaywright
public class TestExample {
@Test
void shouldClickButton(Page page) {
page.navigate("data:text/html,<script>var result;</script><button onclick='result=\"Clicked\"'>Go</button>");
page.locator("button").click();
assertEquals("Clicked", page.evaluate("result"));
}

@Test
void shouldCheckTheBox(Page page) {
page.setContent("<input id='checkbox' type='checkbox'></input>");
page.locator("input").check();
assertEquals(true, page.evaluate("window['checkbox'].checked"));
}

@Test
void shouldSearchWiki(Page page) {
page.navigate("https://www.wikipedia.org/");
page.locator("input[name=\"search\"]").click();
page.locator("input[name=\"search\"]").fill("playwright");
page.locator("input[name=\"search\"]").press("Enter");
assertThat(page).hasURL("https://en.wikipedia.org/wiki/Playwright");
}
}

Fixtures

僅需將 JUnit 註解 @UsePlaywright 新增至您的測試類別,即可啟用 Playwright fixtures。測試 fixtures 用於為每個測試建立環境,提供測試所需的一切,僅此而已。

@UsePlaywright
public class TestExample {

@Test
void basicTest(Page page) {
page.navigate("https://playwright.dev.org.tw/");

assertThat(page).hasTitle(Pattern.compile("Playwright"));
}
}

Page page 引數告知 JUnit 設定 page fixture 並將其提供給您的測試方法。

以下是預先定義的 fixtures 清單

Fixture類型描述
pagePage此測試執行隔離的頁面。
browserContextBrowserContext此測試執行隔離的 context。page fixture 也屬於此 context。
browserBrowser瀏覽器在測試之間共享,以優化資源。
playwrightPlaywrightPlaywright 執行個體在同一執行緒上運行的測試之間共享。
requestAPIRequestContext此測試執行隔離的 APIRequestContext。瞭解如何進行 API 測試

自訂選項

若要自訂 fixture 選項,您應該實作 OptionsFactory 並在 @UsePlaywright() 註解中指定類別。

您可以輕鬆覆寫 BrowserType.launch() 的啟動選項,或 Browser.newContext()APIRequest.newContext() 的 context 選項。請參閱以下範例

import com.microsoft.playwright.junit.Options;
import com.microsoft.playwright.junit.OptionsFactory;
import com.microsoft.playwright.junit.UsePlaywright;

@UsePlaywright(MyTest.CustomOptions.class)
public class MyTest {

public static class CustomOptions implements OptionsFactory {
@Override
public Options getOptions() {
return new Options()
.setHeadless(false)
.setContextOption(new Browser.NewContextOptions()
.setBaseURL("https://github.com"))
.setApiRequestOptions(new APIRequest.NewContextOptions()
.setBaseURL("https://playwright.dev.org.tw"));
}
}

@Test
public void testWithCustomOptions(Page page, APIRequestContext request) {
page.navigate("/");
assertThat(page).hasURL(Pattern.compile("github"));

APIResponse response = request.get("/");
assertTrue(response.text().contains("Playwright"));
}
}

平行執行測試

預設情況下,JUnit 會在單一執行緒上依序執行所有測試。從 JUnit 5.3 開始,您可以變更此行為以平行執行測試,從而加速執行速度 (請參閱此頁面)。由於從多個執行緒使用相同的 Playwright 物件並不安全,且沒有額外的同步處理,因此我們建議您為每個執行緒建立 Playwright 執行個體,並在該執行緒上專門使用它。以下是如何平行執行多個測試類別的範例。

@UsePlaywright
class Test1 {
@Test
void shouldClickButton(Page page) {
page.navigate("data:text/html,<script>var result;</script><button onclick='result=\"Clicked\"'>Go</button>");
page.locator("button").click();
assertEquals("Clicked", page.evaluate("result"));
}

@Test
void shouldCheckTheBox(Page page) {
page.setContent("<input id='checkbox' type='checkbox'></input>");
page.locator("input").check();
assertEquals(true, page.evaluate("window['checkbox'].checked"));
}

@Test
void shouldSearchWiki(Page page) {
page.navigate("https://www.wikipedia.org/");
page.locator("input[name=\"search\"]").click();
page.locator("input[name=\"search\"]").fill("playwright");
page.locator("input[name=\"search\"]").press("Enter");
assertThat(page).hasURL("https://en.wikipedia.org/wiki/Playwright");
}
}

@UsePlaywright
class Test2 {
@Test
void shouldReturnInnerHTML(Page page) {
page.setContent("<div>hello</div>");
assertEquals("hello", page.innerHTML("css=div"));
}

@Test
void shouldClickButton(Page page) {
Page popup = page.waitForPopup(() -> {
page.evaluate("window.open('about:blank');");
});
assertEquals("about:blank", popup.url());
}
}

設定 JUnit 以依序執行每個類別中的測試,並在平行執行緒上執行多個類別 (執行緒的最大數量等於 CPU 核心數量的 1/2)

junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = same_thread
junit.jupiter.execution.parallel.mode.classes.default = concurrent
junit.jupiter.execution.parallel.config.strategy=dynamic
junit.jupiter.execution.parallel.config.dynamic.factor=0.5