JUnit (實驗性)
簡介
只需幾行程式碼,你就可以將 Playwright 連接到你最喜愛的 Java 測試執行器。
在 JUnit 中,你可以使用 Playwright fixtures 自動初始化 Playwright、Browser、BrowserContext 或 Page。在下面的範例中,所有三個測試方 法使用相同的 Browser。每個測試使用自己的 BrowserContext 和 Page。
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/");
assertThat(page).hasTitle(Pattern.compile("Playwright"));
}
}
Page page
參數告訴 JUnit 設定 page
固定裝置並將其提供給您的測試方法。
以下是預先定義的固定裝置清單:
Fixture | Type | Description |
---|---|---|
page | Page | 此測試執行的獨立頁面。 |
browserContext | BrowserContext | 此測試執行的獨立上下文。page 物件也屬於此上下文。 |
browser | Browser | 瀏覽器在測試間共享以優化資源。 |
playwright | Playwright | Playwright 實例在同一執行緒上的測試間共享。 |
request | APIRequestContext | 此測試執行的獨立 APIRequestContext。了解如何進行 API 測試。 |
自訂選項
要自訂固定裝置選項,您應該實作一個 OptionsFactory
並在 @UsePlaywright()
註釋中指定該類別。
您可以輕鬆地覆寫 BrowserType.launch() 的啟動選項,或 Browser.newContext() 和 APIRequest.newContext() 的上下文選項。請參閱以下範例。
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"));
}
}
@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 核心數的一半):
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