DEV Community

Arvind Choudhary
Arvind Choudhary

Posted on

4 3

TestNG testing framework — Parameterization

TestNG

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

  1. @DataProvider
  2. @Parameters

Parameterization with @DataProvider annotation

Always remember to use below 2 if plan on parameterizing your @test with data provider.

  1. @DataProvider annotation with name attribute.
  2. @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]+"]");
    }
}
Enter fullscreen mode Exit fullscreen mode

Output:

testMethod called with [abc, cde]
testMethod called with [efg, hij]
testMethod1 called with [abc, cde]
testMethod1 called with [efg, hij]
Enter fullscreen mode Exit fullscreen mode

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 -->
Enter fullscreen mode Exit fullscreen mode

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+"]");
    }
}
Enter fullscreen mode Exit fullscreen mode

Output:

testMethod called with [abc,cde,klm]
testMethod called with [efg,hij,default]
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Useful URLs:
Javatpoint parameters

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay