Junit 使用Appium(java)和#x2B在Browserstack上运行并行测试;黄瓜+;朱尼特

Junit 使用Appium(java)和#x2B在Browserstack上运行并行测试;黄瓜+;朱尼特,junit,cucumber,appium,browserstack,Junit,Cucumber,Appium,Browserstack,使用Browserstack教程()和示例项目(),我正在努力设置并行测试 具体来说,我需要使用Cucumber.class(@RunWith(Cucumber.class))运行suirte,以便从场景中读取测试,而Browserstack文档告诉我使用Parameterized.class(公共类并行扩展参数化()运行。 我遇到的最大问题是,如果使用Cucumber类运行套件,如何将多个device+os配置解析到Browserstack 我的跑步课: package step_defini

使用Browserstack教程()和示例项目(),我正在努力设置并行测试

具体来说,我需要使用Cucumber.class(
@RunWith(Cucumber.class)
)运行suirte,以便从场景中读取测试,而Browserstack文档告诉我使用Parameterized.class(
公共类并行扩展参数化(
)运行。
我遇到的最大问题是,如果使用Cucumber类运行套件,如何将多个device+os配置解析到Browserstack

我的跑步课:

package step_definitions;

import org.junit.runner.RunWith;
import io.cucumber.junit.CucumberOptions;
import io.cucumber.junit.Cucumber;

@RunWith(Cucumber.class)
@CucumberOptions(features = {
        "src/main/resources/FeatureFiles" }, dryRun = false, strict = false, monochrome = true, plugin = {
                "html:target/cucumber", "json:target/cucumber.json" },
        // glue = {"iOSAutomation/src/test/java/step_definitions"},

        tags = { "@Login"})

public class RunTest {

}
发射器:

package step_definitions;

import (...)

public class Launcher {

    public static IOSDriver<IOSElement> driver;
    public static WebDriverWait wait;

    // Parallel BS tests
    private static JSONObject config;

    @Parameter(value = 0)
    public static int taskID;

    @Parameters
    public static Iterable<? extends Object> data() throws Exception {
        List<Integer> taskIDs = new ArrayList<Integer>();

        if (System.getProperty("config") != null) {
            JSONParser parser = new JSONParser();
            config = (JSONObject) parser.parse(new FileReader("src/main/resources/conf/" + System.getProperty("config")));
            int envs = ((JSONArray) config.get("environments")).size();

            for (int i = 0; i < envs; i++) {
                taskIDs.add(i);
            }
        }       

        return taskIDs;
    }

    @Before

    public static void Launchapp(Scenario scenario) throws InterruptedException, FileNotFoundException, IOException, ParseException {

        JSONArray envs = (JSONArray) config.get("environments");

        DesiredCapabilities caps = new DesiredCapabilities();

            caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "xcuitest");
            caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
            caps.setCapability("bundleId", bundleId);
            caps.setCapability(MobileCapabilityType.APP, "useNewWDA");
            caps.setCapability(MobileCapabilityType.APP, "clearSystemFiles");
            caps.setCapability(MobileCapabilityType.APP, app);
            caps.setCapability("browserstack.local", "false");
            caps.setCapability("webkitResponseTimeout", "60000");
            caps.setCapability("browserstack.localIdentifier", "Test123");
            caps.setCapability("browserstack.appium_version", "1.9.1");
            caps.setCapability("startIWDP", true);
            caps.setCapability("instrumentApp", true);
            caps.setCapability("webkitResponseTimeout", 70000);

            Map<String, String> envCapabilities = (Map<String, String>) envs.get(taskID);
            Iterator it = envCapabilities.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry pair = (Map.Entry) it.next();
                caps.setCapability(pair.getKey().toString(), pair.getValue().toString());
            }

            driver = new IOSDriver<IOSElement>(
                    new URL("http://" + userName + ":" + accessKey + "@hub-cloud.browserstack.com/wd/hub"), caps);

            sessionId = driver.getSessionId().toString();


        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        wait = new WebDriverWait(driver, 30);

    }

    @After
    public void tearDown(Scenario scenario) throws Exception {
        driver.quit();
    }


}
和配置文件:

{
  "environments": [{
    "device": "iPhone XR",
    "os_version": "12"
  }, {
    "device": "iPhone 6S",
    "os_version": "11"
  }, {
    "device": "iPhone XS",
    "os_version": "13"
  }, {
    "device": "iPhone XS Max",
    "os_version": "12"
  }]
}

如何让它工作?我可以用Cucumber.class运行它并以某种方式合并Parallelized.java中的方法吗

您可以使用MakeFile,在这里您可以提供所有设备或平台功能,并且通过cucumber jvm并行插件,测试可以在Browserstack中并行运行。这将是最简单的解决方案

示例生成文件:

browserstack_并行: make-j bs_iPhoneXS bs_iPhoneX

bs_iPhoneXS: mvn测试-Dbs_local_testing=false-Dbs_device=iPhoneXS-Dbs_app=bs://0fb247cde17a979db4d7e5a521bc600af7620b63

bs_iPhoneX: mvn测试-Dbs_local_testing=false-Dbs_device=iPhoneX-Dbs_app=bs://0fb247cde17a979db4d7e5a521bc600af7620b63


您可以通过键入make browserstack_parallel从终端运行MakeFile。您可以在提供所有设备或平台功能的地方使用MakeFile,使用cucumber jvm并行插件,测试可以在browserstack中并行运行。这将是最简单的解决方案

示例生成文件:

browserstack_并行: make-j bs_iPhoneXS bs_iPhoneX

bs_iPhoneXS: mvn测试-Dbs_local_testing=false-Dbs_device=iPhoneXS-Dbs_app=bs://0fb247cde17a979db4d7e5a521bc600af7620b63

bs_iPhoneX: mvn测试-Dbs_local_testing=false-Dbs_device=iPhoneX-Dbs_app=bs://0fb247cde17a979db4d7e5a521bc600af7620b63


当以并行方式运行时,您可以通过键入make browserstack_parallel

从终端运行MakeFile
静态
变量在线程之间共享。这意味着不同的场景尝试对您的驱动程序执行不同的操作。您应该使用DI(例如Cumber picocontainer`)在步骤之间共享状态。感谢您指出这一点!我会重做这个。但这并没有让我更接近解决方案?你真的必须使用Junit吗?我建议您在相同的框架中使用TestNG,它工作得很好。它具有并行性、与cucumber一起工作的能力和相当清晰的配置我知道使用TestNG要容易得多,另一方面,它不是每次发现问题时切换技术的最佳方法。如果找不到更好的方法,那将是我最不愿意做的事情。当并行运行时,
static
变量在线程之间共享。这意味着不同的场景尝试对您的驱动程序执行不同的操作。您应该使用DI(例如Cumber picocontainer`)在步骤之间共享状态。感谢您指出这一点!我会重做这个。但这并没有让我更接近解决方案?你真的必须使用Junit吗?我建议您在相同的框架中使用TestNG,它工作得很好。它具有并行性、与cucumber一起工作的能力和相当清晰的配置我知道使用TestNG要容易得多,另一方面,它不是每次发现问题时切换技术的最佳方法。如果找不到更好的方法,那将是我最不愿意做的事。
{
  "environments": [{
    "device": "iPhone XR",
    "os_version": "12"
  }, {
    "device": "iPhone 6S",
    "os_version": "11"
  }, {
    "device": "iPhone XS",
    "os_version": "13"
  }, {
    "device": "iPhone XS Max",
    "os_version": "12"
  }]
}