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

时间:2014-06-05 18:28:40

标签: java selenium selenium-webdriver testng

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

username=testuser
password=testpassword
email=test@test.com
address=testaddress
zipcode=12345

或者我有一个包含以下数据的XML

<TestData>
   <UserInfo>
       <username>testuser</username>
       <password>testpassword</password>
       <email>test@test.com</email>
       <address>testaddress</address>
   </UserInfo>
</TestData>

我的测试如下

public class DPTest {

   @Test(dataprovider="testdp")
   public void userTest_01(String username, String Password) {

   //Test goes here

   }
}

另一个班级

public class DPTest2 {

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

   //Test goes here

   }
}

我的dataprovider可以读取上述文本文件或XML中的值并将其提供给测试方法吗?

根据我的理解,数据提供程序将读取文本文件中的所有行并将其提供给测试方法,并抛出错误说“数据提供程序正在尝试提供6个参数,但测试只能接受2个参数” ?

请帮帮我。

2 个答案:

答案 0 :(得分:3)

是的,这是可能的。 您可以创建注释以指定此DataProvider应从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,并且可能更好地移动接口和逻辑以将xml加载到另一个类,因此您可以重用另一个类测试

答案 1 :(得分:1)

Buddy,你正在以错误的方式看待数据提供者。请参阅testNG文档。 http://testng.org/doc/documentation-main.html

您的目标可以通过以下代码实现。 Test类包含测试方法。它从另一个类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}}
   }
}