In this tutorial, we will show you how to pass parameters into a @Test method, via XML @Parameters or @DataProvider.

1. Passing Parameters with XML

In this example, the properties filename is passing from testng.xml, and inject into the method via @Parameters.

TestParameterXML.java
package com.mkyong.testng.examples.parameter;
 
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
 
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
 
public class TestParameterXML {
 
	Connection con;
 
	@Test
	@Parameters({ "dbconfig", "poolsize" })
	public void createConnection(String dbconfig, int poolsize) {
 
		System.out.println("dbconfig : " + dbconfig);
		System.out.println("poolsize : " + poolsize);
 
		Properties prop = new Properties();
		InputStream input = null;
 
		try {
		  //get properties file from project classpath
		  input = getClass().getClassLoader().getResourceAsStream(dbconfig);
 
		  prop.load(input);
 
		  String drivers = prop.getProperty("jdbc.driver");
		  String connectionURL = prop.getProperty("jdbc.url");
		  String username = prop.getProperty("jdbc.username");
		  String password = prop.getProperty("jdbc.password");
 
		  System.out.println("drivers : " + drivers);
		  System.out.println("connectionURL : " + connectionURL);
		  System.out.println("username : " + username);
		  System.out.println("password : " + password);
 
		  Class.forName(drivers);
		  con = DriverManager.getConnection(connectionURL, username, password);
 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (input != null) {
				try {
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
 
	}
 
}
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mkyongserver
jdbc.username=mkyong
jdbc.password=password
testng.xml
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="test-parameter">
 
    <test name="example1">
 
	<parameter name="dbconfig" value="db.properties" />
	<parameter name="poolsize" value="10" />
 
	<classes>
	  <class name="com.mkyong.testng.examples.parameter.TestParameterXML" />
	</classes>
 
    </test>
 
</suite>

Output

dbconfig : db.properties
poolsize : 10
drivers : com.mysql.jdbc.Driver
connectionURL : jdbc:mysql://localhost:3306/mkyongserver
username : mkyong
password : password

2. Passing Parameters with @DataProvider

2.1 Review a simple @DataProvider example, passing a int parameter.

TestParameterDataProvider.java
package com.mkyong.testng.examples.parameter;
 
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
 
public class TestParameterDataProvider {
 
	@Test(dataProvider = "provideNumbers")
	public void test(int number, int expected) {
		Assert.assertEquals(number + 10, expected);
	}
 
	@DataProvider(name = "provideNumbers")
	public Object[][] provideData() {
 
		return new Object[][] { 
			{ 10, 20 }, 
			{ 100, 110 }, 
			{ 200, 210 } 
		};
	}
 
}

Output

PASSED: test(10, 20)
PASSED: test(100, 110)
PASSED: test(200, 210)

2.2 The @DataProvider is support passing an object parameter. Below example shows you how to pass a Map object as parameter.

TestParameterDataProvider.java
package com.mkyong.testng.examples.parameter;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
 
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
 
public class TestParameterDataProvider {
 
	@Test(dataProvider = "dbconfig")
	public void testConnection(Map<String, String> map) {
 
		for (Map.Entry<String, String> entry : map.entrySet()) {
		  System.out.println("[Key] : " + entry.getKey() 
                              + " [Value] : " + entry.getValue());
		}
 
	}
 
	@DataProvider(name = "dbconfig")
	public Object[][] provideDbConfig() {
		Map<String, String> map = readDbConfig();
		return new Object[][] { { map } };
	}
 
	public Map<String, String> readDbConfig() {
 
		Properties prop = new Properties();
		InputStream input = null;
		Map<String, String> map = new HashMap<String, String>();
 
		try {
		  input = getClass().getClassLoader().getResourceAsStream("db.properties");
 
		  prop.load(input);
 
		  map.put("jdbc.driver", prop.getProperty("jdbc.driver"));
		  map.put("jdbc.url", prop.getProperty("jdbc.url"));
		  map.put("jdbc.username", prop.getProperty("jdbc.username"));
		  map.put("jdbc.password", prop.getProperty("jdbc.password"));
 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (input != null) {
				try {
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
 
		return map;
 
	}
 
}

Output

[Key] : jdbc.url [Value] : jdbc:mysql://localhost:3306/mkyongserver
[Key] : jdbc.username [Value] : mkyong
[Key] : jdbc.driver [Value] : com.mysql.jdbc.Driver
[Key] : jdbc.password [Value] : password
PASSED: testConnection({jdbc.url=jdbc:mysql://localhost:3306/mkyongserver, 
jdbc.username=mkyong, jdbc.driver=com.mysql.jdbc.Driver, jdbc.password=password})

3. @DataProvider + Method

This example shows you how to pass a different parameters depending on the test method name.

TestParameterDataProvider.java
package com.mkyong.testng.examples.parameter;
 
import java.lang.reflect.Method;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
 
public class TestParameterDataProvider {
 
	@Test(dataProvider = "dataProvider")
	public void test1(int number, int expected) {
		Assert.assertEquals(number, expected);
	}
 
	@Test(dataProvider = "dataProvider")
	public void test2(String email, String expected) {
		Assert.assertEquals(email, expected);
	}
 
	@DataProvider(name = "dataProvider")
	public Object[][] provideData(Method method) {
 
		Object[][] result = null;
 
		if (method.getName().equals("test1")) {
			result = new Object[][] {
				{ 1, 1 }, { 200, 200 } 
			};
		} else if (method.getName().equals("test2")) {
			result = new Object[][] { 
				{ "[email protected]", "[email protected]" }, 
				{ "[email protected]", "[email protected]" } 
			};
		}
 
		return result;
 
	}
 
}

Output

PASSED: test1(1, 1)
PASSED: test1(200, 200)
PASSED: test2("[email protected]", "[email protected]")
PASSED: test2("[email protected]", "[email protected]")

4. @DataProvider + ITestContext

In TestNG, we can use org.testng.ITestContext to determine what runtime parameters the current test method was invoked with. In this last example, we will show you how to pass parameters depending on the included group name.

TestParameterDataProvider.java
package com.mkyong.testng.examples.parameter;
 
import org.testng.Assert;
import org.testng.ITestContext;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
 
public class TestParameterDataProvider {
 
	@Test(dataProvider = "dataProvider", groups = {"groupA"})
	public void test1(int number) {
		Assert.assertEquals(number, 1);
	}
 
	@Test(dataProvider = "dataProvider", groups = "groupB")
	public void test2(int number) {
		Assert.assertEquals(number, 2);
	}
 
	@DataProvider(name = "dataProvider")
	public Object[][] provideData(ITestContext context) {
 
		Object[][] result = null;
 
		//get test name
		//System.out.println(context.getName());
 
		for (String group : context.getIncludedGroups()) {
 
			System.out.println("group : " + group);
 
			if ("groupA".equals(group)) {
				result = new Object[][] { { 1 } };
				break;
			}
 
		}
 
		if (result == null) {
			result = new Object[][] { { 2 } };
		}
		return result;
 
	}
 
}
testng.xml
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="test-parameter">
 
  <test name="example1">
 
	<groups>
		<run>
			<include name="groupA" />
		</run>
	</groups>
 
	<classes>
	   <class
	    name="com.mkyong.testng.examples.parameter.TestParameterDataProvider" />
	</classes>
 
  </test>
 
</suite>

Output

group : groupA

Done.

References

  1. TestNG @DataProvider
  2. TestNG ITestContext JavaDoc
  3. Connect To MySQL With JDBC Driver
Tags :
< PreviousNext >
TestNG – Dependency TestIndexTestNG parameter testing example
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider making a donation to the charity, thanks.

Related Posts

Popular Posts