如何在 POJO 中存储 TestNG 数据提供程序值 class
How to store the TestNG dataprovider values in a POJO class
我有一个 excel sheet,它有两列,如下所示:
我使用@Dataprovider(TestNG 注释)从excel sheet 读取数据并将其传递给@Test 方法。测试方法如下所示
@Test(dataProvider = "testautomation")
public void getData(String userName, String password)throws Exception
{
System.out.println(userName+ "\t ****");
System.out.println(password);
}
它按预期工作,并从 excel sheet 获得了正确的数据。但是有什么办法可以将这两个参数保留在 pojo class 中并在 @test 方法中传递 class 对象?顺便说一句,我可以停止公开参数,例如(@Test 方法中的用户名、密码)。
可能是 pojo class 如下所示:
public class DatObject
{
private String userName;
private String password;
//and getter setter methods.
}
测试方法如下所示:
@Test(dataProvider = "testautomation")
public void getData(DataObject dataObj)throws Exception
{
System.out.println(dataObj.getUserName()+ "\t ****");
System.out.println(dataObj.getPasswrod());
}
我想调用这个 pojo class 对象作为@test 方法中的参数,并使用 pojo class 中的 getter 和 setter 方法来获取值在@Test 方法中传递用户名和密码。
有线索吗?
您的数据提供者方法应该return pojos:
@DataProvider(name = "pojoProvider")
public Object[][] createPojoData() {
return new Object[][] {
{ new DataObject("User1", "****") },
{ new DataObject("User2", "****") },
};
}
然后在测试注解中指定即可:
@Test(dataProvider = "pojoProvider")
public void getData(DataObject dataObj)throws Exception
{
System.out.println(dataObj.getUserName()+ "\t ****");
System.out.println(dataObj.getPasswrod());
}
你可以完全摆脱 POJO,想象一下你有多种类型的 POJO,你会为每个 POJO 创建一个数据提供者吗?当然不是,所以你可以像这样在你的测试方法中使用 Map:
@Test(dataProvider = "dataProviderName")
void testGetUserDataAsPojo(Map user) {
System.out.println("Name: " + (String)user.get("Name") );
}
这更加通用,您可以控制拥有哪些类型的字段i.g。 'Name' 字段
但注意:您的数据提供者方法应该return Iterator<Object>
数据类型
其他解决方案对我不起作用,但这个解决方案:
假设您从 DataProvider 传递了 4 个参数:givenName、familyName、age、gender。
将助手 class 定义为:
public class UserDetails {
private String givenName;
private String familyName;
private String age;
private String gender;//and getter setter methods for all 4 param
}
如下定义DataProvider:
@DataProvider
public static Iterator<Object[]> getDataForUser() throws Exception {
Object[][] testObjArray = {{ "Monika", "Jain", "30", "Female"},{ "Krishna", "Verma", "28" , "Male"}}; //You can pick this data from an excel here
return getUserDetails(testObjArray);
}
private static Iterator<Object[]> getUserDetails(final Object[][] objArr) {
List<UserDetails> testList = new ArrayList<>();
for(Object[] arr : objArr) {
UserDetails user = new UserDetails();
user.setGivenName(arr[0].toString());
user.setFamilyName(arr[1].toString());
user.setAge(arr[2].toString());
user.setGender(arr[3].toString());
testList.add(user);
}
Collection<Object[]> dp = new ArrayList<Object[]>();
for(UserDetails userDetails : testList){
dp.add(new Object[]{userDetails});
}
return dp.iterator();
}
现在定义测试方法如下:
@Test(dataProvider = "getDataForUser")
public void displayUserDetails(final UserDetails userDetails) throws InterruptedException {
System.out.println("Given Name is:"+ userDetails.getGivenName());
System.out.println("Family Name is:"+ userDetails.getFamilyName());
System.out.println("Age is:"+ userDetails.getAge());
System.out.println("Gender is:"+ userDetails.getGender());
}
我有一个 excel sheet,它有两列,如下所示:
我使用@Dataprovider(TestNG 注释)从excel sheet 读取数据并将其传递给@Test 方法。测试方法如下所示
@Test(dataProvider = "testautomation")
public void getData(String userName, String password)throws Exception
{
System.out.println(userName+ "\t ****");
System.out.println(password);
}
它按预期工作,并从 excel sheet 获得了正确的数据。但是有什么办法可以将这两个参数保留在 pojo class 中并在 @test 方法中传递 class 对象?顺便说一句,我可以停止公开参数,例如(@Test 方法中的用户名、密码)。
可能是 pojo class 如下所示:
public class DatObject
{
private String userName;
private String password;
//and getter setter methods.
}
测试方法如下所示:
@Test(dataProvider = "testautomation")
public void getData(DataObject dataObj)throws Exception
{
System.out.println(dataObj.getUserName()+ "\t ****");
System.out.println(dataObj.getPasswrod());
}
我想调用这个 pojo class 对象作为@test 方法中的参数,并使用 pojo class 中的 getter 和 setter 方法来获取值在@Test 方法中传递用户名和密码。
有线索吗?
您的数据提供者方法应该return pojos:
@DataProvider(name = "pojoProvider")
public Object[][] createPojoData() {
return new Object[][] {
{ new DataObject("User1", "****") },
{ new DataObject("User2", "****") },
};
}
然后在测试注解中指定即可:
@Test(dataProvider = "pojoProvider")
public void getData(DataObject dataObj)throws Exception
{
System.out.println(dataObj.getUserName()+ "\t ****");
System.out.println(dataObj.getPasswrod());
}
你可以完全摆脱 POJO,想象一下你有多种类型的 POJO,你会为每个 POJO 创建一个数据提供者吗?当然不是,所以你可以像这样在你的测试方法中使用 Map:
@Test(dataProvider = "dataProviderName")
void testGetUserDataAsPojo(Map user) {
System.out.println("Name: " + (String)user.get("Name") );
}
这更加通用,您可以控制拥有哪些类型的字段i.g。 'Name' 字段
但注意:您的数据提供者方法应该return Iterator<Object>
数据类型
其他解决方案对我不起作用,但这个解决方案:
假设您从 DataProvider 传递了 4 个参数:givenName、familyName、age、gender。 将助手 class 定义为:
public class UserDetails {
private String givenName;
private String familyName;
private String age;
private String gender;//and getter setter methods for all 4 param
}
如下定义DataProvider:
@DataProvider
public static Iterator<Object[]> getDataForUser() throws Exception {
Object[][] testObjArray = {{ "Monika", "Jain", "30", "Female"},{ "Krishna", "Verma", "28" , "Male"}}; //You can pick this data from an excel here
return getUserDetails(testObjArray);
}
private static Iterator<Object[]> getUserDetails(final Object[][] objArr) {
List<UserDetails> testList = new ArrayList<>();
for(Object[] arr : objArr) {
UserDetails user = new UserDetails();
user.setGivenName(arr[0].toString());
user.setFamilyName(arr[1].toString());
user.setAge(arr[2].toString());
user.setGender(arr[3].toString());
testList.add(user);
}
Collection<Object[]> dp = new ArrayList<Object[]>();
for(UserDetails userDetails : testList){
dp.add(new Object[]{userDetails});
}
return dp.iterator();
}
现在定义测试方法如下:
@Test(dataProvider = "getDataForUser")
public void displayUserDetails(final UserDetails userDetails) throws InterruptedException {
System.out.println("Given Name is:"+ userDetails.getGivenName());
System.out.println("Family Name is:"+ userDetails.getFamilyName());
System.out.println("Age is:"+ userDetails.getAge());
System.out.println("Gender is:"+ userDetails.getGender());
}