JUnit(実験的)
はじめに
数行のコードで、Playwrightをお好みのJavaテストランナーに接続できます。
JUnitでは、Playwrightのフィクスチャを使用して、Playwright、Browser、BrowserContext、またはPageを自動的に初期化できます。以下の例では、3つのテストメソッドすべてが同じ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");
}
}
フィクスチャ
テストクラスにJUnitのアノテーション@UsePlaywright
を追加するだけで、Playwrightのフィクスチャを有効にできます。テストフィクスチャは、各テストの環境を確立するために使用され、テストに必要なものすべてを提供し、それ以外のものは提供しません。
@UsePlaywright
public class TestExample {
@Test
void basicTest(Page page) {
page.navigate("https://playwright.dokyumento.jp/");
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.dokyumento.jp"));
}
}
@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