TestNG 使用TestNG自动化功能测试
TestNG是一个强大的测试框架,是JUnit的增强版本,在TestNG出现之前,JUnit已经被长时间使用。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方法需要使用一个dataProvider名称,该名称与该注释的名称相同。 |
12 | @Factory 将方法标记为工厂,返回的对象将被TestNG用作测试类。该方法必须返回Object[]。 |
13 | @Listeners 定义在测试类上的监听器。 |
14 | @Parameters 描述如何传递参数给 @Test 方法。 |
15 | @Test 将一个类或方法标记为测试的一部分。 |
除了这些注释之外,testNG还有一系列用于验证和验证的支持类,例如Assert、Verify、Soft Assertions。这些类可以帮助自动化功能测试,并在每个阶段进行适当的验证。
让我们分析一下如何在Selenium中使用TestNG注释。
步骤
- 步骤1:确保Selenium、TestNG和初始化设置正确地设置在系统中。
-
步骤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
===============================================