Kör flera testfall med TestNG Svit in Selenium

TestNG gör att du kan köra testmetoder, testklasser och testfall parallellt i ditt projekt. Genom att utföra parallellkörning kan vi minska 'exekveringstiden' eftersom tester startas och exekveras samtidigt i olika trådar.

Här kommer vi att se hur man kör flera klasser (aka olika sviter) med hjälp av TestNG.

Steg 1) Skapa en TestNG.xml-fil för att köra test

Följ stegen nedan för att göra det.

  1. Skapa ett nytt projekt i Eclipse
  2. Skapa två paket i projekten (namnge dem som com.suite1 och com.suite2)
  3. Skapa en klass i varje paket (namngiv dem som Flipkart.java och Snapdeal.java) och kopiera nedanstående kod i respektive klass
  4. Skapa en ny fil i ditt projekt och namnge den som testng.xml (Se till att du har installerat testplugin för eclipse, instruktioner finns tillgängliga här.). Testng.xml innehåller all konfiguration (klassnamn, testnamn och färgnamn.

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>

Den slutliga projektstrukturen ser ut som nedan,

Skapa ett TestNG.xml-fil för att köra test

Steg 2) Parallellt utförande i TestNG

Efter att ha skapat xml-filen som visas ovan, i nästa steg kommer vi att utföra parallelltestet. Nedan finns koden.

Parallell utförande i TestNG

1) trådräkning: Detta används för parallell exekvering, baserat på nummerskriptet. Det kommer att köras i parallell eller sekventiell ordning.

2) talrik: Den används för att logga exekveringsdetaljerna i konsolen. Värdet ska vara 1-10. Loggdetaljerna i konsolfönstret blir mer detaljerade och tydligare när du ökar värdet på det verbose-attributet i testng.xml-konfigurationsfilen.

3) namn: Namnet på sviten. Här är det "Gmail Suite"

4) Parallellt: För att köra skript parallellt kan värdet vara test/klasser/metoder/sviter. Standardvärdet är ingen

Högerklicka på testng.xml och välj kör som testning, när du lyckats ser du alla resultat

När du kör ovanstående kod får du följande utdata.

Produktion:

Parallell utförande i TestNG

1) namnet på sviten som anges i testng.xml

Parallell utförande i TestNG

2) namnet på testet i testng.xml

Parallell utförande i TestNG

3) namnet på klassen som anges i testng.xml

Parallell utförande i TestNG

4) metodnamn kommenterade med @Test i .java-fil

Parallell utförande i TestNG

På samma sätt kommer den att köra testsvit för snap-affär också.

Slutsats

Här har vi sett i exemplet ovan, hur man använder Testng att utföra parallellt test. TestNG ger en möjlighet att utföra flera tester parallellt i en enda konfigurationsfil (XML).