Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
1003 - Telegram Web
Telegram Web
🔥 Стартуем с новым потоком «Python Base»

Курс подойдёт как ручным QA-инженерам, так и автотестировщикам на Java, желающим расширить стек.

Начинаете с ручного тестирования?

Python станет вашим быстрым входом в автоматизацию. Благодаря простому синтаксису, мощным библиотекам (Selenium, Playwright, Pytest, Requests) и низкому порогу входа вы быстро научитесь писать автотесты и внедрять их в реальную работу.

Уже пишете автотесты на Java?

Знание Python расширит ваш стек и откроет новые возможности. Во многих компаниях Python используют для тестирования API, мобильных приложений, data-пайплайнов и DevOps-задач. Плюс, код пишется быстрее, а инфраструктура настраивается проще.

Приходите на первое бесплатное занятие уже в этот четверг в 20:00 (МСК).

🔗 Подробнее о программе, регистрация на первый урок — по ссылке.
Media is too big
VIEW IN TELEGRAM
Как работать с базами данных в автотестировании: Connection Pooling и DataSource

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

Давайте разберемся, чем отличается DriverManager от DataSource, зачем нам Connection Pool и почему нельзя забывать закрывать соединения.

Почему DriverManager — не лучшее решение?

Когда мы вызываем DriverManager.getConnection(), каждый раз создается новое соединение с базой данных. Это, во-первых, долго: каждое подключение требует установления TCP/IP соединения, аутентификации и передачи данных. Во-вторых, ресурсоемко: база имеет ограничение по количеству активных соединений, и они быстро заканчиваются.

Как работает DataSource и почему он эффективнее?

В отличие от DriverManager DataSource позволяет использовать Connection Pool, который:

👉 Создает соединения заранее. Мы не ждем подключения каждый раз.

👉 Повышает производительность. Из пула можно быстро получить готовый Connection.

👉 Оптимизирует нагрузку на БД. То есть ограничивает количество активных соединений, предотвращая сбои.

В тестировании часто используют PGSimpleDataSource, который не использует Connection Pool и работает аналогично DriverManager. Это удобно для небольших тестов, где важна простота. Но в продакшене Connection Pool обязателен для стабильной работы.

❗️Всегда закрывайте соединения!

Каждое Connection — это реальный TCP/IP сокет. Если не закрывать соединения, их лимит в ОС быстро исчерпается, а приложение перестанет работать.

На курсе «Java Advanced 2.0» разберем лучшие практики работы с базами данных, многопоточность в тестах, API-тестирование и многое другое.

Автор программы —Дмитрий Тучс, Head of QA в Dodo Engineering, спикер Codefest, Codetalks, EpicHey!, ментор и open-source контрибьютор.

🔗 Зарегистрируйтесь на первый открытый урок — по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Мобильная автоматизация: почему стоит освоить Appium на Python

Appium позволяет писать тесты одновременно для Android и iOS, используя единый подход и один язык программирования — Python.

А еще фреймворк поддерживает работу с реальными устройствами и эмуляторами и интегрируется в CI/CD-процессы.

Подробно о работе Appium мы говорим на курсе «Python Base». А также разбираемся с веб-автоматизацией, тестированием API, тест-менеджментом и многим другим.

Бесплатный пробный урок — уже сегодня в 20:00 (МСК).

🔗 Зарегистрируйтесь по ссылке, чтобы не пропустить занятие.
Please open Telegram to view this post
VIEW IN TELEGRAM
🐍 Первый урок «Python Base» доступен в записи! 

На занятии разработали несколько автотестов на поиск: google, yandex, yahoo. Написали код на Python / Selenium и переписали на Python / Selene и Python / Playwright.

P.S. Попробуйте запустить пример с Playwright, к занятию приложена рабочая ссылка.

Посмотреть занятие можно на платформе школы, YouTube или Rutube. 

И небольшая скидка 5% действует до завтра до 12 утра по московскому времени. 

До встречи на занятиях!
Forwarded from LikeaDuck🦆
#Java #qaguru

Скриншотные тесты - неизбежная необходимость во многих проектах, особенно где есть всякие красивые графики и диаграммы в canvas. Проверяется это только скриншотными тестами, и если мы используем Selenide, то понадобиться еще какая-нибудь библиотека-сравнивалка.

Самая известная из них - ashot от Яндекса.

Тогда наш код может выглядеть примерно так:

assertFalse(
new ImageDiffer().makeDiff(
expectedImage,
ImageIO.read(requireNonNull($("canvas[role='img']").screenshot()))
).hasDiff()
);


где ImageDiffer - класс из ashot, expectedImage - ожидаемое изображение, которое у вас где-то в ресурсах, завернутое в BufferedImage.

Этот код всем неплох (и даже прекрасно прячется внутрь PageObject), но у меня к нему есть вопросы:

1) В случае падения именно этого ассерта, нам нужен совершенно специфичный формат Allure Attachment:
Allure.addAttachment(
"Screenshot diff",
"application/vnd.allure.image.diff",
objectMapper.writeValueAsString(screenDif)
);

2) Нам надо иметь возможность перезаписать expected изображения запустив тест со специальным флагом (например, у нас новый браузер и в нем canvas выглядит слегка по другому).

3) Задачи 1 и 2 хотелось бы делать где-то под капотом, что бы наш код тестов вообще ничего не знал об этих особенностях.

Все эти пункты можно изящно решить с помощью JUnit Extensions, и это один из практических примеров, которые я рассказываю на своем авторском курсе для java автоматизаторов, который стартует буквально на следующей неделе. Наши скриншотные тесты будут простыми, а все, что сложнее ассерта - будет жить в Extension.

Приходите послушать меня и Мишу Рубанова в 54 сериях, я гарантирую, что это будет интересно 🚀
This media is not supported in your browser
VIEW IN TELEGRAM
Как правильно вставлять данные через JDBC и получать сгенерированные ключи?
При работе с JDBC одна из частых задач — вставка новых записей в базу данных и получение автоматически сгенерированных ключей. Рассмотрим конкретный пример реализации на Java и разберём важные детали, которые помогут вам избежать ошибок и писать чистый, эффективный код.

Шаг 1: Подготовка подключения и SQL-запроса
Создаём подключение к базе данных:


try (Connection connection = getConnection()) {
String sql = "INSERT INTO spend (id, username, spend_date, currency, amount, description, category_id) VALUES (?, ?, ?, ?, ?, ?, ?)";

try (PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
// заполняем параметры
}
} catch (SQLException e) {
throw new RuntimeException(e);
}


Важно: используем конструкцию try-with-resources для автоматического закрытия ресурсов (Connection, PreparedStatement, ResultSet). Это гарантирует отсутствие утечек памяти и соединений.

Шаг 2: Установка параметров PreparedStatement
Не забывайте использовать правильные методы для каждого типа данных:

Для UUID используем setObject()

Для строк — setString()

Для дат лучше использовать setDate()

Для чисел — соответствующие методы (setDouble(), setInt() и т.д.)

Пример заполнения параметров:

ps.setObject(1, spend.getId()); // UUID
ps.setString(2, spend.getUserName());
ps.setDate(3, Date.valueOf(spend.getSpendDate())); // LocalDate -> Date
ps.setString(4, spend.getCurrency()); // валюта как строка ("USD", "RUB")
ps.setDouble(5, spend.getAmount());
ps.setString(6, spend.getDescription());
ps.setObject(7, spend.getCategory().getId()); // UUID


Шаг 3: Выполнение запроса и получение ключа
После выполнения запроса извлекаем сгенерированный ключ из ResultSet:

ps.executeUpdate();

try (ResultSet rs = ps.getGeneratedKeys()) {
if (rs.next()) {
UUID generatedKey = rs.getObject("id", UUID.class);
spend.setId(generatedKey);
} else {
throw new SQLException("Can't find id in result set");
}
}


Это важно для того, чтобы объект в памяти соответствовал записи в базе данных.

Шаг 4: Повторное использование кода
Код вставки данных можно легко адаптировать для других таблиц. Например, для таблицы категорий (category) достаточно изменить SQL-запрос и количество параметров:

String sql = "INSERT INTO category (id, username, name, archived) VALUES (?, ?, ?, ?)";
try (PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
ps.setObject(1, category.getId());
ps.setString(2, category.getUserName());
ps.setString(3, category.getName());
ps.setBoolean(4, category.isArchived());

ps.executeUpdate();

try (ResultSet rs = ps.getGeneratedKeys()) {
if (rs.next()) {
UUID generatedKey = rs.getObject("id", UUID.class);
category.setId(generatedKey);
} else {
throw new SQLException("Can't find id in result set");
}
}
}


Итог: что важно помнить?
Используйте try-with-resources для надёжного закрытия соединений.

Правильно выбирайте методы установки параметров PreparedStatement.

Всегда проверяйте наличие сгенерированного ключа после вставки.

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

Следуя этим рекомендациям, вы получите надёжный и поддерживаемый код работы с базой данных через JDBC.

На курсе «Java Advanced 2.0» вы получите практический опыт работы с JDBC, Hibernate, Spring Boot и другими востребованными технологиями.

Автор программы —Дмитрий Тучс, Head of QA в Dodo Engineering, спикер Codefest, Codetalks, EpicHey!, ментор и open-source контрибьютор.

🔗 Зарегистрируйтесь на первый открытый урок — по ссылке.
Сегодня проведу небольшое открытое занятие у коллег по цеху ;)
Forwarded from QA_Road_channel
Во вторник 18 марта в 20 по мск

К нам на посиделки придет true автоматизатор Станислав Васенков

Он расскажет про фреймворки:
- selene (надстройку на selenium)
- playwright

Их плюсы, минусы, особенности

Проходить все будет тут на канале
Запись будет
Media is too big
VIEW IN TELEGRAM
Использование JDBC: почему CallableStatement не всегда нужен, и когда он полезен?

В работе с JDBC чаще всего упоминаются Statement и PreparedStatement. Но есть еще один интерфейс — CallableStatement, о котором говорят реже. Стоит ли вам его изучать и применять?

CallableStatement предназначен исключительно для вызова хранимых процедур в базе данных. Хранимые процедуры — это куски бизнес-логики, написанные непосредственно на стороне базы данных. Например, в PostgreSQL вы можете использовать язык PL/pgSQL для реализации логики, которая автоматически создает дефолтные категории при добавлении нового пользователя.

Когда это полезно:

👉 Если бизнес-логика тесно связана с данными и ее удобнее реализовать на уровне базы.

👉 Когда нужно повысить производительность за счет минимизации сетевого взаимодействия между приложением и базой данных.

👉 Если вы хотите централизовать логику и сделать ее доступной для разных приложений.

Но есть и обратная сторона:

👉 Логика в базе данных усложняет поддержку и тестирование приложения.

👉 Это может привести к зависимости от конкретного вендора базы данных, затрудняя миграцию на другую СУБД.

👉 Именно поэтому CallableStatement не всегда нужен. В большинстве случаев достаточно PreparedStatement, который позволяет безопасно передавать параметры в SQL-запросы.

Единственная сложность PreparedStatement — невозможность напрямую вывести готовый SQL-запрос через toString(). Но существуют обходные пути, позволяющие логировать запросы даже при его использовании.

Вывод: CallableStatement — мощный инструмент, но применять его стоит осознанно, только если преимущества перевешивают минусы. В остальных случаях PreparedStatement остается оптимальным выбором.

На курсе «Java Advanced 2.0» мы разберемся в тонкостях работы с JDBC, узнаем как эффективно использовать Statement, PreparedStatement и CallableStatement и освоим другие продвинутые технологии работы с базами данных и тестированием.

Автор программы — Дмитрий Тучс, Head of QA в Dodo Engineering, спикер Codefest, Codetalks, EpicHey!, ментор и open-source контрибьютор.

🔗 Зарегистрируйтесь на первый открытый урок — по ссылке.

До встречи завтра в 20:00 (мск)!
Please open Telegram to view this post
VIEW IN TELEGRAM
Playwright уверенно закрепился в топе инструментов автоматизации тестирования, и в 2025 году его позиции только укрепились. Вот 7 причин, почему сегодня он заслуженно считается лучшим решением для QA-инженеров и разработчиков:

1) Нативная интеграция с браузерами
В отличие от инструментов, основанных на WebDriver (например, Selenium), Playwright взаимодействует напрямую с нативными протоколами автоматизации браузеров. Это обеспечивает более точный контроль над браузером, ускоряет выполнение тестов и минимизирует нестабильность сценариев.

2) Продвинутые возможности кросс-браузерного тестирования
Playwright поддерживает Chromium, Firefox и WebKit (Safari), позволяя запускать тесты без дополнительных конфигураций на разных платформах и устройствах. В 2025 году ожидается еще больше улучшений в поддержке последних версий браузеров и новых веб-стандартов.

3) AI-генерация и самовосстановление тестов
В 2025 году Playwright активно внедряет искусственный интеллект для автоматической генерации сценариев на основе анализа пользовательских действий. Кроме того, AI-функции позволяют тестам «самовосстанавливаться» при изменениях UI, заметно снижая затраты на поддержку тестового покрытия.

4) Расширенные возможности отладки и отчетности
Playwright предоставляет мощные инструменты для real-time отладки, пошагового выполнения сценариев и детализированного логирования ошибок. Кастомизируемые отчёты позволяют QA-командам принимать решения на основе глубокого анализа результатов.

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

6) Расширенные возможности сетевого и нагрузочного тестирования
Playwright позволяет имитировать различные сетевые условия (задержки, нестабильность соединения), измерять производительность приложений и выявлять узкие места для оптимизации — это критически важно в условиях роста требований к скорости работы приложений.

7) Высокая масштабируемость за счёт параллельного выполнения
Playwright поддерживает параллельный запуск множества тестов одновременно, что значительно сокращает время выполнения тестовых наборов. Возможность распределённого запуска на различных окружениях обеспечивает стабильность результатов вне зависимости от инфраструктуры

Playwright — это не просто инструмент для автоматизации тестирования, а настоящий прорыв в мире QA.

Если вы хотите освоить его на экспертном уровне и стать востребованным Automation QA-инженером - зарегистрируйтесь на первый открытый урок по ссылке.
Forwarded from Anton
#qaguru #javaadvanced #отзыв

Хочу рассказать о курсе Java Advanced от Дмитрия Тучса, который попадает в категорию КУРСОВ, Олимп self-help образования. ⛰️

1️⃣ Почему вписался изначально?
За последние несколько лет редко работал с Java и успел забыть то, что раньше знал. На новом проекте надо было строить автоматизацию вокруг монолита на Джаве, поэтому принялся искать курс «для продолжающих», чтобы быстро вкатиться и начать применять знания на боевом проекте.

2️⃣ Первые впечатления
Курс сложный. Он не объёмный, он огромный — готовьтесь тратить пару десятков часов еженедельно, чтобы успевать с потоком.
Какие-то темы были понятны сразу, какие-то приходилось пересматривать. Если попытаться обобщать, курс строится вокруг границ применения JUnit Extensions для E2E тестов, чтобы код тестов оставался поддерживаемым и понятным.
JUnit Extensions — недооценённый алмаз 💎, который требует кропотливой огранки. Дмитрий Тучс овладел ремеслом огранки лучше всех в русскоязычном сегменте, поэтому научитесь вы многому.

Как учил Дэвид Линч «Понимание переоценено», поэтому не пытайтесь сходу въехать во все технические детали. Почему так, а не иначе. С практикой и выполнением домашек понимание начнёт догонять.
А когда догонит, вы поймёте, что инструмент мощный и позволяет делать крутые штуки без оверхеда.

По ходу курса Дмитрий объясняет не только как писать тесты, но и многие вещи из мира разработки бэкенд сервисов. А ссылок на материалы и доклады хватит еще на месяц самообразования.

3️⃣ Для кого?
Если вы готовы инвестировать в себя, как в специалиста в QA и автоматизации, этот курс для вас. Думаю, после прохождения результат можно назвать левел-апом с несколькими уровнями. По моему скромному мнению этот курс экономит годы времени в промышленном тестировании. Я был бы счастлив, чтобы соискатели на Senior позиции были на 50% знакомы с темами курса.
К сожалению, на рынке обычно все намного печальнее.

4️⃣ Пожелания
Было бы круто добавить пару уроков про Testcontainers, как библиотеку для в помощь при написании интеграционных тестов.
Курс помог мне переделать запуск интеграционных тестов с параллельным запуском контейнеров, у нас теперь эти тесты бегут в шесть потоков, и каждый класс запускает свой набор контейнеров независимо.
Мы начинаем! Вводное занятие курса "Автоматизация тестирования на Java Advanced"

🔗 Подключайтесь по ссылке.
Время автоматизировать на JavaScript 🌚

Автоматизация QA шагает вперед, нет времени отставать!

Преимущества экосистемы тестирования на JS:

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

👉 С помощью инструментов по типу Istanbul/NYC для JavaScript мы можем оценить объем покрытия кода тестами.

👉 А Allure 3, который раньше ассоциировался в основном с Java, теперь переписан на JavaScript.

Приходите на открытое занятие по JS+Playwright, будем учиться писать автотесты на JavaScript и работать с новым фреймворком.

Что в программе?

👉 Разберемся в основах языка JavaScript и научимся использовать Playwright для автоматизации тестирования веб-приложений.

👉 Освоим создание автоматизированных тестов для современных веб-приложений, включая работу с динамическими элементами и сложными интерфейсами.

👉 Изучим Page Object Model для построения масштабируемых и поддерживаемых тестовых фреймворков.

👉 Узнаем, как интегрировать API-тестирование в свои сценарии, создавать данные, тестировать их и удалять в рамках одного скрипта.

👉 А еще, как настроить инфраструктуру для запуска тестов, включая отчеты (Allure Reports) и уведомления о статусе тестов в Telegram или Slack.

И многое другое!

🔗 Посмотрите план курса и зарегистрируйтесь на встречу по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Открываем удивительный мир автоматизации на Java!

🪄Если вы ждали знак, то это он. Ваш знак написать свой первый автотест.

Java выбирают для старта в разработке и QA. Выучить язык с нуля реально, а для написания автотестов достаточно освоить базу.

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

На курсе мы учим писать код с нуля и применять его в ремесле QA, работать с популярными инструментами автоматизации, например, Selenide и JUnit. А еще запускать параллельное тесты, автотесты на разных платформах и многому другому!

Приходите знакомиться с Java на бесплатном занятии по Java Base в следующий четверг.

🔗 Программа курса и регистрация на первый урок — по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Разберем архитектуру тестового фреймворка на JS, как конструктор Lego 🧱

Ждем вас на первом занятии курса «JavaScript + Playwright» в этот четверг, 27 марта, в 20:00 (мск).

Вводное проведет Любовь Данилова, опытный QA-инженер с 10+ лет опыта.

Рекомендуем курс ручным тестировщикам, особенно если вы уже работали с тестированием веб-приложений 📱

А еще программа подойдет новичкам!

Приходите на занятие, даже если никогда не писали код. Синтаксис JS проще, чем у многих других языков (например, у Java или C#).

На первом занятии вы научитесь:

🔜Настраивать среду разработки, запускать и отлаживать тесты.

🔜Работать с ключевыми элементами тестового фреймворка.

🔜А еще разберетесь в структуре автотестов и тестового фреймворка.

🔠 И напишете свой первый автотест на JS.

🔗 Зарегистрируйтесь для участия по ссылке.

Все студенты первого занятия получат домашку, которую мы проверим.
Please open Telegram to view this post
VIEW IN TELEGRAM
Playwright — Флэш в мире автотестов 🦸‍♂️

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

Что может Playwright?

Параллельное выполнение тестов

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

Изоляция контекста браузера

Создание нового контекста браузера для каждого теста занимает всего несколько миллисекунд. Это обеспечивает полную изоляцию тестов без накладных расходов.

Встроенные механизмы ожидания

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

Быстрый запуск браузера

Playwright оптимизирует запуск браузера, что особенно важно при выполнении множества небольших тестов.

Эмуляция мобильных устройств

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

Мощные инструменты отладки

Встроенные инструменты, такие как Inspector и Trace Viewer, позволяют быстро находить и исправлять ошибки.

Кодогенерация

Функция codegen позволяет быстро создавать базовые тесты, записывая действия пользователя.

Поддержка нескольких языков

Подойдет для работы на TypeScript, JavaScript, Python, .NET или Java.

Надежные селекторы

Playwright использует надежные селекторы, которые работают даже при изменении структуры DOM, а это уменьшает количество ложных срабатываний.

Интеграция с CI/CD

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

Хотите узнать больше?

Ждем вас завтра в 20:00 (мск) на открытом занятии «JavaScript + Playwright».

Будет много практики 👩‍💻

🔗 Зарегистрируйтесь, чтобы получить ссылку на трансляцию.
Please open Telegram to view this post
VIEW IN TELEGRAM
Мы начинаем!

Вводное
занятие курса «Автоматизация тестирования на JavaScript + Playwright».

🔗 Подключайтесь по ссылке.
2025/05/28 21:20:47
Back to Top
HTML Embed Code: