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.org.tw/");
assertThat(page).hasTitle(Pattern.compile("Playwright"));
}
}
Page page
引數告知 JUnit 設定 page
fixture 並將其提供給您的測試方法。
以下是預先定義的 fixtures 清單
Fixture | 類型 | 描述 |
---|---|---|
page | Page | 此測試執行隔離的頁面。 |
browserContext | BrowserContext | 此測試執行隔離的 context。page fixture 也屬於此 context。 |
browser | Browser | 瀏覽器在測試之間共享,以優化資源。 |
playwright | Playwright | Playwright 執行個體在同一執行緒上運行的測試之間共享。 |
request | APIRequestContext | 此測試執行隔離的 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