TestNG 中的分组
TestNG 是一个测试框架,涵盖了不同类型的测试设计,如单元测试、功能测试、端到端测试、UI 测试和集成测试。
您可以通过创建 XML 并通过 Maven 运行它来运行单个或多个包(这里的包意味着以适当的目录格式封装一组类)。
TestNG 分组示例
我们在 Testng 中使用分组时,
- 我们不想在不同的类中单独定义测试方法(取决于功能),并且
- 同时,希望忽略(不执行)某些测试用例,就好像它们不存在于代码中一样。
- 因此,为了实现这一点,我们必须将它们分组。这是通过使用 TestNG 支持的“include”和“exclude”机制来完成的。
在下面的示例中,我们展示了如何在 XML 文件中使用分组的语法。
@Test (groups = { "bonding", "strong_ties" })
这里我们使用两个组名,即“bonding”和“strong_ties”(这些是可根据您的意愿更改的逻辑名称)。
<groups> 标签定义了 XML 中分组的开始。
自定义您的 XML 以从测试类中选择指定的组。下面是如何在 XML 文件中声明分组的语法,例如:
<groups>
<run>
<include name="bonding" />
</run>
</groups>
因此,让我们假设一个类中有 10 个测试方法。
其中,
- 6 个方法被标记在“bonding”组中,
- 4 个方法在“strong_ties”组中
接下来,我们将设置 Maven/Java 路径,并使用 Eclipse IDE 来演示在基于 Java 的 Maven 项目中使用 XML 文件进行分组。
使用标签创建 TestNG 的 XML
- Maven 框架中的 XML(可扩展标记语言)文件包含一个或多个测试的信息,并由 **<suite> 标签**定义。
- XML 中的测试信息由 **<test> 标签**表示,并且可以包含一个或多个 TestNG 类。
- 在测试方法上方包含 **@Test** 注解的 Java 类被定义为 TestNG 方法。
多个标签按顺序用于构建一个可工作的 TestNG XML,例如 <suite>、<test> 和 <class>
- 首先是 <suite> 标签,它包含一个逻辑名称,定义了 TestNG 报告生成执行报告的完整信息。
- 其次是 <test name=”Guru 99 Smoke Test Demo”>,请注意这是一个逻辑名称,它包含测试执行报告的信息,如通过、失败、跳过的测试用例以及其他信息,如执行总时间和组信息。
- 第三是 <class name=”com.group.guru99.TC_Class1” />,com.group.guru99 是使用的包,测试类名是 TC_Class1。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<test name="Guru 99 Smoke Test Demo">
<groups>
<run>
<include name="strong_ties" />
</run>
</groups>
<classes>
<class name="com.group.guru99.TC_Class1" />
</classes>
</test>
</suite>
我们将使用此 XML 用于下面章节中即将发布的视频。
测试 XML 中的“排除”或“包含”
假设您发现分组机制复杂,那么 TestNG XML 提供了排除/包含测试的功能。
Exclude Tag: Syntax for exclude tag <exclude name="${TEST_CASE_NAME}" />
Include Tag: Syntax for include tag <include name="${TEST_CASE_NAME}" />
注意:我们可以一次包含/排除多个测试用例,这也适用于分组。
运行 TestNG 分组,包括,排除代码(视频演示)
带有 XML 中 **group、exclude 和 include** 标签的 Java 代码和 XML 解释。
测试场景:启动 Guru99 演示银行网站,在登录页面上验证一些内容后,输入凭据,然后在登录后重新验证应用程序上的一些新内容。
注意:您编写的每个步骤都应在单独的方法中声明,但执行时,它将根据 XML 文件中的条目执行测试方法。
- 方法 1:初始化浏览器并启动 URL (tc01LaunchURL())
- 方法 2:验证登录页面标题 (tc02VerifyLaunchPage())
- 方法 3:在登录表单上输入用户名和密码 (tc03EnterCredentials())
- 方法 4:验证用户仪表板上是否存在管理器 ID (tc04VerifyLoggedInPage())
- 方法 5:验证用户仪表板上的更多链接 (tc05VerifyHyperlinks())
我们场景的代码
package com.group.guru99;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.Test;
public class TC_Class1 {
public static final WebDriver webDriver = new FirefoxDriver();;
String launchPageHeading = "//h3[text()='Guru99 Bank']";
final String userName_element = "//input[@name='uid']", password_element = "//input[@name='password']",
signIn_element = "//input[@name='btnLogin']";
final String userName_value = "mngr28642", password_value = "ydAnate";
final String managerID = "//td[contains(text(),'Manger Id')]";
final String newCustomer = "//a[@href='addcustomerpage.php']", fundTransfer = "//a[@href='FundTransInput.php']";
/**
* This test case will initialize the webDriver
*/
@Test(groups = { "bonding", "strong_ties" })
public void tc01LaunchURL() {
webDriver.manage().window().maximize();
webDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
webDriver.get("https://www.demo.guru99.com/V4/");
}
/**
* Will check the presence of Heading on Login Page
*/
@Test(groups = { "bonding" })
public void tc02VerifyLaunchPage() {
Assert.assertTrue(webDriver.findElement(By.xpath(launchPageHeading)).isDisplayed(),
"Home Page heading is not displayed");
System.out.println("Home Page heading is displayed");
}
/**
* This test case will enter User name, password and will then click on
* signIn button
*/
@Test(groups = { "bonding", "strong_ties" })
public void tc03EnterCredentials() {
webDriver.findElement(By.xpath(userName_element)).sendKeys(userName_value);
webDriver.findElement(By.xpath(password_element)).sendKeys(password_value);
webDriver.findElement(By.xpath(signIn_element)).click();
}
/**
* This test case will verify manger's ID presence on DashBoard
*/
@Test(groups = { "strong_ties" })
public void tc04VerifyLoggedInPage() {
Assert.assertTrue(webDriver.findElement(By.xpath(managerID)).isDisplayed(),
"Manager ID label is not displayed");
System.out.println("Manger Id label is displayed");
}
/**
* This test case will check the presence of presence of New customer link
* And FundTransfer link in Left pannel
*/
@Test(groups = { "bonding" })
public void tc05VerifyHyperlinks() {
Assert.assertTrue(webDriver.findElement(By.xpath(newCustomer)).isEnabled(),
"New customer hyperlink is not displayed");
System.out.println("New customer hyperlink is displayed");
Assert.assertTrue(webDriver.findElement(By.xpath(fundTransfer)).isEnabled(),
"Fund Transfer hyperlink is not displayed");
System.out.println("Fund Transfer hyperlink is displayed");
}
}
请注意:凭据仅在 20 天内有效,因此如果您尝试在本地机器上运行代码,可能会遇到凭据无效错误。
代码解释
如上所述,我们创建了 5 个测试用例,用于在独立方法中执行每个操作。
对于每个方法,我们都关联了一个带有某个值的 group 参数。
基本上,这些是区分组的名称,即“strong_ties”和“bonding”。
- 第一个和第三个方法被标记为“bonding”和“strong_ties”,这意味着如果 XML 在任一分组中更新,此测试用例将运行。
- 第二个方法只标记到“bonding”组,这意味着如果 XML 更新了 bonding 组。只有在这种情况下,这个测试用例才会运行。
- 第四个测试用例被标记到 strong_ties 组,这意味着只有当 XML 更新了 strong_ties 组名时,这个测试用例才会运行。
- 最后但同样重要的是,第五个测试用例被附加到 bonding 组,这意味着只有当 XML 更新了 bonding 组名时,这个测试用例才会运行。
所以总共有 4 个场景;
场景 1:我们希望运行所有测试用例,无论组名如何。在这种情况下,我们将从运行 XML 中删除 Group 标签。
场景 2: 我们想运行一些仅与任一组(即 strong_ties 或 bonding)相关的测试。请参考
- 在此视频中,Group 参数已从运行 XML 中注释掉。因此,您将看到所有测试用例均已执行。
- 继视频之后,现在我们已经在 XML 中包含了组名,您可以看到只有特定于该组的测试用例正在运行。
场景 3: 我们正在使用排除机制来排除测试用例。请参考视频
- 您会看到我们通过在运行 XML 中写入它们的名称来排除了几个测试用例 (tc02)。最终结果中,提到的测试用例并未运行。
场景 4:最后,我们使用 include 测试机制来包含测试用例 (tc01LaunchURL、tc03EnterCredentials 和 tc05VerifyHyperlinks)。请参考视频
在此视频中,您将看到在测试执行期间,只有 XML 中提到的测试用例正在运行。
请从上述示例的代码中下载代码-
结论
我们在这里学习了一种在 Maven 项目中使用 XML 运行测试用例的相对较新的方法。
我们首先简要介绍了 TestNG,然后继续全面阐述了分组、排除和包含的技术规范。

