What is Parameterization?
Whenever we define any parameters on any of our methods, it means we are parametrizing that method. e.g. assuming areaOfSquare(int side);takes one argument which is integer and returns ares of square. it also allows you to use the same method for N. no of values.
@test method of TestNG supports parameterization, which in simple terms means it allows us to pass values to our test method at runtime.
Ways to Parameterize @test Method
- @DataProvider
- @Parameters
Parameterization with @DataProvider annotation
Always remember to use below 2 if plan on parameterizing your @test with data provider.
- @DataProvider annotation with name attribute.
- @test with attribute dataProvider having same value as specified for above step.
Code:
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderDemo {
/**
* always use name attribute for your dataProvider(), you can have
* N. no of dataprovider in your Test class and with the help of dataprovider attribute of @Test(refer to line 57)
* you can specify which dataprovider method to use.
*/
// always returns 2D Object array
@DataProvider(name = "testData")
public Object[][] dataProvider(){
// 2D Object array initialized
Object[][] objectArray = new Object[2][2];
/**
* 2D Array structure
* | abc | cde |
* | efg | hij |
*
* what @data provider will do here is that it will send data of one row at a time to test method,
* then next row and so on.
*
* no. of rows = no. of times your @Test will get executed
*/
// adding value in objectArray
objectArray[0][0] = "abc";
objectArray[0][1] = "cde";
objectArray[1][0] = "efg";
objectArray[1][1] = "hij";
// return 2D Object array
return objectArray;
}
/**
* make sure to use dataProvider attribute on your @Test annotation(refer to line 57),
*
* Also change you method signature according to what you are passing from your dataProvider,
* if you are not sure on what you should do then you can also keep your parameter type as String &
* testng would typecase it for you to string.
*
* no. of parameters on @test method should be same as no. of Object defined on your object array(column-wise).
* ref line 19, we have 2 columns and 2 rows. so you should have 2 parmaters(2 columns) in your method signature.
* (ref line no. 58)
* -------------------------OR---------------------------
*
* use (String... args), here dont have to specify each parameter,
* you will get one array which is args and you can work with it with the help of index,
* each parameter will be stored on one index
* assuming current case your array will have 2 indexes [0 & 1]
* where 0th index would hold first value and 1st index would hold second value.
* (ref line no. 63)
*/
@Test(dataProvider = "testData") // line 57
public void testMethod(String val1, String val2){ //line 58
System.out.println("testMethod called with ["+val1+", "+val2+"]");
}
@Test(dataProvider = "testData")
public void testMethod1(String... args){ //line 63
System.out.println("testMethod1 called with ["+args[0]+", "+args[1]+"]");
}
}
Output:
testMethod called with [abc, cde]
testMethod called with [efg, hij]
testMethod1 called with [abc, cde]
testMethod1 called with [efg, hij]
Parameterization with @Parameters annotation
Passing value with @Parameters is bit tricky here as we will be passing values from testng.xml
TestNG.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Suite">
<test name="Test1">
<parameter name="value1" value="abc"></parameter>
<parameter name="value2" value="cde"></parameter>
<parameter name="value3" value="klm"></parameter>
<classes>
<class name="ParametersDemo" ></class>
</classes>
</test> <!-- Test -->
<test name="Test2">
<parameter name="value1" value="efg"></parameter>
<parameter name="value2" value="hij"></parameter>
<classes>
<class name="ParametersDemo" ></class>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
Script
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class ParametersDemo {
/**
*
* in @Parameters you should specify parameter name
* and same should be present in testng.xml.
* refer to line 5 & 13 of testng.xml
*
* @param val1 parameter should be specified in test.xml
* @param val2 parameter should be specified in test.xml
* @param val3 is Optional, if specified well it would take specified value else defualt value
* refer to line 15, we have use @Optional
*/
@Test
@Parameters({"value1","value2","value3"})
public void testMethod(String val1,String val2,@Optional("default") String val3){
System.out.println("testMethod called with ["+val1+","+val2+","+val3+"]");
}
}
Output:
testMethod called with [abc,cde,klm]
testMethod called with [efg,hij,default]
As you see above for second test tag we only specified 2 parameters instead of 3 and because of @Optional usage we didn’t get any error.
if you would have not specified @Optional and you didn’t specify parameter in testng.xml you will below error.
testMethod called with [abc,cde,klm]
org.testng.TestNGException:
Parameter 'value3' is required by @Test on method testMethod but has not been marked @Optional or defined
Useful URLs:
Javatpoint parameters
Top comments (0)