qa.log
66 subscribers
18 photos
8 videos
45 links
Feedback -> @wlasadd
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
📱 AI
👩‍💻 SUGGEST NAMES

Эта функциональность AI-ассистента нацелена на пользователей, у которых возникают сложности с наименованием тех или иных сущностей внутри своего проекта.

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

На текущий момент среди опций предлагаются в основном синонимичные варианты без контекстуальной нагрузки. Но, вероятно, в будущем логика подборки усложнится и оптимизируется под замысел переименуемого объекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
📁СОБЕСЕДОВАНИЕ:

Продолжаем разговор о принципах ООП

⚫️Раздел: Принципы ООП на примере типичного проекта автотестов
⚫️Вопрос: Полиморфизм (Polymorphism)
Please open Telegram to view this post
VIEW IN TELEGRAM
qa.log
📁СОБЕСЕДОВАНИЕ: Продолжаем разговор о принципах ООП ⚫️Раздел: Принципы ООП на примере типичного проекта автотестов ⚫️Вопрос: Полиморфизм (Polymorphism)
Полиморфизм позволяет использовать разные классы через единый интерфейс или базовый класс.

🔽Например, у нас есть интерфейс АПИ одного из клиентов с 1 методом:

interface SelfPickupAPI {
fun getActiveSelfPickUpTasks(
@Parameter(name = "Authorization", description = "Авторизационный токен", `in` = ParameterIn.HEADER)
authHeader: String,
): Result<Error, TaskCollectionsV2>
}


🔽Мы имплементируем этот интерфейс в класс менеджера и реализуем имеющийся в этом интерфейсе метод в различных вариациях для получения требующихся нам данных и процессов:

@Component
class SelfPickUpManager(
private val selfpickupClient: SelfPickupAPI
) {

fun findPendingSelfPickUpOrder(authHeader: String, orderId: UUID, stage: Stage): OrderViewV2 {
var orderList: TaskCollectionsV2?

val result = repeatUntilAppears {
orderList = getActiveSelfPickUpTasks(authHeader, stage)

orderList!!.pendingTasks.asSequence() // Обходим список задач, которые находятся в ожидании
.flatMap { it.orders.asSequence() } // Разворачиваем все заказы в один список
.find { order -> order.orderId == orderId } // Ищем заказ с нужным ID
}.unwrap { "Could not find active order [$orderId] at ${stage.name}" }

return result
}

fun findProgressingSelfPickUpOrder(authHeader: String, orderId: UUID, stage: Stage): OrderViewV2 {
var orderList: TaskCollectionsV2?

val result = repeatUntilAppears {
orderList = getActiveSelfPickUpTasks(authHeader, stage)

orderList!!.progressingTasks.asSequence() // Обходим список задач, которые находятся в работе
.flatMap { it.orders.asSequence() } // Разворачиваем все заказы в один список
.find { order -> order.orderId == orderId } // Ищем заказ с нужным ID
}.unwrap { "Could not find active order [$orderId] at ${stage.name}" }

return result
}
}


🔽А затем класс @Component путем использования аннотации @Autowired можно имплементировать в класс шагов, которые впоследствии будут использованы в самих тестах:

@Component
class SelfPickUpSteps {

@Autowired
private lateinit var selfPickUpManager: SelfPickUpManager

@Step(value = "Заказ отображен в списке ожидания в разделе Самовывоз")
fun findPendingSelfPickUpOrder(user: UserWithToken, orderId: OrderId, stage: Stage): OrderViewV2 {
val pendingOrder = selfPickUpManager.findPendingSelfPickUpOrder(user.token, orderId, Stage.SELF_PICKUP)
assertThat(pendingOrder.status)
.describedAs("Incorrect order [$orderId] status")
.isEqualTo(OrderStatus.IN_PROGRESS)
return pendingOrder
}
}


Зачем это нужно?
1️⃣ Гибкость: Легко менять реализацию, не переписывая тесты.
2️⃣ Мокирование: Легко создавать mock объекты для тестирования.
3️⃣ Модульность: Улучшается структура проекта и его расширяемость.
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Новая задача Length of Last Word

ОПИСАНИЕ 📰:
Если задана строка s, состоящая из слов и пробелов, верните длину последнего слова в строке.

Слово - это максимальная подстрока, состоящая только из символов, не содержащих пробелов.


ПРИМЕРЫ 🔽:

Input: s = "Hello World"
Output: 5
Explanation: The last word is "World" with length 5.

Input: s = " fly me to the moon "
Output: 4
Explanation: The last word is "moon" with length 4.

Input: s = "luffy is still joyboy"
Output: 6
Explanation: The last word is "joyboy" with length 6.
Please open Telegram to view this post
VIEW IN TELEGRAM
qa.log
🖥 Новая задача Length of Last Word ОПИСАНИЕ 📰: Если задана строка s, состоящая из слов и пробелов, верните длину последнего слова в строке. Слово - это максимальная подстрока, состоящая только из символов, не содержащих пробелов. ПРИМЕРЫ 🔽: Input: s…
Зачем такая задача?

🔽 Задача обучает работать с данными, содержащими структурированные и неструктурированные фрагменты (например, журнал запросов, CSV, чат‑логи), где нужно быстро выделить последний токен, код операции, ключевое слово и тд.

Можно решать разными способами с и без ориентации на память и скорость, процессно или чисто алгоритмически.

Примитивные примеры:
🟢Телеграм‑бот, который на последнем слове анализирует команду: например, ввод "помоги мне с оплатой”. Бот должен быстро определить "оплатой".
🟢Парсер логов, где последние слова - это статусы (OK, FAIL, TIMEOUT). Решение позволяет оперативно извлечь статус.

На Reddit люди обсуждают, как избежать лишнего расхода памяти, предлагая, например, такой подход:
“You can just iterate backwards through the string to count the characters till you hit either a whitespace or the start of the string. This prevents the need to waste space by splitting the string up into an array.”
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
📱 AI
👩‍💻 SUGGEST REFACTORING

Что еще нам может предложить AI-ассистент?

Рефакторинг.

Выбираем интресующий нас участок кода и запрашиваем предложение по рефакторингу.

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

Если предложенный вариант соответсвует ожиданиям - изменения можно применить, если нет - отказаться или отредактировать вручную “на месте”.

Может быть полезно для выявления “незаметных” или неоптимальных мест в коде.
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Новая задача Plus One

ОПИСАНИЕ 📰:
Вам дано большое целое число, представленное в виде целочисленного массива digits, где каждая digits[i] - это i-я цифра целого числа. Цифры упорядочены от наибольшего значения к наименьшему в порядке слева направо. Большое целое число не содержит ведущих 0.

Увеличьте большое целое число на единицу и верните полученный массив цифр.


ПРИМЕРЫ 🔽:

Input: digits = [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.
Incrementing by one gives 123 + 1 = 124.
Thus, the result should be [1,2,4].

Input: digits = [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.
Incrementing by one gives 4321 + 1 = 4322.
Thus, the result should be [4,3,2,2].

Input: digits = [9]
Output: [1,0]
Explanation: The array represents the integer 9.
Incrementing by one gives 9 + 1 = 10.
Thus, the result should be [1,0].
Please open Telegram to view this post
VIEW IN TELEGRAM
qa.log
🖥 Новая задача Plus One ОПИСАНИЕ 📰: Вам дано большое целое число, представленное в виде целочисленного массива digits, где каждая digits[i] - это i-я цифра целого числа. Цифры упорядочены от наибольшего значения к наименьшему в порядке слева направо. Большое…
Зачем такая задача?

🔽 Первая мысль, которая пришла в голову - очень большие числа. Числа, которые не помещаются в специализированные форматы int/long.

Удобное решение для реализации версионирования 1.9 → 2.0 или счетчиков в системах аналитики - клики, охваты, просмотры и тп.
Please open Telegram to view this post
VIEW IN TELEGRAM
📁СОБЕСЕДОВАНИЕ:

Начнем разговор об исключениях

⚫️Раздел: Обработка исключений и ассерты
⚫️Вопрос: Что такое исключения и их виды (классы). Непроверяемые исключения.
Please open Telegram to view this post
VIEW IN TELEGRAM
qa.log
📁СОБЕСЕДОВАНИЕ: Начнем разговор об исключениях ⚫️Раздел: Обработка исключений и ассерты ⚫️Вопрос: Что такое исключения и их виды (классы). Непроверяемые исключения.
Исключения - это механизм, с помощью которого Kotlin (и Java) сигнализирует об ошибочной или нестандартной ситуации во время выполнения (runtime) программы.

🔽 Класс Error описывает внутренние ошибки в исполняющей среде Java, а исключения наследуются от класса Exception.

🔽 RuntimeException является базовым классом для так называемой группы непроверяемых исключений (unchecked exceptions) - компилятор не проверяет факт обработки таких исключений. Такие исключения являются следствием ошибок разработчика, например, неверное преобразование типов или выход за пределы массива.

↪️Классы исключений:
RuntimeException - Исключения, происходящие во время выполнения программы
NullPointerException - Возникает, когда приложение пытается использовать null в случае, когда требуется объект.

data class User(val name: String)

fun main() {
val user: User? = null

println(user!!.name) // Возникнет исключение, т.к. значение переменной - null, а мы гарантировали, что там не null
}

IndexOutOfBoundsException - Указывает, что программа пытается получить из массива элемент, позиция которого превышает размер массива.

fun main() {
val daysOfWeek = arrayOf("Понедельник", "Среда", "Пятница")

println(daysOfWeek[6]) // Хотим отобразить "Воскресенье", но элементов в массиве всего 3
}

ArithmeticException - Вызывается при возникновении исключительного арифметического условия. Например, целое число "делится на ноль".

fun main() {
val result = 10 / 0 // Ошибка деления на 0
}

NumberFormatException - Указывает, что приложение попыталось преобразовать строку в один из числовых типов, но строка не имеет соответствующего формата.

fun main() {
val inputData = readln() // вводим "10b" вместо ожидаемоего "10"
val inputNumber = inputData.toInt()
}

NoSuchElementException - Указывает, что запрашиваемый элемент не существует или коллекция пуста.

fun main() {
val petNames = listOf("Bobby", "Luna", "Max")
val searchName = "Charlie"

val result = petNames.first { it == searchName }
println("Найденный питомец: $result")
} // Не найдено совпадений в списке
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Новая задача Climbing Stairs

ОПИСАНИЕ 📰:
Вы поднимаетесь по лестнице. Чтобы добраться до вершины, нужно сделать n шагов.

Каждый раз вы можете подняться либо на 1, либо на 2 ступеньки. Сколькими разными способами вы можете подняться на вершину?


ПРИМЕРЫ 🔽:
kotlin 
Input: n = 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps

Input: n = 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step
Please open Telegram to view this post
VIEW IN TELEGRAM
qa.log
🖥 Новая задача Climbing Stairs ОПИСАНИЕ 📰: Вы поднимаетесь по лестнице. Чтобы добраться до вершины, нужно сделать n шагов. Каждый раз вы можете подняться либо на 1, либо на 2 ступеньки. Сколькими разными способами вы можете подняться на вершину? ПРИМЕРЫ…
Зачем такая задача?

🔽Классическая задачка на числа Фибоначчи, иллюстирующая идею: одно решение может строиться из комбинаций двух предыдущих.
Т.е. чтобы попасть на n-ю ступеньку, необходимо перейти либо:
- с (n-1)-й ступени (шаг на 1),
- либо с (n-2)-й ступени (шаг на 2).

Пример: клиент может списать бонусы по 1 или по 2 единицы за раз. Задача моделирует, сколькими комбинациями он сможет обнулить баланс.
Please open Telegram to view this post
VIEW IN TELEGRAM
qa.log
Зачем такая задача? 🔽Классическая задачка на числа Фибоначчи, иллюстирующая идею: одно решение может строиться из комбинаций двух предыдущих. Т.е. чтобы попасть на n-ю ступеньку, необходимо перейти либо: - с (n-1)-й ступени (шаг на 1), - либо с (n-2)-й ступени…
🔻 Кстати, о числах Фибоначчи
Механика их использования крайне популярна в scrum-методологих именно ввиду своей логики: если дана крупная задача, то выдвигается гипотеза о количестве способов её подразделения для уменьшения сложности в реализации.
Видим значение 13 и строим предположение о вариантах разделения этого числа на меньшие обозначения: 8 + 5.
Или 2 + 3 + 3 + 5.
И так далее.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
📱 AI
👩‍💻 SUGGEST REFACTORINGS

Интересная функциональность AI-ассистента для самопроверки и случаев, когда кажется, что место ошибки найдено, а сама ошибка - нет.

Логика работы с предложенным рефакторингам единообразна:
🟢Если результат соответствует ожиданиям - принимаем
🚫Если нет - редактируем или отменяем результат
Please open Telegram to view this post
VIEW IN TELEGRAM
На днях прошла конференция HEISENBUG

Давайте посмотрим на секции и тренды 2025 в тестировании
Итак, ключевые темы 2025 года

🟠AI, LLM и автоматизация QA:

- «Собеседование QA под нейросетью: когда ИИ говорит „Да“» (Сбер)

- «AI-генерация тестовых данных. От DataFaker к AI-агентам» (Сбер)

- «Взлом AI-агентов: прикладная инструкция к уязвимостям LLM и тулов» (AMA и Т-Банк)

- «Автогенерация тестов в IDE: как RAG + LLM превращают ручные сценарии в код» (Сбер)

- «Переход от автоматизации к роботизации: эволюция QA» (Т-Банк и Explyt)

➡️ Заметен восходящий тренд на активное внедрение LLM и AI-агентов во все этапы тестирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
🟠Практическая автоматизация и инструменты

- «Test Impact Analysis» (Ozon Банк)

- «Тест-кейсы как код» (Ozon Банк)

- «Appium-тесты на ARM» (Okko, Exness)

- «Postman → Hoppscotch» (Koronatech, Tempo)

- «Broken access control через уязвимости бизнес-логики» (ATI SU, Т-Банк)

- «Debug Once, Test Forever» (Explyt, Контур)

- «Как замокать весь МИР» (Ozon Банк)

➡️ Переход от ручных QA-практик к инфраструктурной автоматизации, включая моки, анализ влияния тестов и кодогенерацию.
Please open Telegram to view this post
VIEW IN TELEGRAM
🟠Мобильное и веб-тестирование

- «Автотесты мобильных приложений 360» (Ozon)

- «Почему ваш сайт ломается, когда его трогают пальцем» (Selectel, Ozon Банк)

- «От „кажется, медленно“ до точных метрик: объективная оценка производительности фронтенда» (2GIS, Т-Банк)

- «Браузерные инструменты: пишем своё расширение» (2ГИС, SM Lab)

- «Прогрессивные веб-приложения и их автотесты» (Ozon Банк, Dodo Engineering)

➡️ На первый план выходит user-experience и перфоманс-тестирование в мобильных и веб-средах.
Please open Telegram to view this post
VIEW IN TELEGRAM
🟠DevOps и нагрузка

- «Нагрузочное тестирование enterprise NGFW с Cisco TRex» (InfoWatch, Т-Банк)

- «Env-тесты: как упростить жизнь разработчикам и тестировщикам» (РСХБ.цифра, Контур)

- «Как успеть протестировать устройство, пока оно едет по конвейеру» (Яндекс, Гранч)

- «Миграция тестов в Linux» (Сбер, Монитор Электрик)

➡️ В этой секции разбирается тестирование в производственных условиях, нагрузка на уровне железа и инфраструктуры.
Please open Telegram to view this post
VIEW IN TELEGRAM
🟠Тестирование в нестандартных областях:

- «Тестирование с заботой» (Effective, Tempo)

- «Как разрабатываются и тестируются новые лекарства» (BIOCAD)

- «Матерюсь — значит, существую» (Афонина, JUG Ru Group)

➡️ Наблюдается тренд на гуманитарные исследования.
Please open Telegram to view this post
VIEW IN TELEGRAM
Немного обобщенных наблюдений:

Много докладов от Ozon Банка, Сбера и Т-Банка ➡️ три крупных представителя QA-экспертизы в РФ.

Explyt, Tempo, Контур участвуют в почти каждом втором слоте ➡️ менее крупные игроки начинают активно заявлять о себе.

Любопытно, что Яндекс практически не представлен. Возможно, из-за самописности.

Присутствуют AI-технологии во всех треках: от тест-кейсов до пост-анализа ➡️ набирает ход многосторонний поиск применения искусственного интеллекта. Однако повторяемость участников в этих дисциплинах намекает на высокие потребности в мощностях.
Please open Telegram to view this post
VIEW IN TELEGRAM