Selenium Webdriver — Метрики Тестирования В Реальном Времени С Использованием Grafana И Influxdb

Всем привет! Групповые занятия начнутся на следующей неделе «Инженер по обеспечению качества Java» .

Именно этому и будет посвящена данная публикация.



Selenium WebDriver — метрики тестирования в реальном времени с использованием Grafana и InfluxDB



Обзор:

На данном этапе неизбежно проведение автоматических регрессионных тестов в рамках ежедневной сборки.

Приятно находить ошибки и сообщать о них сразу же после их обнаружения.

В то же время проблематично проводить сотни автоматизированных тестов и удаленное параллельное выполнение.

Если у вас есть набор автоматизированных регрессионных тестов, вы можете разделить его на несколько наборов по бизнес-модулям и запускать их параллельно в рамках ежедневного автоматического регрессионного тестирования.

Большинство этих тестовых случаев выполняются на удаленной виртуальной машине, и результаты теста доступны только после его выполнения.

В противном случае вы можете заглянуть в консоль jenkins и просмотреть журналы процесса выполнения теста.

Иногда это раздражает. Было бы здорово иметь приложение, которое предоставляло бы информацию о прохождении тестов при их запуске на удаленных виртуальных машинах.

Давайте посмотрим, как мы можем создать простую страницу результатов запуска теста и панель мониторинга, используя InfluxDB и Grafana.

Цель:

Мы соберем все доступные тестовые метрики, такие как:
  • Статус метода тестирования
  • Продолжительность метода испытаний
  • Статус класса с методами тестирования
  • Время выполнения тестов одного класса
  • Статус набора тестов
  • Продолжительность выполнения набора тестов
Некоторые из показателей мы можем получить в режиме реального времени, как показано ниже:
  • Количество методов тестирования, сгруппированных по статусу (например: Пройдено: 30, Не пройдено: 2, Пропущено: 2) в определенный день.

  • Динамика времени выполнения набора тестов за неделю, месяц, год и т. д.


ИнфлюксБД:

InfluxDB — это база данных временных рядов, которая используется для сбора всех показателей тестирования.

InfluxDB имеет REST API для записи данных и отправки запросов.

Вы можете узнать больше Здесь .

Ниже я использую команду docker для запуска экземпляра InfluxDB.

  
  
  
  
  
  
  
  
   

sudo docker run -p 8086:8086 -v $PWD:/var/lib/influxdb influxdb



Создание базы данных:

У нас уже запущена база данных InfluxDB. Давайте создадим отдельную схему базы данных для сбора результатов тестов Selenium. Ниже я запускаю команду в терминале, чтобы создать в базе данных схему под названием «селен».

(Проверьте URL-адрес, замените localhost на имя хоста/ipaddress, если вы не работаете на текущем компьютере).



curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE selenium"



ТестНГ:

Давайте создадим простой тест testNG:

public class SampleTest { @Test(description = "login") public void login(){ } @Test(description = "search for flights", dependsOnMethods = "login") public void search(){ } @Test(description = "select flight", dependsOnMethods = "search") public void select(){ } @Test(description = "book flight", dependsOnMethods = "select") public void book(){ } @Test(description = "logout", dependsOnMethods = "book") public void logout(){ } }

Наша цель — собрать результаты тестов в InfluxDB во время выполнения.

Итак, нам понадобится драйвер/библиотека на Java для InfluxDB.

Зависимости Maven:

Добавьте зависимости Maven, перечисленные ниже:

<dependency> <groupId>org.influxdb</groupId> <artifactId>influxdb-java</artifactId> <version>2.12</version> </dependency>



Слушатели:

Слушатели TestNG отлично подходят для прослушивания событий и могут реагировать в зависимости от произошедшего события.

Для начала давайте создадим простой класс, отвечающий за отправку результатов в InfluxDB.

import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.influxdb.dto.Point; public class ResultSender { private static final InfluxDB INFLXUDB = InfluxDBFactory.connect(" http://localhost:8086 ", "root", "root"); private static final String DATABASE = "selenium"; static{ INFLXUDB.setDatabase(DATABASE); } public static void send(final Point point){ INFLXUDB.write(point); } }

Теперь давайте создадим еще один класс, реализующий интерфейс ITestListener.

import org.influxdb.dto.Point; import org.testng.ITestContext; import org.testng.ITestListener; import org.testng.ITestResult; import java.util.concurrent.TimeUnit; public class ExecutionListener implements ITestListener { public void onTestStart(ITestResult iTestResult) { } public void onTestSuccess(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "PASS"); } public void onTestFailure(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "FAIL"); } public void onTestSkipped(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "SKIPPED"); } public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { } public void onStart(ITestContext iTestContext) { } public void onFinish(ITestContext iTestContext) { this.sendTestClassStatus(iTestContext); } private void sendTestMethodStatus(ITestResult iTestResult, String status) { Point point = Point.measurement("testmethod") .

time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .

tag("testclass", iTestResult.getTestClass().

getName()) .

tag("name", iTestResult.getName()) .

tag("description", iTestResult.getMethod().

getDescription()) .

tag("result", status) .

addField("duration", (iTestResult.getEndMillis() - iTestResult.getStartMillis())) .

build(); ResultSender.send(point); } private void sendTestClassStatus(ITestContext iTestContext) { Point point = Point.measurement("testclass") .

time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .

tag("name", iTestContext.getAllTestMethods()[0].

getTestClass().

getName()) .

addField("duration", (iTestContext.getEndDate().

getTime() - iTestContext.getStartDate().

getTime())) .

build(); ResultSender.send(point); } }

Примечание.

Используйте дополнительный тег, соответствующий вашим целям в приведенном выше примере, чтобы классифицировать результаты.

Например, tag("сценарий", "последовательность входа").

Слушатель из приведенного выше примера будет следить за выполнением теста и после выполнения определенного метода/класса теста отправит имя, продолжительность и некоторые дополнительные сведения.

Моя цель здесь — просто дать вам представление.

Измените код в соответствии с вашими потребностями.

Теперь добавьте прослушиватель в пакет XML или базовый класс TestNG.

<suite name="My suite"> <listeners> <listener class-name="com.tag.realtime.ExecutionListener" /> </listeners> <test name="Test1"> <classes> <class name="com.tag.realtime.SampleTest"/> </classes> </test> <test name="Test2"> <classes> <class name="com.tag.realtime.Sample2Test"/> </classes> </test> </suite>

Или:

@Listeners(ExecutionListener.class) public class SampleTest { @Test public void test(){ } }



Графана:

Мы добились отправки результатов в InfluxDB. Но как запрашивать результаты и визуализировать полученные данные? Для этого мы будем использовать другой бесплатный инструмент под названием «Grafana».

Grafana — отличный инструмент визуализации данных временных рядов, хорошо работающий с InfluxDB. Ниже приведены команды докера для создания экземпляра Grafana. [плагин круговой диаграммы является необязательным в команде и может быть удален, если он не нужен]

docker run -d -p 3000:3000 --name=grafana \ -e "GF_INSTALL_PLUGINS=grafana-piechart-panel" \ -v $PWD:/var/lib/grafana \ grafana/grafana



Источник данных для Grafana:

Идти к Настройки -> Источники данных -> Добавить новый источник данных.

, как показано на скриншоте.

Нажмите кнопку «Сохранить и протестировать», чтобы убедиться, что Grafana может взаимодействовать с InfluxDB.

Примечание.

Если вы используете Grafana с Docker и пытаетесь получить доступ как «Сервер по умолчанию», НЕ используйте localhost в строке подключения InfluxDB. Это связано с тем, что localhost здесь является контейнером Grafana, а не физической машиной.

Таким образом, контейнер Grafana не сможет найти InfluxDB.



Selenium WebDriver — метрики тестирования в реальном времени с использованием Grafana и InfluxDB



Создание дашборда:

Я бы хотел, чтобы вы посмотрели это видео, ведь в статье непросто объяснить все нюансы.

Поэтому я записал видео из отеля.

Демо 2:

Подведем итог:

Надеюсь, получение результатов в реальном времени с помощью InfluxDB и Grafana показалось вам интересным и полезным.

Это требует минимальных изменений в существующей структуре, поскольку мы используем прослушиватели TestNG. Удалить прослушиватель из файла set/base class достаточно, чтобы отключить эту функцию, если она вам не нужна.

Такой подход поможет избежать некоторого разочарования в команде, если ее члены занимаются только мониторингом результатов тестов через консольный ввод-вывод на удаленной машине.

В этой статье изложена только основная идея.

Вы можете улучшить этот подход, добавив дополнительную информацию, например, о тестовой среде, дополнительные фильтры для обновления данных в диаграммах для конкретной среды/тестов и т. д. Вот такой краткий, но весьма полезный материал.

Как обычно, мы ждём ваших комментариев, а также напоминаем, что будет сегодня.

День открытых дверей по курсу, на который может записаться любой желающий.

Теги: #qa #Тестирование веб-сервисов #java #Тестирование ИТ-систем #Grafana #influxdb #javaqa

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.