在 Selenium 中使用 TestNG 套件运行多个测试用例
TestNG 允许您在项目中并行运行测试方法、测试类和测试用例。通过并行执行,由于测试在不同的线程中同时启动和执行,我们可以缩短“执行时间”。
在这里,我们将看到如何使用 TestNG 运行多个类(也称为不同的套件)。
步骤 1) 创建用于执行测试的 TestNG.xml 文件
为此,请按照以下步骤操作。
- 在 eclipse 中创建一个新项目
- 在项目中创建两个包(命名为 com.suite1 和 com.suite2)
- 在每个包中创建一个类(命名为 Flipkart.java 和 Snapdeal.java),并将以下代码复制到相应的类中
- 在您的项目中创建一个新文件并将其命名为 testng.xml(确保您已安装 eclipse 的测试插件,说明可在此处找到)。Testng.xml 包含所有配置(类名、测试名和套件名)。
Flipkart.java
package com.suite1; import java.util.concurrent.TimeUnit; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class Flipkart{ WebDriver driver = new FirefoxDriver(); String username = ""; // Change to your username and passwrod String password = ""; // This method is to navigate flipkart URL @BeforeClass public void init() { driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); driver.navigate().to("https://www.flipkart.com"); } // To log in flipkart @Test public void login() { driver.findElement(By.partialLinkText("Login")).click(); driver.findElement( By.cssSelector(".fk-input.login-form-input.user-email")) .sendKeys(username); driver.findElement( By.cssSelector(".fk-input.login-form-input.user-pwd")) .sendKeys(password); driver.findElement(By.cssSelector(".submit-btn.login-btn.btn")).click(); } // Search For product @Test public void searchAndSelectProduct() { driver.findElement(By.id("fk-top-search-box")).sendKeys("moto g3"); driver.findElement( By.cssSelector("search-bar-submit.fk-font-13.fk-font-bold")) .click(); // select the first item in the search results String css = ".gd-row.browse-grid-row:nth-of-type(1) > div:nth-child(1)>div>div:nth-child(2)>div>a"; driver.findElement(By.cssSelector(css)).click(); } @Test public void buyAndRemoveFromCart() { driver.findElement( By.cssSelector(".btn-express-checkout.btn-big.current")) .click(); driver.findElement(By.cssSelector(".remove.fk-inline-block")).click(); Alert a = driver.switchTo().alert(); a.accept(); } @Test public void logout() { Actions s = new Actions(driver); WebElement user = driver.findElement(By.partialLinkText(username)); s.moveToElement(user).build().perform(); driver.findElement(By.linkText("Logout")).click(); } @AfterClass public void quit() { driver.close(); } }
SnapDeal.java
package com.suite2; import java.util.concurrent.TimeUnit; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class SnapDeal { WebDriver driver = new FirefoxDriver(); String username = ""; // Change to your username and passwrod String password = ""; String pinCode = ""; // This method is to navigate snapdeal URL @BeforeClass public void init() { driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); driver.navigate().to("https://www.snapdeal.com"); } // To log in flipkart @Test public void login() { driver.findElement(By.xpath("//button[text()='Login']")).click(); driver.switchTo().frame("loginIframe"); driver.findElement(By.cssSelector("div[onClick='getLoginForm()']")) .click(); driver.findElement(By.id("j_username")).sendKeys(username); driver.findElement(By.id("j_password_login")).sendKeys(password); driver.findElement(By.id("signin_submit")).click(); driver.switchTo().defaultContent(); } // Search For product @Test public void searchAndSelectProduct() { driver.findElement(By.cssSelector(".col-xs-20.searchformInput.keyword")) .sendKeys("iphone 6s"); driver.findElement(By.cssSelector(".sd-icon.sd-icon-search")).click(); // select the first item in the search results String css = ".product_grid_row:nth-of-type(1)>div:nth-child(1)"; driver.findElement(By.cssSelector(css)).click(); } @Test public void buyAndRemoveFromCart() { driver.findElement(By.xpath("//li[contains(text(),'Silver')]")).click(); driver.findElement(By.id("pincode-check")).sendKeys(pinCode); driver.findElement(By.id("buy-button-id")).click(); driver.findElement(By.cssSelector("i[title='Delete Item']")).click(); Alert a = driver.switchTo().alert(); a.accept(); } @Test public void logout() { driver.findElement(By.linkText("START SHOPPING NOW")).click(); Actions s = new Actions(driver); WebElement user = driver.findElement(By.cssSelector(".sd-icon.sd-icon-user")); s.moveToElement(user).build().perform(); driver.findElement(By.linkText("Logout")).click(); } @AfterClass public void quit() { driver.close(); } }
TestNg.xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite thread-count="1" verbose="1" name="Gmail Suite" annotations="JDK" parallel="tests"> <test name="flipkart"> <classes> <class name="com.suite1.Flipkart"/> </classes> </test> <test name="Myntra"> <classes> <class name="com.suite2.SnapDeal"/> </classes> </test> </suite>
最终项目结构如下所示:
步骤 2) TestNG 中的并行执行
如上图所示创建 xml 文件后,在下一步中,我们将执行并行测试。以下是代码。
1) thread-count:这用于并行执行,基于脚本数量。它将并行或按顺序执行。
2) verbose:它用于在控制台中记录执行详细信息。值应为 1-10。随着您增加 testng.xml 配置文件中 verbose 属性的值,控制台窗口中的日志详细信息将变得更加详细和清晰。
3) name:套件的名称。这里是“Gmail Suite”
4) Parallel:要并行运行脚本,值可以是 tests/classes/methods/suites。默认值为 none
右键单击 testng.xml 并选择以测试模式运行,成功后您将看到所有结果
当您执行上述代码时,您将获得以下输出。
输出
1) testng.xml 中给出的套件名称
2) testng.xml 中给出的测试名称
3) testng.xml 中给出的类名称
4) .java 文件中使用 @Test 注释的方法名称
同样,它也将为 snapdeal 执行测试套件。
结论
在上面的示例中,我们已经看到了如何使用 Testng 执行并行测试。TestNG 提供了在一个配置文件 (XML) 中并行执行多个测试的选项。