TestNG 听众 Selenium

⚡ 智能摘要

听众 Selenium WebDriver 是 TestNG 用于拦截测试事件以自定义日志、报告和失败后操作的接口。本文将解释 ITestListener 的方法,并通过一个可运行的示例进行演示。 Java 例如,并阐明如何 Selenium 4 取代了已弃用的 WebDriverEventListener。

  • 听众的行为: 他们订阅了 TestNG 开始、通过、失败和跳过等事件可驱动日志记录或报告钩子。
  • 🧩 十二个接口: TestNG 提供 ITestListener、ISuiteListener、IReporter、IInvokedMethodListener 和 IAnnotationTransformer 等接口,以实现精细控制。
  • 🛠️ 两种接线方式: 在单个类上使用 @Listeners 注解附加监听器,或者在 testng.xml 中为每个测试套件注册一次。
  • 🚀 Selenium 4更新: EventFiringWebDriver 已弃用;现代的 WebDriverListener 接口加上 EventFiringDecorator 现在为 WebDriver 级别的事件钩子提供支持。
  • 🤖 人工智能视角: AI辅助监听器可以自动对故障进行分类,附加智能屏幕截图,并将不稳定的测试信号实时反馈到CI仪表板。

TestNG 听众 Selenium

Selenium WebDriver 脚本经常需要对测试事件做出反应,例如断言通过、定位器失败或步骤跳过。监听器使这一切成为可能。总的来说, Selenium 项目依赖于两类听众:

  1. WebDriver 监听器
  2. TestNG 听众

在本教程中,我们将重点关注 TestNG 监听器,并附上关于 WebDriver 级别监听器如何变化的说明 Selenium 4.x。

什么是监听器? TestNG?

监听器是一个接口,用于修改默认行为。 TestNG顾名思义,监听器“监听”在事件定义中定义的事件。 Selenium 编写脚本并做出相应的反应。您可以通过实现相关的监听器接口并将其注册到您的测试类或测试套件中来使用它们。监听器允许您自定义 TestNG 生成报告、附加屏幕截图并输出结构化日志。

听众类型 TestNG

TestNG 它提供了一系列监听器接口,每个接口都针对测试生命周期的不同阶段。

以下是一些常用的 TestNG 听众:

  1. 注释转换器
  2. IAnnotationTransformer2
  3. 可配置
  4. 配置监听器
  5. 执行监听器
  6. 挂钩
  7. 调用方法监听器
  8. IInvokedMethodListener2
  9. 方法拦截器
  10. iReporter
  11. 监听器
  12. 测试监听器

这些接口用于 Selenium 生成日志或自定义 TestNG 报告。在本教程中,我们将实现 测试监听器.

测试监听器 公开以下方法:

  • onStart – 在任何测试开始时调用。
  • onTestSuccess – 测试通过时调用。
  • onTestFailure – 当测试失败时调用。
  • onTestSkipped – 当跳过测试时调用。
  • onTestFailedButWithinSuccessPercentage – 当测试失败但仍在成功率范围内时调用。
  • 完成 – 在类中的所有测试执行完毕后调用。

测试场景

在本测试场景中,我们将实现登录过程的自动化。 测试监听器 反对。

  1. 正式上线 Firefox 并打开网站 https://demo.guru99.com/V4/

测试场景登录 URL

  1. 登录应用程序。

测试场景登录表单

创建步骤 TestNG 倾听者

针对上述测试场景,我们将逐步实现监听器。

步骤1) 创建一个名为“ 监听器测试 实现 测试监听器将鼠标悬停在红色下划线上, Eclipse 我们将提出两种快速解决方法,如下所示:

Eclipse 快速修复以添加未实现的方法

点击“添加未实现的方法”。多个存根方法(没有方法体)将被添加到您的代码中,类似于这样:

监听器演示;

进口 org.testng.ITestContext;
进口 org.testng.ITestListener;
进口 org.testng.ITestResult;

公开课 监听器测试 器物 测试监听器 {

@覆盖
公共无效 onFinish(测试上下文 arg0) {
// TODO 自动生成的方法存根
}

@覆盖
公共无效 onStart(测试上下文 arg0) {
// TODO 自动生成的方法存根
}

@覆盖
公共无效 onTestFailedButWithinSuccessPercentage(测试结果 arg0) {
// TODO 自动生成的方法存根
}

@覆盖
公共无效 onTestFailure(测试结果 arg0) {
// TODO 自动生成的方法存根
}

@覆盖
公共无效 onTestSkipped(测试结果 arg0) {
// TODO 自动生成的方法存根
}

@覆盖
公共无效 onTestStart(测试结果 arg0) {
// TODO 自动生成的方法存根
}

@覆盖
公共无效 onTestSuccess(测试结果 arg0) {
// TODO 自动生成的方法存根
}
}

现在让我们来修改一下 监听器测试 类。具体来说,我们将完善以下方法: 测试失败, 跳过测试, onTestStart测试成功.

更改很简单:每个方法都会打印测试名称,以便控制台清楚地显示通过、失败和跳过状态。

修改后的代码如下所示:

监听器演示;

进口 org.testng.ITestContext;
进口 org.testng.ITestListener;
进口 org.testng.ITestResult;

公开课 监听器测试 器物 测试监听器 {

@覆盖
公共无效 onFinish(测试上下文 结果) {
}

@覆盖
公共无效 onStart(测试上下文 结果) {
}

@覆盖
公共无效 onTestFailedButWithinSuccessPercentage(测试结果 结果) {
}

// 当测试用例失败时,将调用此方法。
@覆盖
公共无效 onTestFailure(测试结果 结果) {
系统.out.println(“失败的测试用例名称是:” + Result.getName());
}

// 当跳过某个测试用例时,将调用此方法。
@覆盖
公共无效 onTestSkipped(测试结果 结果) {
系统.out.println(“跳过的测试用例名称为:” + Result.getName());
}

// 当测试用例开始时,将调用此方法。
@覆盖
公共无效 onTestStart(测试结果 结果) {
System.out.println(Result.getName() + “测试用例已启动”);
}

// 当测试用例通过时,将调用此方法。
@覆盖
公共无效 onTestSuccess(测试结果 结果) {
系统.out.println(“通过的测试用例名称为:” + Result.getName());
}
}

步骤2) 创建另一个名为 测试用例 用于登录自动化。 Selenium 将执行此类以登录演示站点。

监听器演示;

进口 org.openqa.selenium.By;
进口 org.openqa.selenium.WebDriver;
进口 org.openqa.selenium.firefox。Firefox司机;
进口 org.testng.Assert;
进口 org.testng.annotations.Listeners;
进口 org.testng.annotations.Test;

公开课 测试用例 {
网络驱动程序 司机 = Firefox驱动器();

// 旨在通过的测试,以验证成功监听器。
@测试
公共无效 登录() {
驱动程序.get(“https://demo.guru99.com/V4/”);
driver.findElement(By.name(“uid”)).sendKeys(“mngr34926”);
driver.findElement(By.name(“密码”)).sendKeys(“amUpenu”);
driver.findElement(By.name(“btnLogin”))。点击();
}

// 强制执行失败的测试,以验证失败监听器。
@测试
公共无效 TestToFail() {
系统.out.println(“这种测试方法失败了”);
Assert.assertTrue(false);
}
}

步骤3) 接下来,将此监听器附加到我们的测试类中。 测试用例将类连接到监听器接口有两种方法。

第一种方法是使用 @听众 注释如下:

@Listeners(Listener_Demo.ListenerTest.class)

我们在上方添加此注释 测试用例 类。该类看起来如下所示:

监听器演示;

进口 org.openqa.selenium.By;
进口 org.openqa.selenium.WebDriver;
进口 org.openqa.selenium.firefox。Firefox司机;
进口 org.testng.Assert;
进口 org.testng.annotations.Listeners;
进口 org.testng.annotations.Test;

@Listeners(Listener_Demo.ListenerTest.class)
公开课 测试用例 {
网络驱动程序 司机 = Firefox驱动器();

// 测试通过,以验证成功监听器。
@测试
公共无效 登录() {
驱动程序.get(“https://demo.guru99.com/V4/”);
driver.findElement(By.name(“uid”)).sendKeys(“mngr34926”);
driver.findElement(By.name(“密码”)).sendKeys(“amUpenu”);
driver.findElement(By.name(“btnLogin”))。点击();
}

// 强制执行失败的测试,以验证失败监听器。
@测试
公共无效 TestToFail() {
系统.out.println(“这种测试方法失败了”);
Assert.assertTrue(false);
}
}

项目结构如下:

TestNG 听众项目结构

步骤4) 执行 测试用例 类内部的方法 监听器测试 根据带有注解的方法的行为自动调用 @测试.

步骤5) 验证控制台中显示的输出。

输出 测试用例 好像:

TestNG 监听器控制台输出

[TestNG] 跑步:
C:\Users\gauravn\AppData\Local\Temp\testng-eclipse–1058076918\testng-customsuite.xml

登录测试用例已启动
通过的测试用例名称为:登录
TestToFail 测试用例已启动
这种测试方法会失败
失败的测试用例名称为:TestToFail
通过:登录
失败:TestToFail
java.lang.AssertionError: 预期为 [true],但实际为 [false]

使用监听器监听多个类

如果一个项目有很多测试类,添加测试类 @听众 对每个条目进行注释会变得繁琐且容易出错。

在这种情况下,创建一个 测试ng.xml 文件和监听器只需注册一次。

testng.xml 监听器标签用于多个类

这个监听器会应用于整个测试套件,无论测试套件中包含多少个类。运行 XML 文件时,监听器会针对套件中声明的每个类触发,并且可以在同一个标​​签内链接任意数量的监听器类。

WebDriverListener 在 Selenium 4 与已弃用的 EventFiringWebDriver 对比

而 TestNG 监听器对测试生命周期事件做出反应,WebDriver 监听器对浏览器驱动程序的操作(例如点击、导航或 findElement 调用)做出反应。 Selenium 3. 典型的方法是 WebDriverEventListener 接口通过线缆连接 EventFiringWebDriver两者都已被弃用。 Selenium 4.x。

现代替代品是 WebDriverListener 界面与 事件触发装饰器:

进口 org.openqa.selenium.WebDriver;
进口 org.openqa.selenium.chrome.ChromeDriver;
进口 org.openqa.selenium.support.events.EventFiringDecorator;
进口 org.openqa.selenium.support.events.WebDriverListener;

公开课 日志监听器 器物 WebDriverListener {
@覆盖
公共无效 在获取之前网络驱动程序 driver, String url) {
系统.out.println(“导航至“ + url);
}
}

网络驱动程序 原始数据 = ChromeDriver();
网络驱动程序 司机 = 事件触发装饰器<>( LoggingListener()).decorate(raw);

装饰器可以包装任何 WebDriver、WebElement 或 Alert,这比旧的事件触发包装器更加灵活。 WebDriverListener 用于浏览器端可观测性 TestNG 测试监听器 用于套件级报告。

AI赋能的监听器:更智能的日志记录和故障分类

现代 Selenium 团队正越来越多地将人工智能服务集成到监听器中,以使CI信号更具可操作性。 测试失败一个人工智能辅助监听器可以捕获 DOM 快照和屏幕截图,将它们发送给一个模型,该模型会返回一个可能的根本原因集群,并将标签写回。 TestNG 报告或类似 ReportPortal 的工具。

常见的AI驱动模式包括:

  • 片状测试检测: 监听器将通过/失败时间线传递给模型,该模型将失败分类为不稳定的、环境的或真正的退化。
  • 智能截图: 计算机视觉模型可以裁剪、标注和比较 UI 屏幕截图,以便审阅者看到更改的区域,而不是整个页面转储。
  • 自愈定位器: A WebDriverListener 挂钩 在查找元素之前 当主定位器出现故障时,它会请求人工智能助手建议备用定位器。 没有这样的元素异常.
  • 自然语言摘要: An iReporter 实现过程将套件结果输入到 LLM 中,LLM 生成一段简短的总结。

监听层是注入这些钩子的最简洁的位置,因为它不会影响测试逻辑,并且能够统一应用于整个测试套件。

结语

监听器需要生成日志或者自定义 TestNG 报告中 Selenium WebDriver。

  • TestNG 提供了许多监听器接口;选择与您关心的事件相匹配的接口。
  • 监听器是用于以下方面的接口: Selenium WebDriver脚本用于响应测试生命周期事件。
  • 该教程演示了 测试监听器 考试分为通过和不通过两部分。
  • 你可以通过以下方式附加监听器: @听众 或者注册一次 测试ng.xml 整个套房。
  • Selenium 4.x 取代 EventFiringWebDriver - WebDriverListener + 事件触发装饰器 针对 WebDriver 级别的事件。

常见问题

监听器是一个接口,它订阅在运行过程中生成的事件。 Selenium 测试运行。 TestNG 监听器响应测试生命周期事件,例如开始、通过、失败和跳过。WebDriver 监听器响应浏览器驱动程序事件,例如点击、导航和 findElement 调用。

ITestListener 会针对每个 @Test 方法触发,并提供 onTestStart、onTestSuccess、onTestFailure、onTestSkipped 和 onFinish 事件。ISuiteListener 每个测试套件仅触发两次,即 onStart 和 onFinish,因此非常适合用于套件级别的设置,例如打开报告文件。

你可以注册一个 TestNG 有两种方法可以添加监听器:在测试类上方添加 @Listeners(MyListener.class) 注解,或者声明一个监听器。 testng.xml 文件中的标签。这种 XML 方法无需修改源代码,即可将监听器应用于测试套件中的每个类。

EventFiringWebDriver 和 WebDriverEventListener 已弃用 Selenium 4.x. 推荐的替代方案是 WebDriverListener 接口与 EventFiringDecorator 结合使用,它可以包装 WebDriver、WebElement 或 Alert 实例,并提供更清晰的钩子点,例如 beforeGet 和 afterClick。

如果您希望在测试套件运行结束后生成自定义报告(例如 HTML 或 JSON 摘要),请使用 IReporter。如果您需要在每个测试方法(包括 @BeforeMethod 和 @AfterMethod 等配置方法)前后添加钩子,请使用 IInvokedMethodListener。

AI 模型可以通过为每个日志条目添加严重性标签、生成自然语言步骤描述以及对相关故障进行聚类来丰富监听器输出。在 onTestFailure 内部,AI 服务可以分析屏幕截图和堆栈信息。 trace,然后将可能的根本原因归结于此 TestNG 报告。

是的。监听器可以将通过/失败历史记录流式传输到 AI 服务,该服务会将失败分类为不稳定、环境因素或真正的退化。最终结果会以文本形式返回。 TestNG 这样,仪表板就可以隔离不稳定的测试,而无需人工审查每个失败的构建。

总结一下这篇文章: