使用 Java 大规模运行自动化测试





5.00/5 (1投票)
本文将讨论 Selenium,如何设置它,以及如何使用 Java 创建自动化测试脚本。
互联网广泛普及,网页和移动平台对消费者的购买决策产生着强烈影响。因此,许多公司都在努力为客户提供高质量的数字体验。简单来说,全球范围内涌现了大量的网页和移动应用程序,数字存在已成为每个企业的重要优先事项。根据 Netcraft 2023 年 6 月的 Web 服务器调查,目前互联网上的网站数量已超过 11.06 亿个。
随着客户的决策越来越依赖于数字体验,组织也日益重视这种数字体验的质量。这意味着需要建立高标准的内部质量保证,最重要的是要投资于自动化测试以实现更快的发布周期。
那么,这和您作为开发人员或测试人员有什么关系?在当前的就业市场中,掌握自动化技能是极具吸引力的。此外,入门也很快。Selenium 是开始自动化测试的理想框架。它是最受欢迎的自动化测试框架,支持所有编程语言。
本文将讨论 Selenium,如何设置它,以及如何使用 Java 创建自动化测试脚本。接下来,我们将了解如何使用像 TestNG 这样的 Java 测试框架与 Selenium 结合,并通过 LambdaTest 在云端大规模执行并行测试。
目录
- 什么是 Selenium?
- 如何用 Java 设置 Selenium?
- 使用 Selenium 编写第一个自动化测试脚本
- 测试自动化框架的重要性
- TestNG 用于并行测试执行
- 本地 Grid 测试的挑战
- 在基于云的测试 Grid 上运行测试
- 结论
什么是 Selenium?
Selenium 是自动化测试 Web 应用程序的流行框架。在最近一项关于测试自动化的调查中,64.2% 的受访者表示他们使用 Selenium 来自动化测试。
Selenium 在所有现代 Web 浏览器上提供浏览器测试,例如 Google Chrome、Mozilla Firefox、Microsoft Edge、Safari 等。Selenium 支持的平台包括 Linux、Windows、MacOS 和 Solaris。自动化测试脚本可以用多种编程语言编写,如 Python、C#、Java、JavaScript (Node.js)、Ruby 等,使测试人员能够用最舒适的语言自动化其网站测试。
Selenium 框架主要包含三个组件。所有这些组件都可以单独运行,也可以相互配合以获得更大的效果。
Selenium IDE
Selenium IDE(集成开发环境)提供了一个友好的用户界面,允许开发人员和测试人员记录和播放测试脚本。Selenium IDE 可用于根据浏览器上执行的操作生成测试脚本。
Selenium WebDriver
Selenium WebDriver 是 Selenium 套件中最重要的组件之一,用于整体基于浏览器的自动化测试。WebDriver 是一个远程控制接口组件,它允许自动化脚本与浏览器交互、操作 DOM 元素以及管理用户代理的操作。总之,WebDriver 是 Selenium 和浏览器之间的桥梁,测试用例在该桥梁上运行。
Selenium Grid
Selenium Grid 主要用于在设备上针对多个支持的浏览器执行并行测试。由于 Selenium 支持几乎所有流行的浏览器和操作系统,因此 Selenium Grid 更容易在各种操作系统和各种浏览器上同时执行大量测试。
如何用 Java 设置 Selenium?
在编写我们的第一个 Selenium Java 自动化测试脚本之前,我们必须在系统上用 Java 设置好 Selenium。
必备组件
- 系统已安装 Java 开发工具包 (JDK)。
- 任何现代 Web 浏览器,如 Chrome 或 Firefox。
- 您喜欢的 IDE。在本例中,我们使用 Eclipse。
现在,让我们一步一步指导您完成集成过程。
- 从 Selenium 官方网站下载 Selenium 客户端和 WebDriver 语言绑定。在此,您可以选择适合我们需求的 Java 语言绑定。这将下载一个包含 WebDriver JAR 文件的 ZIP 文件。
- 现在打开 Eclipse IDE,通过导航到文件 > 新建 > Java 项目创建一个新项目,如下图所示,并为项目指定一个所需的名称。
- 项目创建完成后,通过右键单击项目,选择文件 > 新建 > 封装体来创建一个封装体,并指定所需的封装体名称。(可选)
- 同样,您可以通过导航到文件 > 新建 > 类来创建一个新的 Java 类。
- 最后一步,我们必须导入从 Selenium 网站下载的已解压的 WebDriver 文件。要添加,请右键单击项目名称,然后转到构建路径 > 配置构建路径。接下来,单击添加外部 JAR 按钮并找到下载的 JAR 文件。最后,单击应用并关闭按钮以保存更改。
使用 Selenium 编写第一个自动化测试脚本
是时候通过实际操作,用 Selenium 和 Java 编写自动化测试脚本了。我们将以一个简单且熟悉的待办事项列表Web 应用为例。
在本节中,我们将创建两个示例。从一个基本示例“打开网页并打印其标题”开始,我们还将涵盖一个稍微复杂的示例“向待办事项列表添加一项”。
示例 1:打开网页并打印其标题
在此示例中,我们将编写一个自动化测试脚本,使用 Selenium with Java 在 Chrome 浏览器中打开相同的待办事项列表网站。一旦网站完全加载,我们将打印网站的标题。
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class FirstProject {
public static void main(String[] args) {
// No need for setProperty as ChromeDriver() will auto install
// required browser driver for Chrome using Selenium Manager
WebDriver driver = new ChromeDriver();
// Open the "https://lambdatest.github.io/sample-todo-app/" web
// page on the browser
driver.get("https://lambdatest.github.io/sample-todo-app/");
// Add time Delay for complete page load
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Catch block to handle the exception
e.printStackTrace();
}
// Print the tile of the current tab
System.out.println(driver.getTitle());
// Close the current browser session
driver.quit();
}
}
控制台输出
代码演练
我们做的第一件事是导入执行测试所需的所有必要封装体。`WebDriver` 类来自 Selenium Java 库,用于自动化浏览器操作;`ChromeDriver` 类用于使用 Selenium Manager 为 Chrome 创建 WebDriver 实例。
接下来,我们使用 `ChromeDriver()` 方法初始化 Chrome 浏览器的 WebDriver。
初始化完成后,我们将进入主要目标,即在 Chrome 浏览器中打开网页。在这里,我们使用 WebDriver 对象的 `get()` 方法,该方法用于导航到特定 URL。它指示 Web 浏览器打开指定的 URL。
最后,我们使用 WebDriver 对象提供的 `getTitle()` 方法打印打开的网页的标题,该方法返回浏览器会话中打开的当前页面的标题。
在所有测试目标都实现后,就该关闭浏览器会话并释放系统内存了。
示例 2:添加待办事项列表
现在,我们将探索一个稍微交互式一些的示例,即向我们的待办事项列表添加一项“新增待办事项任务”。在这里,我们将使用 Mozilla Firefox 浏览器执行自动化任务。所以,让我们开始研究代码并理解它。
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By;
public class CloseCurrentTab {
public static void main(String[] args) {
// No need for setProperty as ChromeDriver() will auto install
// required browser driver for Chrome using Selenium Manager
WebDriver driver = new FirefoxDriver();
// Open the "https://lambdatest.github.io/sample-todo-app/"
// web page on the browser
driver.get("https://lambdatest.github.io/sample-todo-app/");
// Find the input field element by its 'id'.
WebElement inputbar = driver.findElement(By.id("sampletodotext"));
// Enter text into the input field.
inputbar.sendKeys("New todo task added");
// Find the submit button element by its 'id'.
WebElement submitBtn = driver.findElement(By.id("addbutton"));
// Click the submit button.
submitBtn.click();
// Add a time delay (5 seconds) for visibility and observability.
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Catch block to handle the exception
// (e.g., if sleep is interrupted).
e.printStackTrace();
}
// Close the current browser session
driver.quit();
}
}
输出
代码演练
在此示例中,我们必须导入 `WebElement` 和 `By` 类来选择 Web 页面上的元素进行交互。
然后,我们使用以下代码初始化 Firefox 浏览器。
接下来,我们打开待办事项应用,第一件事是找到网站上的输入栏。我们使用 `WedDriver` 的 `findElement()` 方法和 `By.id()` 方法来选择元素的唯一 ID。
然后,我们可以使用 `WebElement` 对象的 `sendKeys()` 方法键入要添加的待办事项列表,该方法将字符串发送到任何字段,例如表单的输入字段。
接下来,我们应该使用 `WebElement` 类选择提交按钮。
最后,我们可以使用 `WebElement` 类提供的 `click()` 方法点击添加按钮,将我们的待办事项添加到列表中。
测试自动化框架的重要性
众所周知,一个合适的自动化测试脚本应该启动浏览器,执行操作,提供数据,按照指示进行交互,评估结果,然后终止。是的,这是一项艰巨的任务!有时编写完美的脚本可能很困难。
测试自动化框架可以使这项任务变得更容易,因为它提供了系统化的技术来自动化、管理和组织测试。自动化框架使识别和调试编码问题变得更加容易。
如果我们将脚本组件只创建一次,并使其可供任何其他测试按需使用,那么自动化框架可以大大减少时间和精力,即它提供了可重用性——创建一次,调试一次,完成一次,然后多次重用。
Java 中 Selenium 的一个此类测试自动化框架是 TestNG。TestNG(此处 NG 代表“下一代”)是一个开源的 Java 单元测试自动化框架,在自动化测试人员和开发人员中获得了极大的欢迎。
TestNG 用于并行测试执行
JUnit 是 Java 生态系统中另一个著名的单元测试框架,TestNG 框架受到它的启发。然而,它提供了各种独特和高级的功能,使其比同类产品更加健壮。其中一个值得注意的功能是它对并行测试的无缝支持。
TestNG 使用 Java 的多线程,我们可以定义要为并行执行创建的线程数。基于此数量,创建多个线程,每个线程并行运行一个单独的测试。它提供了一个自动定义的 XML 文件,我们可以在其中将并行测试属性设置为 classes/methods/tests。
在使用此 TestNG 框架进行编码之前,我们必须通过以下步骤将其集成到我们的项目中
- 首先,导航到 Eclipse Marketplace 并安装 TestNG 插件。安装完成后,您可以在“已安装”部分找到它。
- 接下来,将 TestNG 库添加到您的项目中。为此,请导航到构建路径 > 配置构建路径。接下来,单击添加库按钮并选择 TestNG 库。
现在我们已经将 TestNG 集成到项目中,让我们创建第一个并行测试执行脚本。
import org.openqa.selenium.By;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
public class TestMethodParallelExecution {
@Test
void openAndPrintTitle() {
WebDriver driver = new FirefoxDriver();
// Open the "https://lambdatest.github.io/sample-todo-app/" web
// page on the browser
driver.get("https://lambdatest.github.io/sample-todo-app/");
// Add time Delay for complete page load
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Catch block to handle the exception
e.printStackTrace();
}
// Print the tile of the current tab
System.out.println(driver.getTitle());
}
@Test
void addNewTodoItem () {
WebDriver driver = new FirefoxDriver();
// Open the "https://lambdatest.github.io/sample-todo-app/" web page on the browser
driver.get("https://lambdatest.github.io/sample-todo-app/");
// Find the input field element by its 'id'.
WebElement inputbar = driver.findElement(By.id("sampletodotext"));
// Enter text into the input field.
inputbar.sendKeys("New todo task added");
// Find the submit button element by its 'id'.
WebElement submitBtn = driver.findElement(By.id("addbutton"));
// Click the submit button.
submitBtn.click();
// Add a time delay (5 seconds) to allow for visibility and observability.
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Catch block to handle the exception (e.g., if sleep is interrupted).
e.printStackTrace();
}
}
@AfterMethod
public void tearDown() throws Exception {
if (driver != null) {
driver.quit();
}
}
}
TestNG 配置 XML 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Parallel Test Suite" parallel="methods" thread-count="2">
<test name="First Test">
<classes>
<class name="testng2.TestMethodParallelExecution" />
</classes>
</test>
<!-- Test -->
</suite> <!-- Suite -->
代码演练
在 Java 代码中,测试的两个函数与之前的示例相同。这里唯一的附加项是注解。
@Test:此注解告诉 Selenium 下面的函数是一个测试,需要执行。
@AfterTest:此注解下的函数在所有测试执行完成后执行。
接下来,在 TestNG 配置 XML 文件中,我们使用 `suit` 标签的 `thread-count` 属性定义了要并行执行的线程数。
本地 Grid 测试的挑战
所有自动化测试都在我们的本地系统或 Grid 上进行。可以扩展吗?例如,管理本地基础架构、确保设备物理可用性以及安装各种必需版本的操作系统、浏览器和其他支持工具是一项艰巨的任务,而且成本效益不高。
因此,在所有主要可用的浏览器版本、平台和硬件规格上测试 Web 应用程序是一场噩梦。这会对我们在各种浏览器和平台上的测试覆盖率产生负面影响,而且稳定性不够。
我们可以利用现有的基于云的测试工具来克服这个问题。这些工具有很多优点,因为它们使我们能够在多个平台上进行跨浏览器测试。从而整体上实现更具扩展性和更高测试覆盖率。它们支持并行测试、更快的测试执行和改进的测试覆盖率。
LambdaTest 就是这样一个基于云的测试平台。LambdaTest 是一个由 AI 驱动的测试编排和执行平台,支持在 3000 多个浏览器、操作系统组合上进行自动化测试,以及一个在线 Selenium Grid,我们可以通过最少的更改将其集成到我们当前的测试项目中。LambdaTest 允许我们在 Online Selenium Grid 上针对各种浏览器版本运行测试。
在基于云的测试 Grid 上运行测试
本节将使用 Selenium 作为测试框架在 LambdaTest 上运行上述两个测试。我们将在 MAC 操作系统和最新版 Firefox 浏览器上进行测试。
在 LambdaTest 上运行此 Java 测试之前,请按照简单步骤操作
- 创建 LambdaTest 账户并完成所有必需的流程。
- 要获取您的凭证,请单击右上角的个人资料图标,然后导航到账户设置。
- 然后转到密码与安全。您可以找到您的用户名和访问密钥并保存以备将来使用。
为了在 LambdaTest 上运行我们的代码,您需要修改我们的测试用例。所以这里是修改后的代码。
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebElement;
import java.net.MalformedURLException;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.net.URL;
public class CloseCurrentTab {
// Your LambdaTest secrets and urls
String username = "YOUR USERNAME";
String accesskey = "YOUR ACCESS KEY";
static RemoteWebDriver driver = null;
String gridURL = "@hub.lambdatest.com/wd/hub";
boolean status = false;
public static void main(String[] args) {
new CloseCurrentTab().openAndPrintTitle();
new CloseCurrentTab().addNewTodoItem();
}
private void setUp() {
// Define Grid URL for LambdaTest Cloud Grid server
URL finalGridURL = new URL("https://" + username + ":" + accesskey + gridURL)
// Set Capabilities to help lambdatest understand you requirement
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "Firefox");
capabilities.setCapability("platformName", "macOS Ventura"); // If this cap isn't specified, it will just get any available one.
capabilities.setCapability("build", "Testing Todo list example");
capabilities.setCapability("name", "Open and Add a Todo");
capabilities.setCapability("project", "LambdaTest Example");
try {
driver = new RemoteWebDriver(finalGridURL, capabilities);
} catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
void openAndPrintTitle() {
setUp();
WebDriver driver = new FirefoxDriver();
// Open the "https://lambdatest.github.io/sample-todo-app/" web
// page on the browser
driver.get("https://lambdatest.github.io/sample-todo-app/");
// Add time Delay for complete page load
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Catch block to handle the exception
e.printStackTrace();
}
// Print the tile of the current tab
System.out.println(driver.getTitle());
// Close the current browser session
driver.quit();
}
void addNewTodoItem () {
setUp();
WebDriver driver = new FirefoxDriver();
// Open the "https://lambdatest.github.io/sample-todo-app/" web page on the browser
driver.get("https://lambdatest.github.io/sample-todo-app/");
// Find the input field element by its 'id'.
WebElement inputbar = driver.findElement(By.id("sampletodotext"));
// Enter text into the input field.
inputbar.sendKeys("New todo task added");
// Find the submit button element by its 'id'.
WebElement submitBtn = driver.findElement(By.id("addbutton"));
// Click the submit button.
submitBtn.click();
// Add a time delay (5 seconds) to allow for visibility and observability.
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Catch block to handle the exception (e.g., if sleep is interrupted).
e.printStackTrace();
}
// Close the current browser session
driver.quit();
}
}
代码详解
第一步也是最重要的一步是将您的凭证(用户名和访问密钥)添加到代码中。
然后我们创建 LambdaTest Grid Server 的 URL。此 URL 基本上告诉程序 LambdaTest Cloud Grid 的托管路径。
接下来,我们必须设置期望的 Capabilities 以在 LambdaTest 平台上运行我们的测试,定义诸如浏览器名称、浏览器版本、平台和测试名称之类的要求。您可以使用期望 Capabilities 生成器生成您的期望 Capabilities。
RemoteWebDriver
类实现了 WebDriver 接口,用于在远程机器上运行测试脚本。最后,我们需要使用此类通过以下代码初始化我们的远程服务器
恭喜!您已成功完成基于云的测试 Grid 的自动化测试。现在,您可以在自动化 > Web 自动化下找到您的测试结果。
结论
Selenium 结合 Java,在自动化测试方面表现出色。在本文中,我们通过学习 Selenium 的基础知识并使用 Selenium Java 创建了第一个测试,开启了我们的自动化测试之旅。我们探讨了像 LambdaTest 这样的基于云的测试平台如何帮助我们优化和增强我们的测试覆盖率。