Data providers help run the same test many times with different data. This saves time and finds more bugs.
Data providers for parameterization in Selenium Java
@DataProvider(name = "dataName") public Object[][] dataMethod() { return new Object[][] { {"data1", "data2"}, {"data3", "data4"} }; } @Test(dataProvider = "dataName") public void testMethod(String param1, String param2) { // test steps }
The method with @DataProvider returns a 2D Object array with test data.
The test method uses the dataProvider attribute to link to the data method.
@DataProvider(name = "loginData") public Object[][] loginData() { return new Object[][] { {"user1", "pass1"}, {"user2", "pass2"} }; } @Test(dataProvider = "loginData") public void testLogin(String username, String password) { // test login with username and password }
@DataProvider(name = "searchTerms") public Object[][] searchTerms() { return new Object[][] { {"apple"}, {"banana"}, {"cherry"} }; } @Test(dataProvider = "searchTerms") public void testSearch(String keyword) { // test search with keyword }
This test checks if the sum of two numbers matches the expected result. It runs three times with different numbers.
import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class SampleTest { @DataProvider(name = "numbers") public Object[][] numbers() { return new Object[][] { {2, 3, 5}, {10, 20, 30}, {5, 7, 12} }; } @Test(dataProvider = "numbers") public void testSum(int a, int b, int expectedSum) { int actualSum = a + b; assert actualSum == expectedSum : "Sum mismatch: expected " + expectedSum + " but got " + actualSum; System.out.println("Test passed for inputs: " + a + ", " + b); } }
Always name your data provider methods clearly to match their purpose.
Data providers can return any object types, not just strings or ints.
Use assertions inside the test method to check results for each data set.
Data providers let you run one test many times with different data.
This helps find bugs that happen only with certain inputs.
Use @DataProvider annotation and link it to your test method.
Practice
@DataProvider in Selenium Java tests?Solution
Step 1: Understand the role of @DataProvider
@DataProvider supplies different sets of data to a test method, enabling multiple runs with varied inputs.Step 2: Identify the main benefit
This helps find bugs that appear only with certain inputs by running the same test repeatedly with different data.Final Answer:
To run the same test multiple times with different input data -> Option AQuick Check:
@DataProvider = multiple test runs with varied data [OK]
- Thinking @DataProvider creates new browsers
- Confusing @DataProvider with test skipping
- Assuming it generates reports automatically
Solution
Step 1: Check the method signature for DataProvider
A DataProvider method must return Object[][] and be annotated with @DataProvider(name = "...").Step 2: Verify the return type and annotation
@DataProvider(name = "testData") public Object[][] dataProviderMethod() { return new Object[][] {{"data1"}, {"data2"}}; } correctly returns Object[][] and uses the proper annotation with a name.Final Answer:
@DataProvider(name = "testData") public Object[][] dataProviderMethod() { return new Object[][] {{"data1"}, {"data2"}}; } -> Option DQuick Check:
DataProvider method returns Object[][] [OK]
- Using void return type for DataProvider
- Missing the name attribute in @DataProvider
- Annotating test method instead of DataProvider method
@DataProvider(name = "numbers")
public Object[][] data() {
return new Object[][] { {1, 2}, {3, 4} };
}
@Test(dataProvider = "numbers")
public void testSum(int a, int b) {
System.out.println(a + b);
}Solution
Step 1: Understand the DataProvider data
The DataProvider returns two sets: {1, 2} and {3, 4}.Step 2: Calculate the sum for each test run
First run: 1 + 2 = 3; second run: 3 + 4 = 7; both printed on separate lines.Final Answer:
3 and 7 printed on separate lines -> Option CQuick Check:
Sum of pairs = 3, 7 [OK]
- Assuming only one test run happens
- Confusing data sets with single values
- Expecting compilation errors without syntax issues
@DataProvider(name = "inputData")
public Object[] data() {
return new Object[] {"A", "B"};
}
@Test(dataProvider = "inputData")
public void testMethod(String input) {
System.out.println(input);
}Solution
Step 1: Check DataProvider return type
DataProvider methods must return Object[][] to supply multiple parameter sets.Step 2: Identify mismatch in return type
The method returns Object[], which is invalid and causes runtime errors.Final Answer:
DataProvider method should return Object[][], not Object[] -> Option AQuick Check:
DataProvider return type = Object[][] [OK]
- Returning Object[] instead of Object[][]
- Confusing test method parameter types
- Forgetting to match DataProvider name
@DataProvider(name = "loginData")
public Object[][] loginData() {
return new Object[][] {
{"user1", "pass1"},
{"user2", ""},
{"user3", null}
};
}
@Test(dataProvider = "loginData")
public void testLogin(String username, String password) {
// Test logic here
}Solution
Step 1: Recognize the need to handle edge cases in test method
Empty or null passwords can cause test failures if not handled properly.Step 2: Implement validation inside testLogin method
Adding checks to skip or handle empty/null passwords prevents failures and tests robustness.Final Answer:
Add validation inside testLogin to skip or handle empty/null passwords -> Option BQuick Check:
Handle edge cases inside test method [OK]
- Removing test data instead of handling it
- Ignoring null or empty values causing failures
- Splitting tests unnecessarily instead of parameterizing
Ready to prove it?
Pass the test and this pattern moves unknown
