Использование параллельного потока Java 8 для более быстрых результатов в автоматизации Selenium
Table Of Content
Поток был впервые представлен в Java 8, и API используется для обработки коллекций объектов. В основном, поток представляет собой последовательность объектов, которая поддерживает различные методы, которые могут быть объединены в цепочку для получения желаемого результата.
Различные операции с потоками:
Но сегодня мы собираемся рассмотреть параллельный и последовательный поток Java и как мы можем воспользоваться этим.
Параллельные потоки Java - это функция Java 8 и выше, которая предназначена для использования нескольких ядер процессора. В общем случае, любой код на Java имеет один поток обработки, который выполняется последовательно.
Используя параллельные потоки:
мы можем разделить код на несколько потоков, которые выполняются параллельно на отдельных ядрах, и окончательный результат - это комбинация отдельных результатов.
Есть два способа создания параллельных потоков в Java:
Теперь давайте разберемся, как мы можем использовать это в автоматизированном тестировании и достичь более быстрых результатов:
Сценарии:
- Теперь нам нужно проверить статус-код каждого URL или работает ли URL или нет.
Код:
Здесь мы используем Selenium
для извлечения URL из страниц и затем возвращаем List<String>
обратно в вызывающий метод.
public static List<String> getLinkData() {
List<String> dataList = new ArrayList<>();
try {
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
WebDriver driver = new ChromeDriver(options);
driver.get("https://www.google.com/search?q=java");
List<WebElement> el = driver.findElements(By.tagName("a"));
for (WebElement e : el) {
String href = e.getAttribute("href");
if(href!=null)
dataList.add(href);
}
System.out.println("Найдено URL = "+dataList.size());
return dataList;
}
catch (Exception ex){
return dataList;
}
}
Используем класс HttpURLConnection
для получения статуса URL:
Код:
public static int getResponseCode(String address) {
try {
URL url = new URL(address);
HttpURLConnection connection =
(HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
int responseCode = connection.getResponseCode();
System.out.println("URL = "+siteUrl);
System.out.println("Код ответа = "+responseCode);
connection.disconnect();
return responseCode;
} catch (IOException ex) {
return 0;
}
}
Код: Теперь давайте выполним код и посмотрим разницу
public static void main(String[] args) {
//Последовательное выполнение
long startTime = System.currentTimeMillis();
List<String> list1 = getLinkData();
list1.stream().forEach(url -> getResponseCode(url));
long endTime = System.currentTimeMillis();
//Параллельное выполнение
long startTimeParallel = System.currentTimeMillis();
List<String> list2 = getLinkData();
list2.parallelStream().forEach(url -> getResponseCode(url));
long endTimeParallel = System.currentTimeMillis();
printExecutionTime(endTime-startTime);
printExecutionTime(endTimeParallel-startTimeParallel);
}
public static void printExecutionTime(long milliseconds){
long minutes = (milliseconds / 1000) / 60;
long seconds = (milliseconds / 1000) % 60;
// Выводим результат
System.out.println(minutes + " минут и "
+ seconds + " секунд.");
}
Всего было найдено 120 URL на странице.
Теперь посмотрите на разницу ниже:
Бенчмаркинг:
Вы можете ясно увидеть разницу во времени выполнения обоих вариантов. И мы можем четко определить, что использование параллельного потока может ускорить весь процесс. В этом случае всего 120 URL-адресов, давайте подумаем о ситуации, когда нам нужно обработать или проверить большой объем данных.