使用数据提供程序和@Parameter的Appium并行设备

问题描述 投票:0回答:1

上下文:

  • 我的代码(登录测试用例)已经通过并且它在并行设备中运行
  • 用户凭据来自@DataProvider(通过的测试使用相同的凭据)

我想要什么:

为每个设备使用不同的凭据

我尝试将@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

java selenium-webdriver testng appium automation-testing
1个回答
0
投票

这里的问题是,在数据驱动测试方面,您正在结合 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"}};
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.