We use DataProvider with external data to run the same test many times with different inputs. This helps check many cases without writing repeated code.
Testing login with many username and password pairs.
Checking form submission with different sets of data.
Validating search functionality with various keywords.
Running tests with data stored in files like Excel or CSV.
Syntax
Selenium Java
import org.testng.annotations.DataProvider;
@DataProvider(name = "dataName")
public Object[][] dataMethod() {
return new Object[][] {
{"data1", "data2"},
{"data3", "data4"}
};
}
The method annotated with @DataProvider returns a 2D Object array.
Each inner array represents one set of test data.
Examples
Simple DataProvider with two username-password pairs.
Selenium Java
import org.testng.annotations.DataProvider;
@DataProvider(name = "loginData")
public Object[][] loginData() {
return new Object[][] {
{"user1", "pass1"},
{"user2", "pass2"}
};
}
DataProvider reading data from a CSV file line by line.
Selenium Java
import org.testng.annotations.DataProvider;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
@DataProvider(name = "csvData")
public Object[][] csvData() throws Exception {
List<Object[]> data = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader("data.csv"));
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(",");
data.add(parts);
}
br.close();
return data.toArray(new Object[0][]);
}
Sample Program
This test runs twice with different usernames and passwords. It checks if the password ends with '123'.
Selenium Java
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
public class LoginTest {
@DataProvider(name = "loginData")
public Object[][] loginData() {
return new Object[][] {
{"admin", "admin123"},
{"guest", "guest123"}
};
}
@Test(dataProvider = "loginData")
public void testLogin(String username, String password) {
System.out.println("Testing login with: " + username + ", " + password);
// Simulate login success if password ends with'123'
assertTrue(password.endsWith("123"));
}
}
OutputSuccess
Important Notes
Always name your DataProvider methods clearly to match their purpose.
When reading external files, handle exceptions properly to avoid test failures.
Use assertions inside the test method to verify expected behavior for each data set.
Summary
DataProvider lets you run one test many times with different data.
You can provide data directly in code or read from external files like CSV.
This helps test many cases easily and keeps tests clean.
Practice
(1/5)
1. What is the main purpose of using @DataProvider in Selenium tests?
easy
A. To locate web elements on the page
B. To create a new browser instance for each test
C. To generate test reports automatically
D. To run the same test multiple times with different input data
Solution
Step 1: Understand the role of DataProvider
@DataProvider is used to supply different sets of data to a test method so it can run multiple times with varied inputs.
Step 2: Compare options with this purpose
Only To run the same test multiple times with different input data describes running the same test multiple times with different data, which matches the purpose of DataProvider.
Final Answer:
To run the same test multiple times with different input data -> Option D
Quick Check:
DataProvider = multiple test runs with data [OK]
Hint: DataProvider runs tests repeatedly with varied inputs [OK]
Common Mistakes:
Confusing DataProvider with browser setup
Thinking DataProvider locates elements
Assuming DataProvider generates reports
2. Which of the following is the correct syntax to declare a DataProvider method that reads data from an external CSV file?
easy
A. @DataProvider(name = "csvData")
public Object[][] getData() {
// code to read CSV and return Object[][]
}
B. @DataProvider
public void getData() {
// code to read CSV
}
C. @DataProvider(name = "csvData")
public void getData() {
return new Object[][] {};
}
D. @DataProvider(name = "csvData")
public Object getData() {
// code to read CSV
}
Solution
Step 1: Check DataProvider method signature
A DataProvider method must return Object[][] and be public. @DataProvider(name = "csvData")
public Object[][] getData() {
// code to read CSV and return Object[][]
} matches this.
Step 2: Verify other options
@DataProvider
public void getData() {
// code to read CSV
} returns void, which is invalid. @DataProvider(name = "csvData")
public void getData() {
return new Object[][] {};
} returns void but tries to return data, invalid. @DataProvider(name = "csvData")
public Object getData() {
// code to read CSV
} returns Object, not Object[][], invalid.
Final Answer:
@DataProvider(name = "csvData")
public Object[][] getData() {
// code to read CSV and return Object[][]
} -> Option A
Quick Check:
DataProvider method returns Object[][] [OK]
Hint: DataProvider must return Object[][] and be public [OK]
Common Mistakes:
Using void return type for DataProvider
Returning Object instead of Object[][]
Missing @DataProvider annotation name
3. Given the following DataProvider method reading CSV data, what will be the output when the test runs?
The DataProvider returns two sets of data: {"user1", "pass1"} and {"user2", "pass2"}.
Step 2: Analyze test method output
The test runs twice, printing username and password separated by a colon each time, resulting in two lines: "user1:pass1" and "user2:pass2".
Final Answer:
user1:pass1
user2:pass2 -> Option B
Quick Check:
Each data set prints username:password [OK]
Hint: Each data row runs test once, printing combined values [OK]
Common Mistakes:
Expecting all data printed in one line
Confusing array structure with output format
Assuming compilation error without reason
4. Identify the error in this DataProvider method that reads data from a CSV file:
@DataProvider(name = "csvData")
public Object[][] getData() {
List lines = readCsv("data.csv");
Object[][] data = new Object[lines.size()][];
for (int i = 0; i <= lines.size(); i++) {
data[i] = lines.get(i);
}
return data;
}
medium
A. The loop condition should be < instead of <= to avoid IndexOutOfBoundsException
B. The method should return List instead of Object[][]
C. The DataProvider annotation is missing parameters
D. The data array size is incorrect and should be lines.size() + 1
Solution
Step 1: Analyze the for loop condition
The loop runs from i = 0 to i <= lines.size(), which means it tries to access data[lines.size()] causing IndexOutOfBoundsException.
Step 2: Correct the loop condition
The loop should run while i < lines.size() to stay within valid array indices.
Final Answer:
The loop condition should be < instead of <= to avoid IndexOutOfBoundsException -> Option A
Quick Check:
Loop index must be less than array size [OK]
Hint: Loop index must be less than array length, not less or equal [OK]
Common Mistakes:
Using <= in loops causing index errors
Returning wrong data type from DataProvider
Misunderstanding DataProvider annotation usage
5. You want to use a DataProvider that reads test data from a CSV file and filters out rows where the first column is empty before running tests. Which approach correctly implements this?
hard
A. Return the entire CSV data as Object[][] without filtering, and filter inside the test method
B. Filter rows after test execution by skipping tests with empty first column
C. Read all CSV rows into a List, filter out rows with empty first column, then convert filtered list to Object[][] and return
D. Use a DataProvider that returns null for rows with empty first column
Solution
Step 1: Understand filtering before test execution
Filtering data in the DataProvider ensures only valid data sets run tests, keeping tests clean and efficient.
Step 2: Implement filtering in DataProvider
Read CSV into a list, remove rows with empty first column, then convert to Object[][] to supply filtered data to tests.
Final Answer:
Read all CSV rows into a List, filter out rows with empty first column, then convert filtered list to Object[][] and return -> Option C
Quick Check:
Filter data in DataProvider before tests run [OK]
Hint: Filter data inside DataProvider, not inside test method [OK]
Common Mistakes:
Filtering data inside test method instead of DataProvider
Returning null for filtered rows causing errors
Skipping tests after execution instead of filtering input
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.