Εκτέλεση πολλαπλών δοκιμαστικών περιπτώσεων με TestNG Σουίτα μέσα Selenium

TestNG σας δίνει τη δυνατότητα να εκτελείτε μεθόδους δοκιμών, τάξεις δοκιμών και δοκιμαστικές περιπτώσεις παράλληλα μέσα στο έργο σας. Εκτελώντας παράλληλη εκτέλεση, μπορούμε να μειώσουμε τον 'χρόνο εκτέλεσης' καθώς οι δοκιμές ξεκινούν και εκτελούνται ταυτόχρονα σε διαφορετικά νήματα.

Εδώ θα δούμε πώς να τρέξουμε πολλές κλάσεις (γνωστές και ως διαφορετικές σουίτες) χρησιμοποιώντας TestNG.

Βήμα 1) Δημιουργία α TestNGαρχείο .xml για εκτέλεση δοκιμής

Για να το κάνετε αυτό ακολουθήστε τα παρακάτω βήματα.

  1. Δημιουργήστε ένα νέο έργο στο eclipse
  2. Δημιουργήστε δύο πακέτα στα έργα (ονομάστε τα ως com.suite1 και com.suite2)
  3. Δημιουργήστε μια κλάση σε κάθε πακέτο (ονομάστε τα ως Flipkart.java και Snapdeal.java) και αντιγράψτε τον παρακάτω κώδικα στις αντίστοιχες κλάσεις
  4. Δημιουργήστε ένα νέο αρχείο στο έργο σας και ονομάστε το testng.xml (Βεβαιωθείτε ότι έχετε εγκαταστήσει το πρόσθετο δοκιμής για έκλειψη, διαθέσιμες οδηγίες εδώ). Το 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>

Η τελική δομή του έργου μοιάζει με παρακάτω,

δημιουργώντας μια TestNG.xml Αρχείο για εκτέλεση δοκιμής

Βήμα 2) Παράλληλη εκτέλεση σε TestNG

Αφού δημιουργήσουμε το αρχείο xml όπως φαίνεται παραπάνω, στο επόμενο βήμα, θα εκτελέσουμε την παράλληλη δοκιμή. Παρακάτω είναι ο κωδικός.

Παράλληλη εκτέλεση σε TestNG

1) αριθμός νημάτων: Χρησιμοποιείται για παράλληλη εκτέλεση, με βάση το σενάριο αριθμών. Θα εκτελεστεί με παράλληλη ή διαδοχική σειρά.

2) πολυλεκτικός: Χρησιμοποιείται για την καταγραφή των λεπτομερειών εκτέλεσης στην κονσόλα. Η τιμή πρέπει να είναι 1-10. Οι λεπτομέρειες του αρχείου καταγραφής στο παράθυρο της κονσόλας θα γίνονται πιο λεπτομερείς και σαφέστερες καθώς αυξάνετε την τιμή του χαρακτηριστικού verbose στο αρχείο διαμόρφωσης testng.xml.

3) όνομα: Όνομα της σουίτας. Ορίστε το «Gmail Σουίτα"

4) Παράλληλη: Για την παράλληλη εκτέλεση σεναρίων, η τιμή μπορεί να είναι δοκιμές/τάξεις/μέθοδοι/σουίτες. Η προεπιλεγμένη τιμή είναι κανένας

Κάντε δεξί κλικ στο testng.xml και επιλέξτε run as testing, μόλις πετύχετε θα δείτε όλα τα αποτελέσματα

Όταν εκτελέσετε τον παραπάνω κώδικα, θα λάβετε την ακόλουθη έξοδο.

Παραγωγή:

Παράλληλη εκτέλεση σε TestNG

1) όνομα της σουίτας που δίνεται στο testng.xml

Παράλληλη εκτέλεση σε TestNG

2) όνομα του τεστ που δίνεται στο testng.xml

Παράλληλη εκτέλεση σε TestNG

3) όνομα της τάξης που δίνεται στο testng.xml

Παράλληλη εκτέλεση σε TestNG

4) ονόματα μεθόδων σχολιασμένα με @Test σε αρχείο .java

Παράλληλη εκτέλεση σε TestNG

Ομοίως, θα εκτελέσει δοκιμαστική σουίτα για snap deal επίσης.

Συμπέρασμα

Εδώ είδαμε στο παραπάνω παράδειγμα, πώς να το χρησιμοποιήσετε Testng για την εκτέλεση παράλληλης δοκιμής. TestNG δίνει την επιλογή εκτέλεσης πολλαπλών δοκιμών παράλληλα σε ένα μόνο αρχείο διαμόρφωσης (XML).

Συνοψίστε αυτήν την ανάρτηση με: