В настоящее время я пытаюсь улучшить нашу инфраструктуру автоматизации тестирования путем распараллеливания наших тестов. Я знаю, как это сделать, но у меня возникает вопрос об управлении устройствами. Представьте, что у меня есть 5 разных устройств и 10 тестов, которые я хочу запустить параллельно. Каждый тест занимает разное количество времени и может быть запущен снова в случае неудачи. Теперь я мог бы выбирать для каждого теста одно конкретное устройство, но не хочу этого делать. Вместо этого я хочу иметь фрагмент кода, который за меня решает, какое устройство является бесплатным, и использует его. Я могу сделать это, просматривая текущие сеансы на моем сервере Appium. Это работает нормально, пока два теста не запускаются одновременно. Затем UiAutomator2 выбирает одно и то же устройство для обоих тестов и не соответствует ожидаемому результату.
org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: An unknown server-side error occurred while processing the command. Original error: The instrumentation process cannot be initialized.
Мой вопрос: есть ли у кого-нибудь здесь опыт распараллеливания тестов на нескольких устройствах и может ли он подсказать, что я могу попробовать? Я использую Appium в качестве сервера, Android в качестве ОС, Java в качестве языка программирования и TestNG.
Вот код моего костюма
Вот мой код, как я сейчас проверяю наличие занятых устройств
private URL getHubUrl() {
URL remoteAddress = null;
try {
remoteAddress = new URL("http://127.0.0.1:4723/wd/hub");
} catch (MalformedURLException e) {
Assert.fail("Selenium Grid address is malformed. Exception message: ", e);
}
return remoteAddress;
}
public void setDriver() {
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("platformName", "android");
caps.setCapability("appium:automationName", "uiautomator2");
caps.setCapability("appium:appPackage", "com.example.exampleApp");
caps.setCapability("appium:appActivity", "com.example.exampleApp.frontend.MainActivity");
List busyDevices = get_busyDevices("http://127.0.0.1:4723/wd/hub");
List availableDevices = findIdleDevices(Constants.allDevices, busyDevices);
if (!availableDevices.isEmpty()) {
System.out.println("SecondTest running on " + availableDevices.getFirst());
caps.setCapability("appium:udid", availableDevices.getFirst());
} else {
throw new RuntimeException("No device found");
}
driver = new AndroidDriver(getHubUrl(), caps);
}
public List findIdleDevices(List allDevices, List busyDevices) {
return allDevices.stream()
.filter(device -> !busyDevices.contains(device))
.collect(Collectors.toList());
}
private static List\ get_busyDevices(String appiumServerUrl) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpGet request = new HttpGet(appiumServerUrl + "/sessions");
try (CloseableHttpResponse response = httpClient.execute(request)) {
String responseString = EntityUtils.toString(response.getEntity());
JSONObject jsonResponse = new JSONObject(responseString);
return extract_Udid(jsonResponse);
}
} catch (Exception e) {
e.printStackTrace();
return new ArrayList();
}
}
public static List extract_Udid(JSONObject jsonResponse) {
JSONArray valueArray = jsonResponse.getJSONArray("value");
List udidList = new ArrayList();
for (int i = 0; i < valueArray.length(); i++) {
JSONObject capabilities = valueArray.getJSONObject(i).getJSONObject("capabilities");
String udid = capabilities.getString("udid");
if (!udidList.contains(udid)) {
udidList.add(udid);
}
}
return udidList;
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... d-uiautoma