Hello Folks,
In last post, we have seen Basics of DataProvider in TestNG and its working logic with one dimensional array. In this post I will explain the working logic of a DataProvider method which returns a two dimensional array.
I see people are always confused with the usage of a DataProvider method which returns a two dimensional array. I want make it simple. Here you go.
Suppose you are testing a student registration application. To register a student, you need to pass First_Name, Last_Name and Email_lD of student. You need to understand here that You required three data( First_Name, Last_Name and Email_lD) of student. Now you want to register 5 students on your application. We have two inputs here:
- No of fields to register a (single) student. (3 fields)
- No of student to be registered. ( 5 Student)
Let’s draw a table with data:
[table id=7 /]
In above table:
Row is a Number of students to be registered which is 5 and each row has three columns which are details of each student. Below is the flow it goes through:
- You pick first row of above table. Now use first column (First_Name) of first row and use it followed by second column (Last_name) and third column (Email_ID). Done with first row.
- Now you will pick second row and iterate through its columns and same for each columns of each rows.
The same logic we apply in a DataProvider method in TestNG. We need to pass above table in form of an Array to method from a DataProvider method.
We will create a 2D (Two Dimensional Matrix) array containing rows and columns which looks similar to above table. I hope you would have basics understanding of Arrays.
Let’s see an example:
[java]package DataProvider;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderBasics2 {
// You must need to mention data provider method name in Test method
@Test(dataProvider="DataContainer")
public void studentRegistration(String First_name, String Last_Name, String Email_ID) {
System.out.println("Registered student with details: "+First_name+" "+Last_Name+" "+Email_ID);
}
// A data provider method with return type as 2D array
@DataProvider(name="DataContainer")
public Object[] myDataProvider() {
Object data[][]= new Object[5][3];
// First student details
data[0][0]= "Mukesh";
data[0][1]= "Otwani";
data[0][2]= "Motwani@gmail.com";
// Second student details
data[1][0]= "Amod";
data[1][1]= "Mahajan";
data[1][2]= "amahajan@hotmail.com";
// Third student details
data[2][0]= "Animesh";
data[2][1]= "Prashant";
data[2][2]= "aprashant@gmail.com";
// Fourth student details
data[3][0]= "Ankur";
data[3][1]= "Singh";
data[3][2]= "asingh@gmail.com";
// Fifth student details
data[4][0]= "Amritansh";
data[4][1]= "Kumar";
data[4][2]= "akumar@gmail.com";
return data;
}
}
[/java]
Output:
[xml][RemoteTestNG] detected TestNG version 6.14.2
Registered student with details: Mukesh Otwani Motwani@gmail.com
Registered student with details: Amod Mahajan amahajan@hotmail.com
Registered student with details: Animesh Prashant aprashant@gmail.com
Registered student with details: Ankur Singh asingh@gmail.com
Registered student with details: Amritansh Kumar akumar@gmail.com
PASSED: methodWithSingleAttribute("Mukesh", "Otwani", "Motwani@gmail.com")
PASSED: methodWithSingleAttribute("Amod", "Mahajan", "amahajan@hotmail.com")
PASSED: methodWithSingleAttribute("Animesh", "Prashant", "aprashant@gmail.com")
PASSED: methodWithSingleAttribute("Ankur", "Singh", "asingh@gmail.com")
PASSED: methodWithSingleAttribute("Amritansh", "Kumar", "akumar@gmail.com")
===============================================
Default test
Tests run: 5, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 5, Failures: 0, Skips: 0
===============================================
[/xml]
Understand the output now. Method “studentRegistration” executed 5 times with different set of data we passed in given order. I hope you can understand now that how does 2D DataProvider pass data to a method in TestNG.
We can make out above DataProvider method more optimal. Instead of assigning values using indexes, we can use inline array as below:
[java]package DataProvider;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderBasics3 {
// You must need to mention data provider method name in Test method
@Test(dataProvider="DataContainer")
public void studentRegistration(String First_name, String Last_Name, String Email_ID) {
System.out.println("Registered student with details: "+First_name+" "+Last_Name+" "+Email_ID);
}
// A data provider method with return type as 2D array
@DataProvider(name="DataContainer")
public Object[] myDataProvider() {
return new Object[][]
{
{"Mukesh", "Otwani", "Motwani@gmail.com"},
{"Amod","Mahajan","Amahajan@hotmail.com"},
{"Animesh","Prashant","aprashant@gmail.com"},
{"Ankur","Singh","asingh@gmail.com"},
{"Amritansh", "Kumar","akumar@gmail.com"}
};
}
}
[/java]
[xml][RemoteTestNG] detected TestNG version 6.14.2
Registered student with details: Mukesh Otwani Motwani@gmail.com
Registered student with details: Amod Mahajan amahajan@hotmail.com
Registered student with details: Animesh Prashant aprashant@gmail.com
Registered student with details: Ankur Singh asingh@gmail.com
Registered student with details: Amritansh Kumar akumar@gmail.com
PASSED: methodWithSingleAttribute("Mukesh", "Otwani", "Motwani@gmail.com")
PASSED: methodWithSingleAttribute("Amod", "Mahajan", "amahajan@hotmail.com")
PASSED: methodWithSingleAttribute("Animesh", "Prashant", "aprashant@gmail.com")
PASSED: methodWithSingleAttribute("Ankur", "Singh", "asingh@gmail.com")
PASSED: methodWithSingleAttribute("Amritansh", "Kumar", "akumar@gmail.com")
===============================================
Default test
Tests run: 5, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 5, Failures: 0, Skips: 0
===============================================
[/xml]
More about TestNG in upcoming posts. Stay tuned.
If you have any doubt, feel free to comment below.
If you like my posts, please like, comment, share and subscribe.
#ThanksForReading
#HappySelenium