JUnit(实验性)
简介
只需几行代码,即可将 Playwright 连接到您最喜欢的 Java 测试运行器。
在 JUnit 中,您可以使用 Playwright fixture 自动初始化 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");
}
}
Fixture
只需将 JUnit 注解 @UsePlaywright
添加到您的测试类中即可启用 Playwright fixture。测试 fixture 用于为每个测试建立环境,为测试提供它需要的一切,而没有其他东西。
@UsePlaywright
public class TestExample {
@Test
void basicTest(Page page) {
page.navigate("https://playwright.net.cn/");
assertThat(page).hasTitle(Pattern.compile("Playwright"));
}
}
Page page
参数告诉 JUnit 设置 page
fixture 并将其提供给您的测试方法。
以下是预定义 fixture 的列表
Fixture | 类型 | 描述 |
---|---|---|
page | Page | 此测试运行的隔离页面。 |
browserContext | BrowserContext | 此测试运行的隔离上下文。page fixture 也属于此上下文。 |
browser | Browser | 浏览器在测试之间共享以优化资源。 |
playwright | Playwright | Playwright 实例在同一线程上运行的测试之间共享。 |
request | APIRequestContext | 此测试运行的隔离 APIRequestContext。了解如何进行 API 测试。 |
自定义选项
要自定义 fixture 选项,您应该实现一个 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.net.cn"));
}
}
@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