TestNG - Тест параметров (XML и @DataProvider)
В этом руководстве мы покажем вам, как передавать параметры в метод@Test через XML@Parameters или@DataProvider.
1. Передача параметров с помощью XML
В этом примере имя файла свойств передается изtestng.xml и вводится в метод через@Parameters.
TestParameterXML.java
package com.example.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/exampleserver jdbc.username=example jdbc.password=password
testng.xml
Выход
dbconfig : db.properties poolsize : 10 drivers : com.mysql.jdbc.Driver connectionURL : jdbc:mysql://localhost:3306/exampleserver username : example password : password
2. Передача параметров с помощью @DataProvider
2.1 Просмотрите простой пример@DataProvider с передачей параметраint.
TestParameterDataProvider.java
package com.example.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 }
};
}
}
Выход
PASSED: test(10, 20) PASSED: test(100, 110) PASSED: test(200, 210)
2.2@DataProvider поддерживает передачу параметраobject. В примере ниже показано, как передать объектMap в качестве параметра.
TestParameterDataProvider.java
package com.example.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 map) {
for (Map.Entry entry : map.entrySet()) {
System.out.println("[Key] : " + entry.getKey()
+ " [Value] : " + entry.getValue());
}
}
@DataProvider(name = "dbconfig")
public Object[][] provideDbConfig() {
Map map = readDbConfig();
return new Object[][] { { map } };
}
public Map readDbConfig() {
Properties prop = new Properties();
InputStream input = null;
Map map = new HashMap();
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;
}
}
Выход
[Key] : jdbc.url [Value] : jdbc:mysql://localhost:3306/exampleserver
[Key] : jdbc.username [Value] : example
[Key] : jdbc.driver [Value] : com.mysql.jdbc.Driver
[Key] : jdbc.password [Value] : password
PASSED: testConnection({jdbc.url=jdbc:mysql://localhost:3306/exampleserver,
jdbc.username=example, jdbc.driver=com.mysql.jdbc.Driver, jdbc.password=password})
3. @DataProvider + Метод
В этом примере показано, как передавать разные параметры в зависимости от имени тестового метода.
TestParameterDataProvider.java
package com.example.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;
}
}
Выход
PASSED: test1(1, 1)
PASSED: test1(200, 200)
PASSED: test2("[email protected]", "[email protected]")
PASSED: test2("[email protected]", "[email protected]")
4. @DataProvider + ITestContext
В TestNG мы можем использоватьorg.testng.ITestContext, чтобы определить, с какими параметрами времени выполнения был вызван текущий метод тестирования. В этом последнем примере мы покажем вам, как передавать параметры в зависимости от имени включенной группы.
TestParameterDataProvider.java
package com.example.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
Выход
group : groupA
Готово.