使用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}} } }