JUnit(實驗性)
簡介
只需幾行程式碼,您就可以將 Playwright 連結到您喜愛的 Java 測試執行器。
在 JUnit 中,您可以使用 Playwright 佈置來自動初始化 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 佈置。測試佈置用於為每個測試建立環境,提供測試所需的一切,而非其他。
@UsePlaywright
public class TestExample {
@Test
void basicTest(Page page) {
page.navigate("https://playwright.dev/");
assertThat(page).hasTitle(Pattern.compile("Playwright"));
}
}
Page page
參數告訴 JUnit 設定 page
佈置並將其提供給您的測試方法。
以下是預先定義的佈置清單:
佈置 | 類型 | 說明 |
---|---|---|
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 核心數的 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