Java 在testng中使用DataProvider从文件读取数据

Java 在testng中使用DataProvider从文件读取数据,java,selenium,selenium-webdriver,testng,Java,Selenium,Selenium Webdriver,Testng,假设我有一个包含以下数据的文本文件 username=testuser password=testpassword email=test@test.com address=testaddress zipcode=12345 <TestData> <UserInfo> <username>testuser</username> <password>testpassword</password>

假设我有一个包含以下数据的文本文件

username=testuser
password=testpassword
email=test@test.com
address=testaddress
zipcode=12345
<TestData>
   <UserInfo>
       <username>testuser</username>
       <password>testpassword</password>
       <email>test@test.com</email>
       <address>testaddress</address>
   </UserInfo>
</TestData>
或者我有一个包含以下数据的XML

username=testuser
password=testpassword
email=test@test.com
address=testaddress
zipcode=12345
<TestData>
   <UserInfo>
       <username>testuser</username>
       <password>testpassword</password>
       <email>test@test.com</email>
       <address>testaddress</address>
   </UserInfo>
</TestData>
另一类

public class DPTest2 {

   @Test(dataprovider="testdp")
   public void userTest_02(String email, String address, String password) {

   //Test goes here

   }
}
我的数据提供者能否从上述文本文件或XML中读取值并将其提供给测试方法

据我所知,数据提供程序将读取文本文件中的所有行,并将其提供给测试方法,并抛出一个错误,说明“数据提供程序试图提供6个参数,但测试只能接受2个参数”


请帮帮我。

伙计,你看数据提供者的方式不对。请参阅testNG文档

您的目标可以通过下面的代码来实现<代码>测试类包含测试方法。它从另一个类
TestData
中指定的数据提供程序获取数据。在
TestData
类中,我们定义了从文件/xml访问数据的方法,并将其作为“@DataProvider”方法中的“Object[][]”返回

public class Test {
   @Test(dataProvider="testData" dataProviderclass = TestData.class)
   public void userTest(TestData testData) {
       //Test code goes here
   }
}

public class TestData {

   private String username;
   private String password;

   public void setUsername(String username) {
       this.username = username;
   }

   public String getUsername() {
       return username;          
   }

   public void setPassword(String password) {
       this.password = password;
   }

   public String getPassword() {
       return password;
   }

   @DataProvider(name="testData")
   public static Object[][] userTestData (TestData testData) {           
       //Code to read from file/xml
       TestData testData = new TestData();
       testData.setUsername("Get from file/xml");
       testData.setPassword("Get from file/xml")

       return new Object{{testData}}
   }
}

伙计,你看数据提供者的方式不对。请参阅testNG文档

您的目标可以通过下面的代码来实现<代码>测试类包含测试方法。它从另一个类
TestData
中指定的数据提供程序获取数据。在
TestData
类中,我们定义了从文件/xml访问数据的方法,并将其作为“@DataProvider”方法中的“Object[][]”返回

public class Test {
   @Test(dataProvider="testData" dataProviderclass = TestData.class)
   public void userTest(TestData testData) {
       //Test code goes here
   }
}

public class TestData {

   private String username;
   private String password;

   public void setUsername(String username) {
       this.username = username;
   }

   public String getUsername() {
       return username;          
   }

   public void setPassword(String password) {
       this.password = password;
   }

   public String getPassword() {
       return password;
   }

   @DataProvider(name="testData")
   public static Object[][] userTestData (TestData testData) {           
       //Code to read from file/xml
       TestData testData = new TestData();
       testData.setUsername("Get from file/xml");
       testData.setPassword("Get from file/xml")

       return new Object{{testData}}
   }
}
是的,那是可能的。 您可以创建注释来指定此数据提供程序应从XML加载的参数

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface XmlParameters {
   String[] value();    
}

@Test(dataProvider = "XMLFileLoader")
@XmlParameters({"username", "password"})
public void testSomething(String username, String password) {
    // implementation omitted for brevity
}

@DataProvider(name = "XMLFileLoader")
public static Object[][] getDataFromXmlFile(final Method testMethod) {
    XmlParameters parameters = testMethod.getAnnotation(XmlParameters.class);
    String[] fields = parameters.value();
    //load just the fields you want
    return new Object[][] { { "user1", "pass1" } };
}
这段代码不是“生产就绪”代码,在读取值之前,您应该检查注释是否为空,最好将接口和逻辑移动到另一个类,以便在其他测试中重用。

是的,这是可能的。 您可以创建注释来指定此数据提供程序应从XML加载的参数

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface XmlParameters {
   String[] value();    
}

@Test(dataProvider = "XMLFileLoader")
@XmlParameters({"username", "password"})
public void testSomething(String username, String password) {
    // implementation omitted for brevity
}

@DataProvider(name = "XMLFileLoader")
public static Object[][] getDataFromXmlFile(final Method testMethod) {
    XmlParameters parameters = testMethod.getAnnotation(XmlParameters.class);
    String[] fields = parameters.value();
    //load just the fields you want
    return new Object[][] { { "user1", "pass1" } };
}

这段代码不是“生产准备就绪”,在读取值之前,您应该检查注释是否不为null,并且最好将接口和逻辑移动到另一个类,以便您可以在其他测试中重用。

我知道我们可以使用两个字段的getter和setter来完成。但假设我有数千个测试数据,它们都在一个文件中。因此,动态地,我的测试用例应该能够使用来自数据提供者的测试数据。可以使用上面“tiagohngl”中的答案,我知道我们可以使用几个字段的getter和setter。但假设我有数千个测试数据,它们都在一个文件中。因此,动态地,我的测试用例应该能够使用来自数据提供者的测试数据。可以使用上面“tiagohngl”的答案