Selenium 中都使用了哪些 TestNG 注解?
TestNG 是一个强大的测试框架,它是 JUnit 的增强版,JUnit 在 TestNG 出现之前已经使用了很长时间。NG 代表“下一代”。
TestNG 框架提供以下功能:
注解帮助我们轻松组织测试。
灵活的测试配置。
测试用例更容易分组。
可以使用 TestNG 实现测试的并行化。
支持数据驱动测试。
内置报告。
Selenium Webdriver 允许与网页交互。它是一个接口,而不是一个测试框架。要仅在 Selenium 中运行任何测试或代码,我们必须使用 Java main 方法。TestNG 为我们提供了一个无需使用 Java main 方法即可运行 Selenium 代码的框架。除此之外,更好的代码可维护性、报告和灵活的测试配置是使用 TestNG 与 Selenium 结合的额外优势。
Selenium 中的 TestNG 注解
注解在 JDK 5 中正式添加到 Java 语言中,TestNG 选择使用注解来注释测试类。以下是使用注解的一些好处。更多关于 TestNG 的信息可以在这里找到
TestNG 通过查找注解来识别它感兴趣的方法。因此,方法名称不受任何模式或格式的限制。
我们可以向注解传递附加参数。
注解是强类型的,因此编译器会立即标记任何错误。
测试类不再需要扩展任何内容(例如 JUnit 3 的 TestCase)。
用户可以在 Selenium 中使用所有可用的 TestNG 注解。其中一些如下所示
序号 |
注解及描述 |
---|---|
1 |
@BeforeSuite 此套件中所有测试运行之前,将只运行一次带注解的方法。 |
2 |
@AfterSuite 此套件中所有测试运行之后,将只运行一次带注解的方法。 |
3 |
@BeforeClass 在调用当前类中的第一个测试方法之前,将只运行一次带注解的方法。 |
4 |
@AfterClass 在当前类中所有测试方法运行之后,将只运行一次带注解的方法。 |
5 |
@BeforeTest 在运行<test>标签内类的任何测试方法之前,将运行带注解的方法。 |
6 |
@AfterTest 在运行<test>标签内类的所有测试方法之后,将运行带注解的方法。 |
7 |
@BeforeGroups 此配置方法将在其之前运行的组列表。保证在调用属于任何这些组的第一个测试方法之前不久运行此方法。 |
8 |
@AfterGroups 此配置方法将在其之后运行的组列表。保证在调用属于任何这些组的最后一个测试方法之后不久运行此方法。 |
9 |
@BeforeMethod 在每个测试方法之前将运行带注解的方法。 |
10 |
@AfterMethod 在每个测试方法之后将运行带注解的方法。 |
11 |
@DataProvider 将方法标记为为测试方法提供数据。带注解的方法必须返回一个 Object[ ][ ],其中每个 Object[ ] 可以分配给测试方法的参数列表。想要从此 DataProvider 接收数据的 @Test 方法需要使用一个数据提供程序名称,该名称等于此注解的名称。 |
12 |
@Factory 将方法标记为工厂,该工厂返回 TestNG 将用作测试类的对象。该方法必须返回 Object[ ]。 |
13 |
@Listeners 在测试类上定义监听器。 |
14 |
@Parameters 描述如何将参数传递给 @Test 方法。 |
15 |
@Test 将类或方法标记为测试的一部分。 |
让我们分析如何在 Selenium 中使用 TestNG 注解。
解决此问题的方法/算法
步骤 1:确保在系统中正确设置了 Selenium、TestNG 和 Firefox 驱动程序的初始设置。
步骤 2:创建一个 TestNG 类并编写如程序代码中所述的 Selenium 代码。
步骤 3:运行 TestNGClass 文件。
示例
以下代码用于创建包含 Selenium 代码的 TestNG 类
import java.util.concurrent.TimeUnit; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class TestNGClass { WebDriver driver = new FirefoxDriver(); @BeforeTest public void launchApp() { // Puts an Implicit wait, Will wait for 10 seconds before throwing exception driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // Launch website driver.navigate().to("http://www.calculator.net"); driver.manage().window().maximize(); } @Test public void calculatePercent() { // Click on Math Calculators driver.findElement(By.xpath(".//*[@id='menu']/div[3]/a")).click(); // Click on Percent Calculators driver.findElement(By.xpath(".//*[@id='menu']/div[4]/div[3]/a")).click(); // Enter value 10 in the first number of the percent Calculator driver.findElement(By.id("cpar1")).sendKeys("10"); // Enter value 50 in the second number of the percent Calculator driver.findElement(By.id("cpar2")).sendKeys("50"); // Click Calculate Button driver.findElement(By.xpath(".//*[@id='content']/table/tbody/tr/td[2]/input")).click(); // Get the Result Text based on its xpath String result = driver.findElement(By.xpath(".//*[@id='content']/p[2]/span/font/b")).getText(); // Print a Log In message to the screen System.out.println(" The Result is " + result); if(result.equals("5")) { System.out.println(" The Result is Pass"); } else { System.out.println(" The Result is Fail"); } } @AfterTest public void terminatetest() { driver.close(); } }
输出
[TestNG] Running: C://Users/************** The Result is 5 The Result is Pass PASSED: calulatePercent =============================================== Suite1 Total tests run: 1, Passes: 1, Failures: 0, Skips: 0 ===============================================