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(Mapmap) { 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
Готово.