01 使用JUnit5执行测试脚本

Playwright测试可以通过多种方式进行。我们建议将它连接到你最喜欢的测试运行器,例如JUnit,JUint能够并行运行测试、运行单个测试等。

你可以运行单个测试、一组测试或所有测试。测试可以在一个浏览器或多个浏览器上运行。默认情况下,测试以无头方式运行,这意味着在运行测试时不会打开浏览器窗口,并且会在终端中看到结果。如果你愿意,可以使用launch(new BrowserType.LaunchOptions().setHeadless(false))选项以引导模式运行测试。

Playwright 和 Browser 实例可以在测试之间重复使用以获得更好的性能。建议在新的 BrowserContext 中运行每个测试用例,这样浏览器状态将在测试之间隔离。

在JUnit中,你可以在@BeforeAll方法中初始化Playwright和Browser并在@AfterAll中销毁它们。在下面的示例中,所有三种测试方法都使用相同的Browser。每个测试都使用自己的BrowserContext和Page。

import com.microsoft.playwright.*;

import org.junit.jupiter.api.*;

import java.util.Collections;

import static org.junit.jupiter.api.Assertions.assertEquals;

import static org.junit.jupiter.api.Assertions.assertTrue;

/**

* @author 作者:测试工程师成长之路

* @version 创建时间:2023/5/10

* 类说明:使用JUnit运行测试用例

*/

public class JUnitTest {

// 该类所有测试之间共享

static Playwright playwright;

static Browser browser;

// 为每个测试方法建立新的实例。

BrowserContext context;

Page page;

@BeforeAll

static void launchBrowser() {

System.out.println("初始化浏览器,打开chrome");

playwright = Playwright.create();

browser = playwright.chromium().launch(new BrowserType.LaunchOptions()

.setChannel("chrome")

.setHeadless(false));

}

@AfterAll

static void closeBrowser() {

System.out.println("关闭浏览器");

playwright.close();

}

@BeforeEach

void createContextAndPage() {

System.out.println("创建context和page");

context = browser.newContext(new Browser.NewContextOptions().setViewportSize(1440,1880));

page = context.newPage();

}

@AfterEach

void closeContext() {

System.out.println("关闭context");

context.close();

}

@Test

void shouldClickButton() throws InterruptedException {

System.out.println("执行测试用例:shouldClickButton");

page.navigate("data:text/html,");

page.locator("button").click();

assertEquals("Clicked", page.evaluate("result"));

Thread.sleep(3000);

}

@Test

void shouldCheckTheBox() throws InterruptedException {

System.out.println("执行测试用例:shouldCheckTheBox");

page.setContent("");

page.locator("input").check();

assertTrue((Boolean) page.evaluate("() => window['checkbox'].checked"));

Thread.sleep(3000);

}

@Test

void shouldSearchWiki() throws InterruptedException {

System.out.println("执行测试用例:shouldSearchWiki");

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");

assertEquals("https://en.wikipedia.org/wiki/Playwright", page.url());

Thread.sleep(3000);

}

}

02 并发执行测试脚本

默认情况下,JUnit 将在单个线程上按顺序运行所有测试。从 JUnit 5.3开始,你可以更改此行为以并行运行测试以加快执行速度。由于在没有额外同步的情况下从多个线程使用相同的 Playwright 对象是不安全的,我们建议你为每个线程创建 Playwright 实例并在该线程上独占使用它。这是一个如何并行运行多个测试类的示例。使用

@TestInstance(TestInstance.Lifecycle.PER_CLASS)注释使 JUnit 为该类中的所有测试方法创建一个类的实例(默认情况下,每个 JUnit 将为每个测试方法创建一个新的类实例)。在实例字段中存储Playwright和Browser对象。它们将在测试之间共享。该类的每个实例都将使用它自己的 Playwright 副本。

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

import static org.junit.jupiter.api.Assertions.assertTrue;

/**

* @author 作者:测试工程师成长之路

* @version 创建时间:2023/5/10

* 类说明:并行运行测试用例1

*/

public class JUnitThreadTest1 extends JUnitTest{

@Test

void shouldClickButton() throws InterruptedException {

System.out.println(this.getClass() + "-shouldClickButton-" + Thread.currentThread().getName());

page.navigate("data:text/html,");

page.locator("button").click();

assertEquals("Clicked", page.evaluate("result"));

Thread.sleep(3000);

}

@Test

void shouldCheckTheBox() throws InterruptedException {

System.out.println(this.getClass() + "-shouldCheckTheBox-" + Thread.currentThread().getName());

page.setContent("");

page.locator("input").check();

assertTrue((Boolean) page.evaluate("() => window['checkbox'].checked"));

Thread.sleep(3000);

}

@Test

void shouldSearchWiki() throws InterruptedException {

System.out.println(this.getClass() + "-shouldSearchWiki-" + Thread.currentThread().getName());

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");

assertEquals("https://en.wikipedia.org/wiki/Playwright", page.url());

Thread.sleep(3000);

}

}

import com.microsoft.playwright.Page;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**

* @author 作者:测试工程师成长之路

* @version 创建时间:2023/5/10

* 类说明:并行运行测试用例2

*/

public class JUnitThreadTest2 extends JUnitThread {

@Test

void shouldReturnInnerHTML() throws InterruptedException {

System.out.println(this.getClass() + "-shouldReturnInnerHTML-" + Thread.currentThread().getName());

page.setContent("

hello
");

assertEquals("hello", page.innerHTML("css=div"));

Thread.sleep(3000);

}

@Test

void shouldClickButton() throws InterruptedException {

System.out.println(this.getClass() + "-shouldClickButton-" + Thread.currentThread().getName());

Page popup = page.waitForPopup(() -> {

page.evaluate("window.open('about:blank');");

});

assertEquals("about:blank", popup.url());

Thread.sleep(3000);

}

}

import org.junit.platform.runner.JUnitPlatform;

import org.junit.platform.suite.api.SelectClasses;

import org.junit.runner.RunWith;

/**

* @author 作者:jinzy

* @version 创建时间:2023/5/10

* 类说明:并行运行测试用例

*/

@RunWith(JUnitPlatform.class)

@SelectClasses( {JUnitThreadTest1.class,JUnitThreadTest2.class})

public class JUnitThreadRunner {

}

配置 JUnit 以在每个类中按顺序运行测试并在并行线程上运行多个类(最大线程数等于 CPU 内核数的 1/2),在src/main/resources下创建junit-platform.properties文件,文件内容如下

# 是否允许并行执行true/false

junit.jupiter.execution.parallel.enabled = true

# 是否支持方法级别多线程same_thread/concurrent

junit.jupiter.execution.parallel.mode.default = same_thread

# 是否支持类级别多线程same_thread/concurrent

junit.jupiter.execution.parallel.mode.classes.default = concurrent

junit.jupiter.execution.parallel.config.strategy=dynamic

junit.jupiter.execution.parallel.config.dynamic.factor=0.5

 

03 自动生成测试脚本

Playwright 具有开箱即用的生成测试脚本的功能,是快速开始编写测试脚本的最佳方法。它将打开两个窗口,一个是浏览器窗口,可以在其中与要测试的网站进行交互,另一个是 Playwright Inspector 窗口,可以在其中记录测试、复制测试、清除测试以及更改测试语言。

1.运行测试生成器

mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="codegen demo.playwright.dev/todomvc"

2.代码录制

codegen在浏览器中运行和执行操作。Playwright 将为用户交互生成代码。Codegen将查看呈现的页面并找出推荐的定位器、优先级角色、文本和测试 id 定位器。如果生成器识别出与定位器匹配的多个元素,它将改进定位器,使其具唯一标识目标元素,从而消除和减少由于定位器导致的测试失败。

按下Record按钮停止录制,Pick Locator按钮将出现。单击该Pick Locator按钮,然后将鼠标悬停在浏览器窗口中的元素上,以查看每个元素下方突出显示的定位器。要选择一个定位器,请单击要定位的元素,该定位器的代码将出现在“选择定位器”按钮旁边的字段中。然后,可以在此字段中编辑定位器以对其进行微调,或使用复制按钮将其复制并粘贴到代码中。

import com.microsoft.playwright.*;

import com.microsoft.playwright.options.AriaRole;

import com.microsoft.playwright.*;

import com.microsoft.playwright.options.*;

import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;

import java.util.*;

/**

* @author 作者:测试工程师成长之路

* @version 创建时间:2023/5/10

* 类说明: 自动生成测试脚本

* 打开终端或idea终端,执行:mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="codegen demo.playwright.dev/todomvc"

*/

public class CodegenRecordTest {

public static void main(String[] args) {

try (Playwright playwright = Playwright.create()) {

Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions()

.setHeadless(false));

BrowserContext context = browser.newContext();

Page page = context.newPage();

page.navigate("https://demo.playwright.dev/todomvc/");

page.navigate("https://demo.playwright.dev/todomvc/#/");

page.getByPlaceholder("What needs to be done?").click();

page.getByPlaceholder("What needs to be done?").fill("playwright");

page.getByPlaceholder("What needs to be done?").press("Enter");

page.getByRole(AriaRole.CHECKBOX, new Page.GetByRoleOptions().setName("Toggle Todo")).check();

page.getByRole(AriaRole.LINK, new Page.GetByRoleOptions().setName("Active")).click();

page.getByRole(AriaRole.LINK, new Page.GetByRoleOptions().setName("Completed")).click();

page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Clear completed")).click();

}

}

}

 

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: