尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Playwright Java 的 JUnit 集成:用 @UsePlaywright 注解实现 Page 自动注入与并行测试

Playwright Java 的 JUnit 集成:用 @UsePlaywright 注解实现 Page 自动注入与并行测试 Playwright Java 的 JUnit 集成用 UsePlaywright 注解实现 Page 自动注入与并行测试【免费下载链接】playwrightPlaywright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.项目地址: https://gitcode.com/GitHub_Trending/pl/playwright本文基于 Playwright 官方 Java 文档中的 JUnit 集成指南docs/src/junit-java.md撰写。读完本篇你将掌握如何通过一个UsePlaywright注解让 JUnit 5 自动初始化 Playwright、BrowserContext、Page 等测试依赖如何用OptionsFactory定制启动与上下文参数以及如何配合 JUnit 5.3 的并行执行机制安全地跑起多测试类。什么是 Playwright 的 JUnit 集成在 JUnit 5 测试框架中Playwright 提供了实验性的 Fixture测试夹具集成只需在测试类上加一行注解就能自动完成 Playwright、Browser、BrowserContext、Page 乃至 APIRequestContext 的初始化与生命周期管理免去手写在BeforeAll/BeforeEach中反复创建、关闭对象的样板代码。从仓库的 Java 版发布说明可以看到该能力在 Version 1.42 中以 Experimental JUnit integration 的标题首次引入见 docs/src/release-notes-java.md并明确提供了 Page、BrowserContext、Browser、APIRequestContext 和 Playwright 五类夹具。因此在使用前应理解它的适用前提面向JUnit 5测试类文档中标注为experimental实验性特性API 后续可能调整生产项目引入前建议关注版本说明它是 docs/src/running-tests-java.md 中手动管理BeforeAll/AfterAll生命周期写法的替代品两者目标相同所有测试方法共享同一个Browser每个测试方法独享自己的BrowserContext和Page从而保证测试间状态隔离。准备工作Maven 依赖与 Codegen 骨架JUnit 集成属于 Playwright Java 客户端的一部分随com.microsoft.playwright:playwright这个 Maven 依赖一起分发。按 docs/src/intro-java.md 中的安装说明在pom.xml中加入dependency groupIdcom.microsoft.playwright/groupId artifactIdplaywright/artifactId version%%VERSION%%/version !-- 替换为当前使用的 Playwright 版本 -- /dependency系统要求为 Java 8 及以上首次编译运行时会下载 Playwright 驱动与浏览器二进制Chromium、Firefox、WebKit。一个实用的起步方式是使用 Playwright CLI 的 codegen 生成 JUnit 风格骨架。从仓库的测试代码CLI 支持--targetjava-junit目标生成的代码会直接导入com.microsoft.playwright.junit.UsePlaywright并按 JUnit 测试类组织。仓库中的测试 tests/library/inspector/cli-codegen-java.spec.ts 验证了这一行为——生成的 Java 代码 import 了UsePlaywright说明该注解是 codegen 面向 JUnit 场景的标准产物。核心用法UsePlaywright 注解与夹具注入启用方式非常简单在测试类上添加UsePlaywright注解然后在测试方法签名中声明需要注入的参数。以官方文档的完整示例为例三个测试方法共享同一个Browser但各自拥有独立的BrowserContext和Pagepackage 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,scriptvar result;/scriptbutton onclickresult\Clicked\Go/button); page.locator(button).click(); assertEquals(Clicked, page.evaluate(result)); } Test void shouldCheckTheBox(Page page) { page.setContent(input idcheckbox typecheckbox/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); } }Page page这个方法参数的作用就是告诉 JUnit经由 Playwright 的夹具实现为该测试方法设置page夹具并把它作为参数传入。测试中可以直接混用 JUnit 自带的断言assertEquals与 Playwright 的 Web-first 断言PlaywrightAssertions.assertThat后者提供自动重试、带诊断信息的等待语义适合 URL、标题、可见性等页面状态断言。预定义夹具一览官方文档定义了以下预定义夹具可按参数名注入到任意测试方法Fixture类型说明pagePage本次测试运行独占的隔离页面。browserContextBrowserContext本次测试运行独占的隔离上下文page夹具就属于这个上下文。browserBrowser浏览器在测试之间共享以优化资源。playwrightPlaywrightPlaywright 实例在同一个线程上运行的测试之间共享。requestAPIRequestContext本次测试运行独占的 APIRequestContext可用于 API 测试。几个值得注意的设计点隔离粒度page与browserContext是每次测试方法粒度browser是整个测试类共享粒度playwright是同一线程粒度。这与手动管理方式BeforeEach建 context、AfterEach关 context达到相同的隔离效果但生命周期全部由夹具托管。线程安全含义playwright夹具按线程共享这一条直接源于 Playwright Java 不是线程安全 API 的约束。docs/src/threading-java.md 明确指出Playwright 对象及其创建的所有对象Browser、Page 等预期都在创建它的那个线程上调用正确做法是每个线程各自创建独立的 Playwright 实例。夹具的按线程共享设计正是为了在不破坏线程安全性的前提下复用进程级资源。定制夹具参数实现 OptionsFactory如果需要修改启动参数、上下文参数或 API 请求上下文参数只需实现OptionsFactory接口并在UsePlaywright()注解中指定该实现类。从接口命名看Options聚合了三类可覆盖的选项BrowserType.launch的启动选项、Browser.newContext的上下文选项、APIRequest.newContext的 API 请求选项。完整示例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)); } }示例中体现了三个典型定制点setHeadless(false)让夹具以有头模式启动浏览器便于本地调试setContextOption(new Browser.NewContextOptions().setBaseURL(https://github.com))为页面设置 base URL于是page.navigate(/)相对路径解析为https://github.com/setApiRequestOptions(new APIRequest.NewContextOptions().setBaseURL(https://playwright.dev))为注入的request夹具单独设置 base URLrequest.get(/)即请求https://playwright.dev。这三类选项最终对应到 Playwright 客户端既有的 API 参数体系BrowserType.launch、Browser.newContext、APIRequest.newContext因此任何在这三个 API 上可用的参数视口、locale、时区、HTTP 头等都可以在OptionsFactory中表达。并行执行JUnit 并行配置与线程约束默认情况下 JUnit 5 在单线程上顺序执行所有测试。从 JUnit 5.3 起可以开启并行执行以提速。由于直接跨线程共享同一批 Playwright 对象并不安全原因见上文线程安全含义官方推荐的做法是让每个线程持有并独占自己的 Playwright 实例。而UsePlaywright的夹具模型天然满足这一点——playwright夹具按线程共享browser共享、browserContext/page按测试隔离因此可以直接把多个测试类并行起来。下面是一对可并行运行的测试类示例每个类各自带UsePlaywright使用独立的 Page 夹具UsePlaywright class Test1 { Test void shouldClickButton(Page page) { page.navigate(data:text/html,scriptvar result;/scriptbutton onclickresult\Clicked\Go/button); page.locator(button).click(); assertEquals(Clicked, page.evaluate(result)); } Test void shouldCheckTheBox(Page page) { page.setContent(input idcheckbox typecheckbox/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(divhello/div); assertEquals(hello, page.innerHTML(cssdiv)); } Test void shouldClickButton(Page page) { Page popup page.waitForPopup(() - { page.evaluate(window.open(about:blank);); }); assertEquals(about:blank, popup.url()); } }配合如下 JUnit 并行配置可写入junit-platform.properties实现类内顺序执行、多类并行、线程数取 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.strategydynamic junit.jupiter.execution.parallel.config.dynamic.factor0.5各配置项含义配置项值作用junit.jupiter.execution.parallel.enabledtrue开启 JUnit 5.3 并行执行。junit.jupiter.execution.parallel.mode.defaultsame_thread默认模式下同一类内的测试方法仍在同一线程上顺序执行。junit.jupiter.execution.parallel.mode.classes.defaultconcurrent不同测试类之间在并行线程上并发执行。junit.jupiter.execution.parallel.config.strategydynamic使用动态线程策略。junit.jupiter.execution.parallel.config.dynamic.factor0.5最大线程数 CPU 核数 × 0.5即官方建议的一半核数。这种类间并行 类内串行的组合恰好与夹具的共享粒度匹配并行的单位是测试类每个类线程有自己独占的 Playwright 实例和浏览器进程类内方法则复用同一个Browser、各用各的 Context 与 Page既提速又不触碰线程安全边界。与手动生命周期管理方式的对比为了准确评估该集成可以对照 docs/src/running-tests-java.md 中的手动管理写法手动方式需要自己声明静态字段Playwright playwright、Browser browser用BeforeAll创建、AfterAll关闭浏览器再用BeforeEach/AfterEach创建/关闭上下文与页面。JUnit 夹具集成把这套模板代码整体替换为类上的UsePlaywright加方法参数注入并且额外提供了requestAPIRequestContext这类手动方式没有开箱即用的夹具。两种方式的共享/隔离语义一致同 Browser、独立 Context 和 Page选择哪种取决于项目对样板代码的容忍度和对实验性 API 的接受程度。小结与适用边界UsePlaywright注解是 Playwright Java 与 JUnit 5 集成的入口通过方法参数注入page、browserContext、browser、playwright、request五类预定义夹具夹具的共享粒度Browser 共享、Context/Page 按测试隔离、Playwright 按线程共享与 Playwright Java 非线程安全的约束严格对应可安全支持 JUnit 的类间并行OptionsFactoryOptions是定制入口覆盖launch启动选项、Browser.newContext上下文选项、APIRequest.newContextAPI 请求选项三个层面该特性在官方文档中定位为 experimental1.42 引入建议在版本升级时对照 docs/src/release-notes-java.md 中的 Java 发布说明确认 API 稳定性。【免费下载链接】playwrightPlaywright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.项目地址: https://gitcode.com/GitHub_Trending/pl/playwright创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表