Java 如何在POJO类中存储TestNG数据提供程序值
我有一张excel表格,有两列,如下所示: 我使用@Dataprovider(TestNG注释)从excel工作表中读取数据并通过@Test方法。测试方法如下所示Java 如何在POJO类中存储TestNG数据提供程序值,java,selenium,testng,testng-dataprovider,Java,Selenium,Testng,Testng Dataprovider,我有一张excel表格,有两列,如下所示: 我使用@Dataprovider(TestNG注释)从excel工作表中读取数据并通过@Test方法。测试方法如下所示 @Test(dataProvider = "testautomation") public void getData(String userName, String password)throws Exception { System.out.println(userName+ "\t ****
@Test(dataProvider = "testautomation")
public void getData(String userName, String password)throws Exception
{
System.out.println(userName+ "\t ****");
System.out.println(password);
}
它按预期工作,并从excel工作表中获得了正确的数据。但是有没有办法将这两个参数保留在pojo类中,并在@test method?中传递class对象?。顺便说一下,我可以停止公开参数,比如(用户名,@Test-method中的密码)
pojo类可能如下所示:
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());
}
试验方法如下:
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());
}
我想在@test method中将这个pojo类对象作为参数调用,并在pojo类中使用getter和setter方法来获取值,而不是在@test method中传递用户名和密码
任何潜在客户?您的数据提供程序方法应返回POJO:
@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:
@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") );
}
这是更通用的,您可以控制您有哪些类型的字段,例如“名称”字段
但是注意:您的数据提供程序方法应该返回
迭代器
数据类型您可以完全摆脱POJO,假设您有多种类型的POJO,您会为每个POJO创建一个数据提供程序吗?当然不是,所以您可以在测试方法中使用Map,如下所示:
@Test(dataProvider = "dataProviderName")
void testGetUserDataAsPojo(Map user) {
System.out.println("Name: " + (String)user.get("Name") );
}
这是更通用的,您可以控制您有哪些类型的字段,例如“名称”字段
但是注意:您的数据提供程序方法应该返回
迭代器
数据类型其他解决方案对我不起作用,但这个解决方案确实起到了作用:
假设您从数据提供者传递了4个参数:givenName、familyName、age、gender。
将助手类定义为:
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());
}
其他解决方案对我不起作用,但这一个确实起了作用: 假设您从数据提供者传递了4个参数:givenName、familyName、age、gender。 将助手类定义为:
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());
}
该列可以动态增加。是否有任何通用解决方案,我可以利用setter方法并在@Test method中调用它们。@ArrchanaMohan在问题u中要求提供POJO,答案提供了POJO。对于动态列,使用映射(按键获取)或列表(按索引获取)可以动态增加列。是否有任何通用解决方案,我可以利用setter方法并在@Test method中调用它们。@ArrchanaMohan在问题u中要求提供POJO,答案提供了POJO。对于动态列,使用map(按键获取)或list(按索引获取)表示key=>value,您可以使用JsonObjects。对于key=>value,您可以使用JsonObjects。感谢它的帮助。谢谢,真的很有帮助。向上投票