上下文:
我想要什么:
为每个设备使用不同的凭据
我尝试将@Parameter和数据提供者结合起来,例如:
@Test(priority = 1, dataProvider = "loginCredentials", dataProviderClass = LoginDataProvider.class)
@Parameters("testDataId")
public void handleSuccessLogin(String testDataIdMark, String phoneNumber, String password, String testDataId){
System.out.println("testDataidMark "+testDataIdMark);
System.out.println("phoneNumber "+ phoneNumber);
System.out.println("passoword "+ password);
System.out.println("testDataId "+ testDataId);
}
数据提供者:
public class LoginDataProvider {
@DataProvider(name = "loginCredentials")
public Object[][] getTestData() {
return new Object[][]{
{"1", "123456", "111111"},
{"2", "654321", "222222"}
};
}
}
XML:
<test name="Login">
<parameter name="appiumPort" value="4723"/>
<parameter name="platformName" value="android"/>
<parameter name="platformVersion" value="5"/>
<parameter name="udid" value="xxxxxx"/>
<parameter name="appPackage" value="mtda.xxx"/>
<parameter name="appActivity" value="com.xxx"/>
<parameter name="testDataId" value="1"/>
<classes>
<class name="testcases.LoginTestCase">
</class>
</classes>
</test>
<test name="Login2">
<parameter name="appiumPort" value="4725"/>
<parameter name="platformName" value="android"/>
<parameter name="platformVersion" value="7"/>
<parameter name="udid" value="xxxxxx"/>
<parameter name="appPackage" value="mtda.xxx"/>
<parameter name="appActivity" value="com.xxx"/>
<parameter name="testDataId" value="2"/>
<classes>
<class name="testcases.LoginTestCase">
</class>
</classes>
</test>
但它返回错误:
has no parameters defined but was found to be using a data provider (either explicitly specified or inherited from class level annotation). Data provider mismatch
这里的问题是,在数据驱动测试方面,您正在结合 TestNG 提供的两种形式的支持。
@Parameters
和 @DataProvider
基本上是 TestNG 必须提供的数据驱动支持方法的两种变体,因此它们本质上是互斥的。所以你不能将它们开箱即用地组合在一起。
话虽如此,有一种简单的方法可以做到这一点。您始终可以通过
<test>
访问当前的 ITestContext
参数。下面的修改示例向您展示了如何执行此操作。
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Optional;
public class SampleTestCase {
@Test(priority = 1, dataProvider = "loginCredentials", dataProviderClass = LoginDataProvider.class)
public void handleSuccessLogin(String testDataIdMark, String phoneNumber, String password) {
ITestResult currentTestResult = Reporter.getCurrentTestResult();
//The below approach reads the current <test> or its enclosing <suite> level defined parameters
String rawValue = currentTestResult.getTestContext().getCurrentXmlTest().getParameter("testDataId");
String testDataId = Optional.ofNullable(rawValue).orElse(rawValue);
System.out.println("testDataidMark " + testDataIdMark);
System.out.println("phoneNumber " + phoneNumber);
System.out.println("password " + password);
System.out.println("testDataId " + testDataId);
}
public static class LoginDataProvider {
@DataProvider(name = "loginCredentials")
public Object[][] getTestData() {
return new Object[][]{{"1", "123456", "111111"}, {"2", "654321", "222222"}};
}
}
}