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

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

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

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

   testuser testpassword test@test.com 
testaddress

我有一个测试如下

 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个参数”?

请帮帮我。

是的,那是可能的。 您可以创建注释以指定此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加载到另一个类,因此您可以在其他测试中重用。

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

你的目标可以通过类似下面的代码来实现。 Test类包含测试方法。 它从另一个类TestData指定的dataprovider获取数据。 在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}} } }