假设我有一个包含以下数据的文本文件
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个参数” ?
请帮帮我。
答案 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}}
}
}