Junit 使用Appium(java)和#x2B在Browserstack上运行并行测试;黄瓜+;朱尼特
使用Browserstack教程()和示例项目(),我正在努力设置并行测试 具体来说,我需要使用Cucumber.class(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
@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"
}]
}