TestNG Data Provider với Excel

Data Driven Testing

Lợi ích quan trong của kiểm thử chức năng tự động là khả năng kiểm tra một khối lượng lớn dữ liệu trên hệ thống một cách nhanh chóng. Tuy nhiên bạn phải có khả năng thao tác với các bộ dữ liệu, thực hiện tính toán và nhanh chóng tạo ra hàng trăm các bộ kiể thử lặp đi lặp lại và thực hiện với một effort tối thiểu. Test Automation Framworks phải có khả năng tương thích với bảng tính và cung cấp tính năng tính toán mạnh mẽ.

Apache POI (Excel)

Hầu hết các công cụ phần mềm tự động trên thị trường đều hỗ trợ một số loại data driven testing, cho phép bạn tự động chạy một test case nhiều lần với những giá trị đầu vào khác nhau và các xác nhận khác nhau. Như Selenium Webdriver là automated testing framework hơn là một công cụ ready-to-use, bạn sẽ phải mất effort để hỗ trợ kiểm thử dữ liệu theo các bài kiểm thử tự động của bạn. Tôi thường thích sử dụng Microsoft Excel làm định dạng để lưu trữ các parameter của tôi. Một lợi thế khác của việc sửu dụng Excel là bạn có thể dễ dàng chia sẻ data test cho những người khác, những người mà có thể sẽ có kiến thức tốt hơn để biết được là cần phải chạy những test case nào và những parameter nào cần thiết để chạy chúng.

TestNG Data Providers

Khi bạn cần pass các parameter phức tạp hoặc các parameter cần được tạo từ Java (các đối tượng phức tạp, các đối tượng đọc từ file property hoặc database, ...), trong những trường hợp đó, các case parameter có thể chuyển qua sử dụng Dataproviders. Một Data Provider là một phương pháp được chú thích với @DataProvider. Data Provider trả về một mảng các đối tượng.

Hãy cùng chúng tôi kiểm tra một ví dụ về chức năng Sign in có sử dụng Data Provider với bảng dữ liệu Excel.

Làm thế nào để thực hiện nó

Ở đây, chứng ta sẽ thực hiện đơn giản từng bước một để Implement Excel với TestNg Data Provider. Bước 1: Tạo một test case của chức năng login với TestNg Data Provider. Bước 2: Tạo một bảng Test Data Bước 3: Tạo chức năng Open & Read data từ Excel Bước 4: Tạo một TestNg test case để chấp nhận dữ liệu từ Excel bằng cách sử dụng Data Provider. Bước 5: Chạy kiểm tra Test case trong file Test Data.

Bước 1: Tạo một test case của chức năng Login với TestNG Data Provider

  1. Tạo một TestNG class bằng cách nhấn Ctrl + N, chọn 'Create TestNG Class' dưới dạng TestNG và Under Annotations, kiểm tra 'DataProvider' và nhấn Finish.
  2. Mặc định tên DataProvider là "dp", thay đổi nó thành "Authentication". Phương thức này trả về mảng của mảng đối tượng.
  3. Thêm một phương thức Registration_data() vào Test class của bạn. Phương thức này lấy hai chuỗi như là các parameter đầu vào.
  4. Viết script cho chức năng login theo phương thức @Test.

Test case sẽ giống như sau:

package automationFramework;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.firefox.FirefoxDriver;

import org.testng.annotations.DataProvider;

import org.testng.annotations.Test;

public class DataProviderTest {

    private static WebDriver driver;

  @DataProvider(name = "Authentication")

  public static Object[][] credentials() {

        // The number of times data is repeated, test will be executed the same no. of times

        // Here it will execute two times

        return new Object[][] { { "testuser_1", "[email protected]" }, { "testuser_1", "[email protected]" }};

  }

  // Here we are calling the Data Provider object with its Name

  @Test(dataProvider = "Authentication")

  public void test(String sUsername, String sPassword) {

      driver = new FirefoxDriver();

      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

      driver.get("http://www.store.demoqa.com");

      driver.findElement(By.xpath(".//*[@id='account']/a")).click();

      // Argument passed will be used here as String Variable

      driver.findElement(By.id("log")).sendKeys(sUsername);

      driver.findElement(By.id("pwd")).sendKeys(sPassword);

      driver.findElement(By.id("login")).click();

      driver.findElement(By.xpath(".//*[@id='account_logout']/a")).click();

      driver.quit();

  }

}

Bước 2: Tạo một bảng Test Data

  1. Tạo một file ‘New Package‘ và đặt tên nó là "testData" bằng cách click vào Project và chọn New -> Package. Tôi thường đặt file Test Data của tôi dưới folder test data riêng biệt.

  2. Đặt 1 file Excel vào vị trí đã tạo ở trên và lưu nó dưới dạng TestData.xlsx. Điền dữ liệu vào file exel như ảnh dưới đây:

Bước 3: Tạo các hàm để mở và đọc dữ liệu từ Excel

Chúng ta cần một cách để mở bảng excel và đọc data từ đó vào Slenium test script. Với mục đích này, tôi sử dụng thư viện Apache POI, cho phép bạn đọc, tạo và chỉnh sửa những tài liệu Microsoft Office bằng Java. Các class và phương thức chúng ta sẽ sửa dụng để đọc dữ liệu từ bảng Excel được đặt trong gói org.apache.poi.hssf.usermodel.

Để xem từng bước quy trình tạo Apache POI Excel, vui lòng truy cập vào Data Driven Framework.

package utility;

        import java.io.FileInputStream;

		import java.io.FileNotFoundException;

		import java.io.FileOutputStream;

		import java.io.IOException;

		import org.apache.poi.xssf.usermodel.XSSFCell;

		import org.apache.poi.xssf.usermodel.XSSFRow;

		import org.apache.poi.xssf.usermodel.XSSFSheet;

		import org.apache.poi.xssf.usermodel.XSSFWorkbook;

    public class ExcelUtils {

			private static XSSFSheet ExcelWSheet;

			private static XSSFWorkbook ExcelWBook;

			private static XSSFCell Cell;

			private static XSSFRow Row;

		public static Object[][] getTableArray(String FilePath, String SheetName) throws Exception {   

		   String[][] tabArray = null;

		   try {

			   FileInputStream ExcelFile = new FileInputStream(FilePath);

			   // Access the required test data sheet

			   ExcelWBook = new XSSFWorkbook(ExcelFile);

			   ExcelWSheet = ExcelWBook.getSheet(SheetName);

			   int startRow = 1;

			   int startCol = 1;

			   int ci,cj;

			   int totalRows = ExcelWSheet.getLastRowNum();

			   // you can write a function as well to get Column count

			   int totalCols = 2;

			   tabArray=new String[totalRows][totalCols];

			   ci=0;

			   for (int i=startRow;i<=totalRows;i++, ci++) {           	   

				  cj=0;

				   for (int j=startCol;j<=totalCols;j++, cj++){

					   tabArray[ci][cj]=getCellData(i,j);

					   System.out.println(tabArray[ci][cj]);  

						}

					}

				}

			catch (FileNotFoundException e){

				System.out.println("Could not read the Excel sheet");

				e.printStackTrace();

				}

			catch (IOException e){

				System.out.println("Could not read the Excel sheet");

				e.printStackTrace();

				}

			return(tabArray);

			}

		public static String getCellData(int RowNum, int ColNum) throws Exception {

			try{

				Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);

				int dataType = Cell.getCellType();

				if  (dataType == 3) {

					return "";

				}else{

					String CellData = Cell.getStringCellValue();

					return CellData;

				}catch (Exception e){

				System.out.println(e.getMessage());

				throw (e);

				}

			}

	}

Bước 4: Tạo một test case TestNg để chấp nhận dữ liệu từ Excel bằng Data Provider

  1. Tạo 1 class TestNg ‘DataProviderWithExcel’ bằng cách nhấn Ctrl+N, chọn ‘Create TestNG Class‘ dưới TestNG category và Under Annotation, check vào các checkbox ‘**@BeforeMethod‘, ‘@AfterMethod‘ & ‘DataProvider‘ và Click vào Finish.
  2. Add một phương thức Registration_data() và class test của bạn. Phương thức lấy 2 chuỗi như các tham số đầu vào.
  3. Bây giờ phân chia các trường hợp kiểm thử thành 3 phần: @BeforeMethod : Chạy Firefox và direct nó đến Base URL @Test: Nhập vào Username & Password để Login, Print console message và Logout @AfterMethod: Close Firefox browser

Test Case sẽ giống như sau:

package practiceTestCases;

		import java.util.concurrent.TimeUnit;

		import org.openqa.selenium.By;

		import org.openqa.selenium.WebDriver;

		import org.openqa.selenium.firefox.FirefoxDriver;

		import org.testng.annotations.AfterMethod;

		import org.testng.annotations.BeforeMethod;

		import org.testng.annotations.Test;

		import org.testng.annotations.DataProvider;

		import utility.ExcelUtils;

	public class DataProviderWithExcel_001 {

		WebDriver driver;

	    @BeforeMethod

	    public void beforeMethod() throws Exception {

		    driver = new FirefoxDriver();

	        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

	        driver.get("http://www.store.demoqa.com");	 

		}

	@Test(dataProvider="Authentication")

    public void Registration_data(String sUserName,String sPassword)throws  Exception{

        driver.findElement(By.xpath(".//*[@id='account']/a")).click();

        driver.findElement(By.id("log")).sendKeys(sUserName);

		System.out.println(sUserName);

        driver.findElement(By.id("pwd")).sendKeys(sPassword);

		System.out.println(sPassword);

        driver.findElement(By.id("login")).click();

        System.out.println(" Login Successfully, now it is the time to Log Off buddy.");

        driver.findElement(By.xpath(".//*[@id='account_logout']/a")).click();

		}

    @DataProvider

    public Object[][] Authentication() throws Exception{

         Object[][] testObjArray = ExcelUtils.getTableArray("D://ToolsQA//OnlineStore//src//testData//TestData.xlsx","Sheet1");

         return (testObjArray);

		}

    @AfterMethod

    public void afterMethod() {

  	    driver.close();

    	}

}

Note: Bài kiểm tra Logln này sẽ thực hiện 2 lần vì có 2 thông tin người dùng trong data provider Array.

Bước 5: Chạy kiểm tra đối với các Test Case trong file Test Data

  1. Điều này có nghĩa là việc kiểm thử của bạn chỉ nên được chạy một lần với dữ liệu được đề cập đến trong Test Case. Để làm điều này, chúng ta cần phải tính chỉnh các lớp Excel utility cộng với cần thêm một vài chức năng để tìm ra tên Test Case hiện tại và số hàng có chứa Test Case đó.
package utility;

		import java.io.FileInputStream;

		import java.io.FileNotFoundException;

		import java.io.FileOutputStream;

		import java.io.IOException;

		import org.apache.poi.xssf.usermodel.XSSFCell;

		import org.apache.poi.xssf.usermodel.XSSFRow;

		import org.apache.poi.xssf.usermodel.XSSFSheet;

		import org.apache.poi.xssf.usermodel.XSSFWorkbook;

    public class ExcelUtils {

			private static XSSFSheet ExcelWSheet;

			private static XSSFWorkbook ExcelWBook;

			private static XSSFCell Cell;

			private static XSSFRow Row;

		//This method is to set the File path and to open the Excel file, Pass Excel Path and Sheetname as Arguments to this method

		public static void setExcelFile(String Path,String SheetName) throws Exception {

			   try {

					// Open the Excel file

					FileInputStream ExcelFile = new FileInputStream(Path);

					// Access the required test data sheet

					ExcelWBook = new XSSFWorkbook(ExcelFile);

					ExcelWSheet = ExcelWBook.getSheet(SheetName);

					} catch (Exception e){

						throw (e);

					}

			}

		public static Object[][] getTableArray(String FilePath, String SheetName, int iTestCaseRow)    throws Exception

		{   

		   String[][] tabArray = null;

		   try{

			   FileInputStream ExcelFile = new FileInputStream(FilePath);

			   // Access the required test data sheet

			   ExcelWBook = new XSSFWorkbook(ExcelFile);

			   ExcelWSheet = ExcelWBook.getSheet(SheetName);

			   int startCol = 1;

			   int ci=0,cj=0;

			   int totalRows = 1;

			   int totalCols = 2;

			   tabArray=new String[totalRows][totalCols];

				   for (int j=startCol;j<=totalCols;j++, cj++)

				   {

					   tabArray[ci][cj]=getCellData(iTestCaseRow,j);

					   System.out.println(tabArray[ci][cj]);

				   }

			}

			catch (FileNotFoundException e)

			{

				System.out.println("Could not read the Excel sheet");

				e.printStackTrace();

			}

			catch (IOException e)

			{

				System.out.println("Could not read the Excel sheet");

				e.printStackTrace();

			}

			return(tabArray);

		}

		//This method is to read the test data from the Excel cell, in this we are passing parameters as Row num and Col num

		public static String getCellData(int RowNum, int ColNum) throws Exception{

		   try{

			  Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);

			  String CellData = Cell.getStringCellValue();

			  return CellData;

			  }catch (Exception e){

				return"";

				}

			}

		public static String getTestCaseName(String sTestCase)throws Exception{

			String value = sTestCase;

			try{

				int posi = value.indexOf("@");

				value = value.substring(0, posi);

				posi = value.lastIndexOf(".");	

				value = value.substring(posi + 1);

				return value;

					}catch (Exception e){

				throw (e);

						}

			}

		public static int getRowContains(String sTestCaseName, int colNum) throws Exception{

			int i;

			try {

				int rowCount = ExcelUtils.getRowUsed();

				for ( i=0 ; i<rowCount; i++){

					if  (ExcelUtils.getCellData(i,colNum).equalsIgnoreCase(sTestCaseName)){

						break;

					}

				}

				return i;

					}catch (Exception e){

				throw(e);

				}

			}

		public static int getRowUsed() throws Exception {

				try{

					int RowCount = ExcelWSheet.getLastRowNum();

					return RowCount;

				}catch (Exception e){

					System.out.println(e.getMessage());

					throw (e);

				}

			}

}

Tinal Test Case

  1. Lấy tên Test Case.
  2. Với tên Test Case, lấy số hàng của bảng Excel để kiểm thử.
  3. Nhận dữ liệu từ bảng Excel cho hàng kiểm thử đã fetched.
package practiceTestCases;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.firefox.FirefoxDriver;

import org.testng.annotations.Test;

import org.testng.annotations.BeforeMethod;

import org.testng.annotations.AfterMethod;

import org.testng.annotations.DataProvider;

import utility.ExcelUtils;

public class DataProviderWithExcel_002 {

	private String sTestCaseName;

	private int iTestCaseRow;

	WebDriver driver;

  @BeforeMethod

  public void beforeMethod() throws Exception {

	  driver = new FirefoxDriver();

      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

      driver.get("http://www.store.demoqa.com");	 

  }	

  @Test(dataProvider = "Authentication")

  public void f(String sUserName, String sPassword) {

	    driver.findElement(By.xpath(".//*[@id='account']/a")).click();

	    driver.findElement(By.id("log")).sendKeys(sUserName);

		System.out.println(sUserName);

	    driver.findElement(By.id("pwd")).sendKeys(sPassword);

		System.out.println(sPassword);

	    driver.findElement(By.id("login")).click();

	    System.out.println(" Login Successfully, now it is the time to Log Off buddy.");

	    driver.findElement(By.xpath(".//*[@id='account_logout']/a")).click();

  }

  @AfterMethod

  public void afterMethod() {

	   driver.close();

  }

  @DataProvider

  public Object[][] Authentication() throws Exception{

	    // Setting up the Test Data Excel file

	 	ExcelUtils.setExcelFile("D://ToolsQA//OnlineStore//src//testData//TestData.xlsx","Sheet1");

	 	sTestCaseName = this.toString();

	  	// From above method we get long test case name including package and class name etc.

	  	// The below method will refine your test case name, exactly the name use have used

	  	sTestCaseName = ExcelUtils.getTestCaseName(this.toString());

	    // Fetching the Test Case row number from the Test Data Sheet

	    // Getting the Test Case name to get the TestCase row from the Test Data Excel sheet

	 	iTestCaseRow = ExcelUtils.getRowContains(sTestCaseName,0);

	    Object[][] testObjArray = ExcelUtils.getTableArray("D://ToolsQA//OnlineStore//src//testData//TestData.xlsx","Sheet1",iTestCaseRow);

	    	return (testObjArray);

		}

}

Note: Thao tác này sẽ chỉ được thực hiện một lần đối với est case data hiện tại.

Nguồn tham khảo: http://toolsqa.com/selenium-webdriver/testng-data-provider-excel/