Всем привет! Групповые занятия начнутся на следующей неделе «Инженер по обеспечению качества Java» .
Именно этому и будет посвящена данная публикация.
Обзор:
На данном этапе неизбежно проведение автоматических регрессионных тестов в рамках ежедневной сборки.Приятно находить ошибки и сообщать о них сразу же после их обнаружения.
В то же время проблематично проводить сотни автоматизированных тестов и удаленное параллельное выполнение.
Если у вас есть набор автоматизированных регрессионных тестов, вы можете разделить его на несколько наборов по бизнес-модулям и запускать их параллельно в рамках ежедневного автоматического регрессионного тестирования.
Большинство этих тестовых случаев выполняются на удаленной виртуальной машине, и результаты теста доступны только после его выполнения.
В противном случае вы можете заглянуть в консоль 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.
Создание дашборда:
Я бы хотел, чтобы вы посмотрели это видео, ведь в статье непросто объяснить все нюансы.Поэтому я записал видео из отеля.
Демо 2:
Подведем итог:
Надеюсь, получение результатов в реальном времени с помощью InfluxDB и Grafana показалось вам интересным и полезным.Это требует минимальных изменений в существующей структуре, поскольку мы используем прослушиватели TestNG. Удалить прослушиватель из файла set/base class достаточно, чтобы отключить эту функцию, если она вам не нужна.
Такой подход поможет избежать некоторого разочарования в команде, если ее члены занимаются только мониторингом результатов тестов через консольный ввод-вывод на удаленной машине.
В этой статье изложена только основная идея.
Вы можете улучшить этот подход, добавив дополнительную информацию, например, о тестовой среде, дополнительные фильтры для обновления данных в диаграммах для конкретной среды/тестов и т. д. Вот такой краткий, но весьма полезный материал.
Как обычно, мы ждём ваших комментариев, а также напоминаем, что будет сегодня.
День открытых дверей по курсу, на который может записаться любой желающий.
Теги: #qa #Тестирование веб-сервисов #java #Тестирование ИТ-систем #Grafana #influxdb #javaqa
-
Основы Решений Резервного Копирования
19 Oct, 24 -
Freebsd: Отчет За Четвертый Квартал 2009 Г.
19 Oct, 24 -
Вышло Обновление Для Nokia N900
19 Oct, 24 -
2R2L-Кэширование
19 Oct, 24 -
Вы Служили В Армии?
19 Oct, 24 -
Google Mail Сменил Дизайн
19 Oct, 24 -
История Разработки Одной .Net-Утилиты
19 Oct, 24