Selenium 为什么要与TestNG一起使用Selenium
TestNG是一个强大的测试框架,它是JUnit的增强版本,TestNG在出现之前很长时间都在使用JUnit。NG代表“Next Generation”。
TestNG框架提供了以下功能:
- 注解帮助我们方便地组织测试。
-
灵活的测试配置。
-
更容易地对多个测试用例进行分组。
-
使用TestNG可以实现测试的并行化。
-
支持数据驱动测试。
-
内置的报告以及支持Extent Reporting和其他报告工具。Selenium默认不生成任何报告。
-
方便配置进行跨浏览器测试。
-
TestNG框架可以很容易地与Maven、Jenkins、Gradle、Ant或任何其他构建工具以及CI/CD工具集成。
-
TestNG还处理了一些未捕获的异常。每当这些异常发生时,TestNG将使测试步骤失败,并且可以在报告中进行验证。
-
所有TestNG注解都可以在Selenium中使用。注解易读易懂。
Selenium允许与网页交互。它是一个接口而不是测试框架。要仅在Selenium中运行任何测试或代码,我们必须使用Java main方法。TestNG为我们提供了一个框架,可以在不使用Java main方法的情况下运行Selenium代码。除此之外,使用TestNG与Selenium相结合还具有更好的代码可维护性,报告功能和灵活的测试配置等其他优点。
步骤
- 步骤1:确保系统中正确设置了Selenium、TestNG和Firefox驱动程序的初始设置。
-
步骤2:创建一个TestNG类,并按照程序代码中的说明编写Selenium代码。
-
步骤3:运行TestNGClass文件。
-
步骤4:编写相同的代码,不使用TestNG,并比较差异。
示例
以下代码用于创建一个带有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
===============================================
没有使用TestNG的Selenium代码
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
public class SeleniumWithoutTestNG {
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new FirefoxDriver();
// 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();
// 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");
}
driver.close();
}
}