【问题标题】:Reading data from file using DataProvider in testng在 testng 中使用 DataProvider 从文件中读取数据
【发布时间】:2014-07-26 21:10:51
【问题描述】:

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

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

   }
}

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

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

请帮帮我。

【问题讨论】:

    标签: java selenium selenium-webdriver testng


    【解决方案1】:

    是的,这是可能的。 你可以创建一个注解来指定这个 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" } };
    }
    

    此代码不是“生产就绪”,您应该在读取值之前检查注释是否不为空,并且可能更好地将接口和逻辑移动到另一个类中,这样您就可以在另一个类上重用测试。

    【讨论】:

      【解决方案2】:

      伙计,您以错误的方式看待数据提供者。请参阅 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}}
         }
      }
      

      【讨论】:

      • 我知道我们可以在几个字段中使用 getter 和 setter。但是假设我有数千个测试数据,并且我将它们全部放在一个文件中。因此,我的测试用例应该能够动态地使用来自数据提供者的测试数据。可以使用“tiagohngl”中的上述答案
      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2019-02-23
      • 1970-01-01
      相关资源
      最近更新 更多