QA Co-pilot
91 subscribers
265 photos
1 video
44 links
QA Co-pilot 🚀

Ваш другий пілот у світі тестування.

👨‍💻 Для кого: Для тестувальників-практиків, які хочуть рости.
🎯 Про що: Делегуємо рутину нейромережам, прискорюємо роботу та звільняємо час на головне.
Чого тут немає: Нудної теорії та води.
Download Telegram
👀 У AI з'явилися "очі": Як тестувати UI, просто скинувши скріншот

Привіт, екіпаж!

Ми звикли писати промпти текстом. Але QA — це часто робота очима. "Тут кнопка з'їхала", "тут контраст поганий", "тут текст не читається".

Раніше, щоб автоматизувати це, потрібні були дорогі інструменти візуальної регресії. Сьогодні ваш Co-pilot (ChatGPT-4o, Gemini, Claude) може зробити візуальний аудит за секунди.

Практичний кейс: Розробник віддав нову версію мобільного екрану. Виглядає наче ок, але "щось не те".

Що робимо:
1️⃣Робимо скріншот екрану (або макета у Figma).

2️⃣Завантажуємо його в чат з AI.


Готовий промпт "UI-інспектор":|
(Прикріпіть скріншот)

Виступи в ролі суворого UI/UX Дизайнера та QA. Проведи візуальний аудит цього екрану мобільного додатку.

**Зверни увагу на:**
1. **Вирівнювання (Alignment):** Чи є елементи, які "пляшуть" і не вирівняні по сітці?
2. **Типографіку:** Чи читабельний текст? Чи достатній контраст (згідно WCAG)?
3. **Відступи (Padding/Margin):** Чи не виглядають елементи занадто скупченими або розкиданими?
4. **Consistency:** Чи не виглядає якась кнопка "чужою" за стилем?

Дай список із 3-5 конкретних візуальних багів або покращень.


Що знаходить AI: Він дивовижно точний!
🔹"Кнопка 'Скасувати' має менший відступ знизу, ніж кнопка 'Зберегти'."

🔹"Сірий текст на білому фоні має занизький контраст, це проблема доступності."

🔹"Іконка 'Налаштування' не вирівняна по центру з текстом заголовка."


Висновок: Це "свіжа пара очей", яка ніколи не втомлюється. Використовуйте це перед тим, як показувати UI дизайнеру або менеджеру.

А ви вже пробували показувати AI картинки? Як результати? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🛠 Кнопка "Зробити магію": Створюємо власні інструменти тестування за 1 хвилину

Привіт, екіпаж!

Ми звикли качати розширення для Chrome: одне для перевірки посилань, інше для очищення кешу, третє для заповнення форм. А що, як я скажу вам, що ви можете створити власний інструмент під конкретну задачу за хвилину, не будучи програмістом?

Це називається Bookmarklet (Букмарклет) — шматок JavaScript-коду, збережений як звичайна закладка в браузері.

Давайте створимо "рентген", який миттєво покаже всі картинки без опису (alt), що є грубою помилкою доступності та SEO.

Практичний кейс:
1️⃣Відкриваємо AI.

2️⃣Пишемо промпт.


Промпт "Tool Maker":
Виступи в ролі JavaScript-розробника.

Напиши мені код для **Bookmarklet** (скрипт, що починається з `javascript:`), який робить наступне на будь-якій відкритій сторінці:
1. Знаходить усі зображення (`img`), у яких немає атрибута `alt` або він порожній.
2. Обводить ці зображення товстою червоною рамкою (5px solid red).
3. Виводить повідомлення (alert) з кількістю знайдених помилок.

Код має бути в один рядок (minified), готовий для вставки в закладку.


Результат від AI (копіюйте це):
javascript:(function(){var imgs=document.querySelectorAll('img:not([alt]),img[alt=""]');imgs.forEach(img=>img.style.border='5px solid red');alert('Знайдено зображень без Alt: '+imgs.length);})();


Як це встановити:
1️⃣У Chrome натисніть правою кнопкою на панель закладок -> "Додати сторінку".

2️⃣Ім'я: 🔴 Find No-Alt

3️⃣URL: вставте код, який дав AI.

4️⃣Зберегти.


Як це працює: Зайдіть на будь-який сайт. Натисніть на цю закладку. Бум! Усі проблемні картинки обведені червоним.

Що ще можна створити?
🔹"Заповнити всі поля форми тестовими даними".

🔹"Підсвітити всі посилання, які ведуть на http замість https".

🔹"Показати приховані паролі".


Ви більше не залежите від чужих плагінів. Ви створюєте свої.

А яку "чарівну кнопку" ви б хотіли мати в браузері? Пишіть ідеї в коментарях, згенеруємо код разом! 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🥒 BDD без болю: Пишемо ідеальні Gherkin-сценарії за 1 хвилину

Привіт, екіпаж!

Ви працюєте з Cucumber або SpecFlow? Тоді ви знаєте, як важко буває правильно сформулювати сценарії Given/When/Then. Часта помилка — писати про кліки, а не про поведінку.

Погано: When I click button "#submit-btn"

Добре: When I submit the registration form

Але навіщо мучитися з формулюваннями, якщо AI розуміє Gherkin краще за нас?

Практичний кейс: У нас є фіча "Відновлення пароля". Нам потрібно покрити її BDD-сценаріями.

Готовий промпт "BDD-Майстер":
Виступи в ролі досвідченого QA Automation Engineer, який спеціалізується на BDD.

**Фіча:** Відновлення пароля (Forgot Password).
**Логіка:** Користувач вводить імейл. Якщо імейл існує, йому відправляється посилання. Якщо ні — показується загальне повідомлення (security measure).

**Завдання:**
Напиши 3 сценарії на мові Gherkin (Given/When/Then).
1. Успішне відновлення.
2. Імейл не зареєстрований.
3. Невалідний формат імейлу.

**Важливо:** Пиши в "декларативному" стилі (описуй дії бізнесу, а не кліки по UI).


Приклад результату, який видасть AI:
Feature: Password Recovery

Scenario: User successfully requests a password reset link
Given the user is on the Forgot Password page
When they submit a registered email address "user@example.com"
Then they should see a confirmation message "Check your email"
And they should receive a password reset email

Scenario: User tries to reset password for non-existent account
Given the user is on the Forgot Password page
When they submit an unregistered email address "ghost@example.com"
Then they should see a generic confirmation message "If this email exists, we sent a link"
# (Security best practice: don't reveal if user exists)

Scenario: User enters invalid email format
Given the user is on the Forgot Password page
When they submit an invalid email "user.example.com"
Then they should see a validation error "Please enter a valid email address"


Висновок: Ви отримуєте чисті, зрозумілі сценарії, які можна одразу вставляти у .feature файл. Це економить час на "вигадування слів" і гарантує, що ваші тести будуть зрозумілі навіть не-технічним колегам.

А ви використовуєте BDD/Gherkin на своєму проєкті? 👇
1
🧠 Тестування без "сліпих зон": Як AI застосовує професійні евристики (SFDIPOT)

Привіт, екіпаж!

Буває так: ви протестували фічу, все наче працює, віддали в реліз... а там виліз баг. Не тому, що ви погано шукали, а тому, що ви просто не подумали подивитися в той бік.

Досвідчені тестувальники використовують тестові евристики (моделі), щоб нічого не пропустити. Одна з найпотужніших — SFDIPOT (Structure, Function, Data, Interfaces, Platform, Operations, Time).

Звучить як складна абревіатура з підручника? Так і є. Але вам не треба її зубрити. Ваш Co-pilot знає її ідеально!

Практичний кейс: Ви тестуєте функціонал "Завантаження файлів".

Готовий промпт "Генератор ідей за SFDIPOT":
Виступи в ролі Test Architect. Я тестую функціонал "Завантаження файлів" у веб-додатку.

**Завдання:**
Згенеруй ідеї для тестування, використовуючи евристику **SFDIPOT**. Розпиши по 2-3 неочевидні перевірки для кожної категорії:

1. **Structure** (Що це? З чого складається код?)
2. **Function** (Що воно робить?)
3. **Data** (Які дані приймає/виводить?)
4. **Interfaces** (З чим з'єднується?)
5. **Platform** (Де запускається?)
6. **Operations** (Як використовується?)
7. **Time** (Часові обмеження, конкурентність)


Приклад інсайтів від AI:
🔹Data: А що, як файл порожній (0 байт)? А якщо в назві файлу є емодзі або китайські ієрогліфи?

🔹Platform: Чи працює завантаження, якщо у браузера немає прав на доступ до файлової системи (наприклад, на мобільному)?

🔹Time (Timeouts): Що буде, якщо почати завантаження і розірвати з'єднання на 99%? Чи видалить сервер "сміття"?

🔹Operations: Що буде, якщо 100 користувачів одночасно завантажать файл в одну й ту ж секунду?


Висновок: Цей метод перетворює ваше мислення з "лінійного" (перевірив — працює) на "об'ємне" (перевірив з усіх боків). AI допомагає вам побачити ті аспекти продукту, про які ви навіть не здогадувалися.

А ви користуєтесь мнемоніками в роботі? Чи покладаєтесь на чек-листи? 👇
🎯 "Я змінив тільки один рядок": Як AI допомагає робити Impact Analysis і не поламати прод

Привіт, екіпаж!

Класика: розробник каже "фікс дрібний, не бійся", ви робите швидкий смоук, а на проді відвалюється половина функціоналу. Чому? Бо "дрібний фікс" зачепив спільну бібліотеку.

Робити повну регресію на кожен чмих — немає часу. Не робити — страшно. Рішення: Impact Analysis (Аналіз впливу).

Замість того, щоб гадати, що зачепило зміни, запитайте у Co-pilot'а. Він чудово будує логічні зв'язки.

Практичний кейс: Розробник змінив логіку валідації номера телефону в модулі реєстрації.

Готовий промпт "Детектор зв'язків":
Виступи в ролі Software Architect.

**Зміна:** Розробники оновили бібліотеку валідації телефонних номерів у модулі "Реєстрація".

**Архітектура системи:**
1. Реєстрація/Логін.
2. Особистий кабінет (редагування профілю).
3. Оформлення замовлення (ввід контактів).
4. Відновлення пароля через SMS.
5. Адмін-панель (пошук користувачів).

**Завдання:**
Проведи Impact Analysis. Назви 4 неочевидні місця в системі (крім самої реєстрації), які могли зламатися через цю зміну і які я обов'язково маю перевірити. Поясни ризик для кожного пункту.


Що підсвітить AI:
Зона ризику 1️⃣: Оформлення замовлення.
🔹Ризик: Якщо там використовується та сама функція валідації, клієнти не зможуть купити товар.

Зона ризику 2️⃣: Відновлення пароля.
🔹Ризик: Якщо формат номера в базі змінився або валідація стала суворішою, старі користувачі не зможуть отримати SMS.

Зона ризику 3️⃣: Імпорт існуючих користувачів (Міграція).
🔹Ризик: Чи відповідають старі номери в базі новим правилам валідації?

Зона ризику 4️⃣: API інтеграції (напр., CRM).
🔹Ризик: Якщо ми передаємо телефон у зовнішню систему, чи не змінився формат даних?


Висновок: За 30 секунд ви перетворюєте "сліпе" тестування на точковий снайперський вогонь. Ви тестуєте менше, але знаходите більше багів саме там, де вони ховаються.

А ви вірите розробникам на слово, коли вони кажуть "там нічого не зачепило"? 😉 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
💾 SQL-магія: Як перевіряти Базу Даних рівня Senior, знаючи лише "SELECT"

Привіт, екіпаж!

Інтерфейс може брехати. API може кешувати старі дані. І тільки База Даних (БД) завжди каже правду. Але щоб дізнатися цю правду, часто треба зв'язати три таблиці, відфільтрувати за датою і згрупувати за статусом. 🤯

Якщо написання JOIN викликає у вас головний біль — делегуйте це AI. Ви описуєте задачу словами — він пише ідеальний SQL.

Практичний кейс: Нам треба знайти користувачів, які зареєструвалися минулого тижня, зробили замовлення, але платіж так і не пройшов (status = 'failed').

Це задача на три таблиці: Users, Orders, Payments.

Готовий промпт "SQL-Гуру":
Виступи в ролі Database Administrator (PostgreSQL).

У мене є така структура бази даних (схема):
1. **Users** (`id`, `email`, `created_at`)
2. **Orders** (`id`, `user_id`, `amount`, `order_date`)
3. **Payments** (`id`, `order_id`, `status` ['success', 'failed'])

**Завдання:**
Напиши мені SQL-запит, який знайде email-адреси користувачів, які:
1. Зареєструвалися за останні 7 днів.
2. Мають хоча б одне замовлення.
3. Але у цього замовлення статус платежу 'failed'.

Поясни, який тип JOIN ти використав і чому.


Результат від AI:
SELECT u.email, o.id as order_id, p.status
FROM Users u
JOIN Orders o ON u.id = o.user_id
JOIN Payments p ON o.id = p.order_id
WHERE u.created_at >= NOW() - INTERVAL '7 days'
AND p.status = 'failed';


Що ви отримали:
1️⃣Готовий робочий запит.

2️⃣Розуміння логіки (AI пояснить, що JOIN з'єднує таблиці за спільними ID).


Висновок: Вам не треба бути експертом з SQL, щоб робити глибокі перевірки даних. Використовуйте AI як "перекладача" з людської мови на мову баз даних. Це супер-сила на будь-якій співбесіді і в роботі.

А ви пишете складні запити самі чи просите розробників? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
👏1
🔮 QA 2026: Кінець епохи "Клікателів"? Мій прогноз на майбутній рік

Привіт, екіпаж!

На календарі грудень 2025-го. Ми стоїмо на порозі нового року, і я відчуваю, що 2026 стане переломним. Якщо у 2024-25 ми просто "гралися" з AI-помічниками, то наступного року правила гри зміняться кардинально.

Ось мій прогноз на QA-тренди 2026 року:

1️⃣Від Copilot до Autopilot (Agentic Testing) 🤖 Ми перестанемо писати кожен крок у коді автотестів.

🔹Зараз: Ми пишемо: driver.findElement(By.id("login")).click().

🔹У 2026: Ми даватимемо задачу AI-агенту: "Протестуй флоу покупки для нового юзера" — і агент сам визначить локатори, сам згенерує дані і сам пройде сценарій. 👉 Скіл: Вміння налаштовувати та контролювати AI-агентів.

2️⃣"Prompt Engineering" стає частиною QA 🗣 Кожен другий додаток тепер має вбудований LLM (чат-боти, генератори). Тестувати їх класичними методами ("очікуваний результат = фактичний") неможливо, бо вони кожен раз відповідають по-різному. 👉 Скіл: LLM Red Teaming (вміння змусити модель галюцинувати або видати токсичний контент) стане окремою професією.

3️⃣Смерть "Документації заради Документації" 📄 Писати довгі тест-плани вручну стане моветоном. Відео-запис екрану + голосовий коментар тестувальника будуть миттєво перетворюватися AI на баг-репорт, документацію та тест-кейс одночасно. 👉 Тренд: Більше часу на дослідження, менше — на оформлення папірців.

4️⃣Observability замість Regression 📊 Швидкість релізів така, що проганяти повну регресію перед кожним деплоєм — це розкіш. Фокус зміщується на Testing in Production. Головне питання не "чи є баги?", а "як швидко ми їх знайдемо на проді і відкотимося?". 👉 Скіл: Робота з Datadog, Grafana, Sentry, аналіз логів.

5️⃣QA перетворюється на QE (Quality Engineering) ⚙️ Кордон між SDET і Manual стирається остаточно. "Мануальщик", який не вміє запустити скрипт чи проаналізувати JSON, залишиться без роботи. Всі стають інженерами, озброєними AI-інструментами.


Висновок: QA не помирає, він еволюціонує. Ми переходимо від ролі "тих, хто шукає помилки" до ролі "архітекторів якості", які керують армією ботів.

А які ваші ставки на 2026? Що помре, а що злетить? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Як "покласти" власний сервер: Навантажувальне тестування для тих, хто боїться JMeter

Привіт, екіпаж!

Ми всі вміємо перевіряти, чи працює логін для одного користувача. А що станеться, якщо 1000 користувачів натиснуть "Увійти" одночасно в "Чорну п'ятницю"? 🤔

Зазвичай мануальні QA кажуть: "Ну, це робота перформанс-інженерів". Але бути тим, хто може сказати: "Хлопці, наш API вмирає при 50 запитах на секунду, я перевірив" — це зовсім інший рівень авторитету.

Вам не треба вчити монструозний JMeter. Використовуйте K6. Це сучасний інструмент, де тести — це просто JS-код. А код за вас напише AI.

Практичний кейс: Треба перевірити API-ендпоінт POST /api/login. Ми хочемо зімітувати 50 користувачів, які логіняться одночасно протягом 30 секунд.

Готовий промпт "DDOS-атака на мінімалках":
Виступи в ролі Performance QA Engineer.

Мені потрібен скрипт для навантажувального тестування інструментом **K6 (k6.io)**.

**Сценарій:**
1. Ендпоінт: `POST https://my-test-api.com/login`
2. Тіло запиту (JSON): `{ "email": "test@test.com", "password": "123" }`
3. Перевірка (Check): Статус відповіді має бути 200.

**Навантаження (Load Config):**
- Кількість віртуальних користувачів (VUs): 50
- Тривалість тесту: 30 секунд.

Напиши готовий JS-скрипт і поясни, як його запустити.


Результат від AI (готовий файл script.js):
import http from 'k6/http';
import { check, sleep } from 'k6';

export let options = {
vus: 50, // 50 юзерів
duration: '30s', // протягом 30 секунд
};

export default function () {
let url = 'https://my-test-api.com/login';
let payload = JSON.stringify({
email: 'test@test.com',
password: '123',
});

let params = {
headers: { 'Content-Type': 'application/json' },
};

let res = http.post(url, payload, params);

// Перевіряємо, чи сервер вижив (200 OK)
check(res, {
'is status 200': (r) => r.status === 200,
});

sleep(1);
}


Як це використати?
1️⃣Встановіть K6 (одна команда в терміналі).

2️⃣Запустіть: k6 run script.js.

3️⃣Дивіться в консоль: якщо ви побачите купу червоних хрестиків і час відповіді 5000ms — вітаю, ви знайшли "вузьке місце" (bottleneck)!


Висновок: Ви не просто "клікаєте". Ви перевіряєте надійність системи. Це навичка, за яку платять найбільші гроші в QA.

А ви коли-небудь проводили навантажувальне тестування? Чи вірите, що "сервер витримає"? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔎 Ти — бог Jira: Як знаходити будь-які тікети без мук з фільтрами

Привіт, екіпаж!

Jira — це монстр. Знайти там потрібний тікет іноді важче, ніж знайти сам баг у коді. Звичайні фільтри ("My Open Issues") дуже обмежені. А щоб робити круті вибірки, треба знати JQL (Jira Query Language).

Хто з вас пам'ятає, як написати: "Покажи всі баги, де статус змінювався на 'Reopened' за останній тиждень"? Я теж не пам'ятаю. І не треба.

Делегуйте написання запитів AI, щоб створювати потужні дешборди та звіти.

Практичний кейс: Ви хочете знайти "загублені" баги: тікети з високим пріоритетом, які були створені понад 2 тижні тому, але досі не призначені на жодного розробника (Unassigned).

Готовий промпт "Jira-хакер":
Виступи в ролі Jira Administrator.
Напиши мені **JQL-запит** (Jira Query Language) для фільтрації задач.

**Критерії пошуку:**
1. Тип задачі: Bug.
2. Пріоритет: High або Critical.
3. Статус: НЕ "Done" і НЕ "Closed" (тобто відкриті).
4. Виконавець (Assignee): Unassigned (порожньо).
5. Дата створення: Більше ніж 14 днів тому.

Напиши тільки сам код запиту.


Результат від AI:
issuetype = Bug AND priority in (High, Critical) AND status not in (Done, Closed) AND assignee is EMPTY AND created < -14d


Як це використати?
1️⃣В Jira натисніть Filters -> Advanced Issue Search.

2️⃣Переключіться на режим JQL (справа кнопочка "Switch to JQL").

3️⃣Вставте цей рядок.

4️⃣Готово! Ви бачите список "проблемних" задач, про які всі забули.


Висновок: З AI ви можете створювати будь-які вибірки: "баги, які поверталися з QA більше 3 разів", "задачі без опису", "тікети, оновлені мною вчора". Це робить вас людиною, яка контролює хаос у беклозі.

А ви користуєтесь Advanced Search в Jira? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝1
🎭 Бекенд ще не готовий? Не біда! Піднімаємо Mock-сервер за хвилину

Привіт, екіпаж!

Класична ситуація: — "Ти протестував нову форму реєстрації?" — "Ні, чекаю на бекенд, API ще не працює". 😴

Стоп. Це позиція жертви обставин. Професійний QA може протестувати фронтенд, навіть якщо бекенду взагалі не існує. Для цього ми використовуємо Моки (Mocks).

Раніше треба було ставити складні тули типу WireMock. Сьогодні ваш Co-pilot напише вам "фейковий сервер" на Python за 30 секунд.

Практичний кейс: Вам треба, щоб за адресою http://localhost:5000/api/user повертався JSON з даними юзера.

Готовий промпт "Fake Backend":
Виступи в ролі Python-розробника.

Мені потрібен простий **Mock-сервер** на бібліотеці **Flask**.
Він має слухати порт 5000 і мати один ендпоінт:
`GET /api/user`

**Логіка:**
1. Якщо я передаю в хедері `Authorization: valid_token` — повертай 200 OK і JSON:
`{"id": 1, "name": "QA Ninja", "role": "admin"}`
2. Якщо токена немає або він інший — повертай 401 Unauthorized.

Напиши повний код скрипта, який я можу запустити одною командою.


Результат від AI (код server.py):
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/api/user', methods=['GET'])
def get_user():
token = request.headers.get('Authorization')
if token == 'valid_token':
return jsonify({"id": 1, "name": "QA Ninja", "role": "admin"}), 200
else:
return jsonify({"error": "Unauthorized"}), 401

if __name__ == '__main__':
app.run(port=5000)


Як це використати?
1️⃣Встановіть Flask (pip install flask).

2️⃣Запустіть файл (python server.py).

3️⃣Вкажіть своєму фронтенду (або в Postman) стукати на localhost:5000.


Висновок: Ви можете симулювати будь-які помилки (500, 503), затримки мережі та дивні дані, не чекаючи, поки бекенд-розробник звільниться. Ви самі керуєте реальністю.

А ви використовуєте моки чи чекаєте на справжнє API? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
📱 Android-магія: Керуємо телефоном з комп'ютера (ADB без болю)

Привіт, екіпаж!

Якщо ви тестуєте мобільні додатки, ви знаєте цей біль: треба ввести довгий тестовий імейл test_user_very_long_email@domain.com на віртуальній клавіатурі телефону. Ви помиляєтесь, стираєте, знову вводите... 😤

Або треба зняти відео багу і скинути його на комп'ютер.

Профі використовують ADB (Android Debug Bridge). Це спосіб "наказувати" телефону через USB-кабель. Команди там специфічні, але вам не треба їх вчити. Ваш Co-pilot знає їх усі.

Практичний кейс №1: Введення тексту з клавіатури ПК Ви на екрані логіну. Треба ввести довгий текст.

Промпт:
Напиши мені команду ADB, щоб ввести текст "my_complex_password_123!" у активне поле на підключеному Android-пристрої.


Результат: adb shell input text "my_complex_password_123!" (Вставляєте в термінал, тиснете Enter — і текст миттєво з'являється на телефоні!)

Практичний кейс №2: Запис відео екрану Треба записати баг. Кнопками телефону це незручно.

Промпт:
Мені треба записати відео з екрану телефону через ADB.
1. Запис має тривати, поки я його не зупиню (або фіксований час).
2. Зберегти файл як `bug.mp4` на телефоні.
3. Потім одразу перетягнути (pull) цей файл на мій комп'ютер у поточну папку.
Напиши послідовність команд.


Результат від AI:
adb shell screenrecord /sdcard/bug.mp4
# (Тиснете Ctrl+C, щоб зупинити запис)
adb pull /sdcard/bug.mp4 .


Що ще можна?
🔹adb install app.apk (встановити білд за секунду).

🔹adb shell monkey ... (запустити "скажену мавпу", яка буде хаотично тицяти по екрану, шукаючи краші).

🔹adb logcat (витягнути логи помилки).


Висновок: ADB перетворює вас із "користувача телефону" на його "адміністратора". Ви робите рутинні речі в 10 разів швидше.

А ви використовуєте ADB чи все робите "пальчиками"? 👇
👍1
Машина часу для QA: Як протестувати "Новий Рік" посеред літа

Привіт, екіпаж!

Уявіть задачу: розробник зробив акцію "Чорна п'ятниця", яка активується автоматично 29 листопада. Надворі — грудень (або липень). Як перевірити, що банер зникне, коли акція закінчиться?

Поганий спосіб: Просити адмінів перевести годинник на сервері (це покладе базу даних і токени).

Довгий спосіб: Чекати реальної дати.

Спосіб "QA Co-pilot": Підмінити час тільки у вашому браузері за допомогою простого скрипта.

Браузер бере час з вашої системи. Але ми можемо "обдурити" сайт, перевизначивши об'єкт Date. Писати цей код вручну складно, але AI робить це за секунду.

Практичний кейс: Я хочу, щоб сайт думав, що зараз 1 січня 2026 року, 00:00:01.

Готовий промпт "Time Traveler":
Виступи в ролі JavaScript Expert.

Напиши мені сніпет коду (script), який я можу вставити в консоль браузера (DevTools).
**Завдання:**
Перевизначити глобальний об'єкт `Date` так, щоб для сайту поточний час завжди був: **2026-01-01 00:00:01**.
При цьому скрипт має зберігати працездатність методів `Date` (щоб сайт не впав).


Результат від AI (копіюємо і вставляємо в Console):
(function() {
var originalDate = Date;
var mockDate = new originalDate('2026-01-01T00:00:01');

Date = function(dt) {
if (dt) return new originalDate(dt);
return new originalDate(mockDate);
};
Date.now = function() { return mockDate.getTime(); };
Date.prototype = originalDate.prototype;
Date.parse = originalDate.parse;
Date.UTC = originalDate.UTC;

console.log(" Час успішно підмінено на: " + mockDate);
})();


Як це працює:
1️⃣Відкриваєте сайт.

2️⃣Тиснете F12 -> Console.

3️⃣Вставляєте код -> Enter.

4️⃣Оновлюєте контент на сторінці (без перезавантаження всієї сторінки, якщо це SPA) або натискаєте на кнопки. Сайт "думає", що вже майбутнє.


Висновок: Ви можете перевіряти прострочені сесії, майбутні акції та таймери зворотного відліку, не чіпаючи налаштування Windows/macOS. Ви керуєте часом!

А вам доводилося тестувати логіку, залежну від часу? Як викручувались? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🔗 "Copy XPath" — це зло. Генеруємо "безсмертні" локатори з AI

Привіт, екіпаж!

Ви вирішили написати свій перший автотест (або просто шукаєте елемент у консолі). Ви тиснете Copy selector у Chrome і отримуєте: #app > div:nth-child(2) > main > div.container > form > button

Це працює... до першого оновлення сайту. Як тільки розробник загорне кнопку в ще один div — ваш локатор зламається, а тест впаде.

Професіонали пишуть локатори, прив'язані до суті елемента, а не до його місця. Але вигадувати складні XPath/CSS буває ліньки.

Нехай це робить ваш Co-pilot.

Практичний кейс: У нас є кнопка "Купити", яка захована глибоко в DOM-дереві.

Готовий промпт "Selector Architect":
Виступи в ролі Automation QA Engineer.

Ось HTML-код кнопки:
`<button class="btn btn-primary btn-lg" id="x-123-random" onclick="...">Buy Now</button>`

**Завдання:**
Напиши мені 3 варіанти **надійних (robust)** локаторів для цього елемента (CSS або XPath), які НЕ зламаються, якщо зміниться верстка навколо або динамічний ID.

Поясни, чому твої варіанти кращі за автозгенеровані.


Що видасть AI:

Варіант 1️⃣ (За текстом - XPath):
//button[contains(text(), 'Buy Now')] Чому краще: Працює, де б кнопка не знаходилась, доки на ній написано "Buy Now".

Варіант 2️⃣ (За атрибутами - CSS): button[class*='btn-primary'] Чому краще: Ігнорує динамічний ID (x-123-random), фокусується на стилі.

Варіант 3️⃣ (Комбінований - XPath):
//button[normalize-space()='Buy Now' and not(@disabled)] Чому краще: Знаходить тільки активну кнопку.


Висновок: Замість того, щоб копіювати "сміття" з браузера, ви отримуєте елегантний код. Ваші тести стають стабільними, а ви витрачаєте менше часу на їх підтримку (maintenance).

А ви пишете локатори самі чи довіряєте Chrome DevTools? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
🆘 "Що це за пекло в логах?": Читаємо Stack Trace як відкриту книгу

Привіт, екіпаж!

Ситуація: ви натискаєте кнопку, отримуєте 500 Internal Server Error. Ви йдете в логи (Kibana, Graylog або просто консоль), а там... матриця. Сотні рядків незрозумілого тексту: NullPointerException, at com.company.service..., Traceback (most recent call last)....

Звичайна реакція: "Ой, це для програмістів". Скріншот -> Jira -> "Сервер впав". Реакція профі: Скопіювати текст -> AI -> Отримати діагноз.

Ваш Co-pilot вміє читати стек-трейси будь-якою мовою (Java, Python, JS, C#) і перекладати їх на людську.

Практичний кейс: Ви отримали помилку при оплаті товару. В логах помилка Java.

Готовий промпт "Log Analyzer":
Виступи в ролі Senior Backend Developer.

Я QA, тестував оплату і отримав 500 помилку. Ось Stack Trace з логів.

**Завдання:**
1. Поясни простою мовою, що саме зламалося (NullPointer? TimeOut? TypeMismatch?).
2. Вкажи, в якому файлі і на якому рядку сталася біда.
3. Припусти, що могло стати причиною (наприклад, я передав порожнє поле, чи це помилка в коді?).

**Лог:**
`java.lang.NullPointerException: Cannot invoke "String.length()" because "cardNumber" is null
at com.shop.PaymentService.validate(PaymentService.java:42)
at com.shop.OrderController.pay(OrderController.java:15)...`


Що відповість AI:
"Помилка NullPointerException. Проблема в файлі PaymentService.java на рядку 42. Суть: Система намагалася перевірити довжину номера картки (cardNumber), але ця змінна виявилася порожньою (null). Причина: Скоріше за все, в запиті не передався номер карти, або він загубився по дорозі від контролера до сервісу."


Висновок: Замість "У вас все зламалося", ви пишете в тікеті: "При оплаті падає NPE, якщо не передати номер карти. Схоже, немає валідації на рівні API". Розробники будуть носити вас на руках за таку конкретику.

А ви заглядаєте в логи чи одразу створюєте тікет? 👇
🔥1
🕸 GraphQL без сліз: Як писати складні запити, не знаючи синтаксису

Ви звикли до REST API: хочеш юзера — йдеш на
/users/1, хочеш його замовлення — йдеш на
/users/1/orders. Все просто.

Але приходить розробник і каже: "Ми переїхали на GraphQL. Тепер у нас тільки один URL, а дані проси через Query". 🤯 Ви відкриваєте Postman, бачите пусте поле Body і не знаєте, що туди писати. { user { id } }? Чи query { getUser }?

GraphQL дозволяє забрати всі потрібні дані одним запитом (і юзера, і його кота, і історію покупок). Але написати цей "багатоповерховий" запит без помилок — важко.

Тут в гру вступає AI.

Практичний кейс: Вам треба отримати ім'я користувача, його імейл та список із останніх 5 замовлень (тільки ID та суму) для юзера з ID 123.

Готовий промпт "GraphQL Builder":
Виступи в ролі Backend Developer.
Мені потрібно написати **GraphQL Query**.

**Моя мета:**
Отримати дані для користувача з `id: "123"`.
Поля, які мені потрібні:
1. З об'єкта User: `firstName`, `email`.
2. З вкладеного об'єкта Orders (мені потрібні тільки останні 5 штук): `id`, `totalAmount`, `status`.

Напиши правильний синтаксис запиту.


Результат від AI:
query {
user(id: "123") {
firstName
email
orders(limit: 5) {
id
totalAmount
status
}
}
}


Що з цим робити?
1️⃣В Postman вибираєте тип GraphQL.

2️⃣Вставляєте цей код у поле Query.

3️⃣Тиснете Send.

4️⃣Отримуєте ідеальний JSON саме з тими даними, які просили. Жодних зайвих полів!


Бонус: Якщо запит не працює, скопіюйте помилку (Field 'orders' doesn't exist on type 'User') в AI, і він скаже: "А, точно, у вашій схемі це поле називається userOrders, спробуй так...".

Висновок: GraphQL — це потужно, бо ви самі вирішуєте, що поверне сервер. З AI ви стаєте архітектором своїх даних за секунди.

А у вас на проєкті REST чи GraphQL? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1
📁 Тобі потрібен PDF на 100 МБ? Не гугли! Генеруємо тестові файли за секунду

Привіт, екіпаж!

П'ятниця — час чистити папку "Завантаження". До речі, скільки у вас там лежить файлів типу test.jpg, sample_big.pdf, broken_file.docx?

Ми постійно тестуємо аплоадери. І часто нам потрібні специфічні файли:
1️⃣Граничні значення: Файл рівно 25 МБ (ліміт), і файл 25 МБ + 1 байт.

2️⃣Биті файли: Щоб перевірити, чи не впаде сервер, якщо завантажити "сміття".


Замість того, щоб шукати ці файли по всьому інтернету, створіть їх самі за допомогою пари рядків коду від AI.

Практичний кейс №1: Файл точного розміру Вам треба перевірити ліміт завантаження (наприклад, макс 10 МБ). Треба створити файл розміром 10.5 МБ.

Промпт:
Виступи в ролі Python Developer.

Напиши скрипт, який створює "пустий" (dummy) файл з розширенням `.txt`.
Вимоги:
1. Розмір файлу має бути рівно **10.5 Megabytes**.
2. Назва файлу: `test_oversize.txt`.


Результат (Python):
with open("test_oversize.txt", "wb") as f:
f.seek(10 * 1024 * 1024 + 512 * 1024 - 1) # 10.5 MB
f.write(b"\0")

(Запускаєте — і у вас миттєво з'являється файл потрібного розміру!)

Практичний кейс №2: "Бите" зображення Треба перевірити, як сервер обробляє invalid files. Якщо просто перейменувати .txt у .jpg, розумний сервер це зрозуміє. Нам треба файл, який має заголовок картинки, але "сміття" всередині.

Промпт:
Напиши скрипт на Python, який створює файл `corrupted_image.jpg`.
1. Початок файлу (Header) має бути як у справжнього JPG (щоб обдурити просту валідацію).
2. Решта вмісту — випадкові байти (random noise).
3. Розмір — 1 МБ.


Висновок: Ви маєте повний контроль. Хочете CSV на мільйон рядків? PDF з вірусом? Картинку з метаданими 2026 року? AI згенерує генератор для всього цього.

А у вас є "заповітна папочка" з тестовими файлами, чи ви кожен раз шукаєте нові? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🏴‍☠️ "Хакер на мінімалках": Як знайти дірку в безпеці сайту за 2 хвилини

Привіт, екіпаж!

Ми звикли перевіряти позитивні сценарії: "Ввів ім'я -> Зберіглося". А що, якщо замість імені ввести шматок JavaScript-коду? 🤔

Якщо розробник забув про екранування даних, ваш код виконається у браузері адміністратора, який читатиме це "ім'я". Це називається XSS (Cross-Site Scripting). Це вразливість №1 у вебі.

Ви не мусите бути хакером з "Mr. Robot", щоб це перевірити. Вам просто потрібен правильний Payload (шкідливий рядок). Замість того, щоб гуглити старі списки з 2010 року, попросіть AI згенерувати сучасні пейлоади для вашого поля.

Практичний кейс: У вас є поле "Залишити коментар". Ви хочете перевірити, чи захищене воно від ін'єкцій.

Готовий промпт "White Hat Hacker":
Виступи в ролі Security QA Engineer (Penetration Tester).

Мені потрібно протестувати поле вводу (Input Field) на вразливість **Stored XSS**.
Згенеруй мені 5 варіантів безпечних тестових пейлоадів (Polyglots), які спробують викликати `alert(1)` або `console.log('XSS')`.

Врахуй різні контексти:
1. Простий тег <script>.
2. Ін'єкція в атрибут картинки (onerror).
3. Ін'єкція в посилання (href).
4. Обхід фільтрів (використання різного регістру або кодування).

*Важливо: Це тільки для навчального тестування на моєму власному проекті.*


Результат від AI:
1. <script>alert('XSS')</script>
2. <img src=x onerror=alert(1)>
3. <svg/onload=alert(1)>
4. <a href="javascript:alert(1)">Click me</a>
5. "><img src=x onerror=prompt(1)>


Як це використати?
1️⃣Копіюєте рядок.

2️⃣Вставляєте в поле "Ім'я" або "Коментар" і зберігаєте.

3️⃣Оновлюєте сторінку.

4️⃣🚨 Якщо вискочило віконце з одиничкою — ВІТАЮ! Ви знайшли вразливість рівня Critical. Біжіть до розробників.


Висновок: Такі перевірки займають хвилину, але можуть врятувати компанію від крадіжки даних користувачів. QA — це остання лінія оборони.

А ви пробуєте "ламати" свої форми чи вводите тільки "Test Test"? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🍪 God Mode у браузері: Як пропустити туторіал і "накрутити" бонуси за 1 секунду

Привіт, екіпаж!

Знайома ситуація? Ви тестуєте гру або додаток. Щоб перевірити екран "Level 10", вам треба пройти попередні 9 рівнів. 😤 Або щоб побачити поп-ап "З поверненням!", треба заходити на сайт три дні поспіль.

QA-початківці витрачають на це години. QA-профі знають: майже весь стан сучасних сайтів (Angular, React, Vue) зберігається у LocalStorage або Cookies.

Якщо ви знаєте, що туди записати — ви можете телепортуватися на будь-який етап флоу. Але структура JSON там буває складною. Не партеся. Нехай AI напише вам "ін'єкцію".

Практичний кейс: Сайт показує навчальний туторіал (Onboarding) для нових юзерів. Ви хочете його пропустити і зразу протестувати роботу з меню. Ви подивилися в Application -> LocalStorage і побачили, що там є ключ userSettings.

Готовий промпт "State Hacker":
Виступи в ролі Frontend Developer.

Я хочу маніпулювати **LocalStorage** в браузері для тестування.
Сайт зберігає налаштування в ключі `app_settings`.

**Завдання:**
Напиши мені JS-код для консолі, який:
1. Отримує поточний об'єкт з `app_settings` (якщо він є).
2. Змінює (або додає) в ньому параметри:
- `tutorialCompleted`: `true` (щоб пропустити навчання)
- `visitCount`: `10` (щоб вважатися досвідченим юзером)
- `theme`: `"dark"`
3. Зберігає оновлений об'єкт назад у LocalStorage.
4. Перезавантажує сторінку (`location.reload()`), щоб зміни вступили в силу.


Результат від AI (готовий сніпет):
let data = JSON.parse(localStorage.getItem('app_settings') || '{}');
data.tutorialCompleted = true;
data.visitCount = 10;
data.theme = "dark";
localStorage.setItem('app_settings', JSON.stringify(data));
location.reload();


Як це використати?
1️⃣F12 -> Console.

2️⃣Вставили код -> Enter.

3️⃣Сторінка оновилась — і ви вже "старий" юзер без набридливих підказок, у темній темі.


Що ще можна так робити?
🔹A/B тести: Примусово ставити собі групу "B" у куках.

🔹E-commerce: Додавати в кошик товари, кнопки "Купити" для яких приховані на UI.

🔹Ігри: Міняти score: 100 на score: 999999.


Висновок: Браузер зберігає всі секрети у вас під носом. Навчіться їх редагувати, і ви зможете тестувати сценарії, до яких неможливо дійти звичайним кліканням.

А ви копаєтесь у LocalStorage чи тестуєте тільки через UI? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🔑 Хакерський набір: Як читати JWT-токени без сторонніх сайтів

Привіт, екіпаж!

Ви робите запит в Postman, а у відповідь — 401 Unauthorized. Чому?
1️⃣Токен прострочився 5 хвилин тому?

2️⃣Вам дали токен з правами Read-Only, а ви намагаєтесь зробити POST?

3️⃣В токені зашитий не той User ID?


Токен (JWT) — це не абракадабра. Це просто Base64-кодований JSON. Його можна прочитати. Більшість йде на сайт jwt.io, вставляє туди токен і дивиться.
СТОП! 🛑 Вставляти робочі токени (особливо з продакшну) на чужі сайти — це грубе порушення безпеки.

Давайте зробимо свій безпечний декодер прямо в консолі браузера за допомогою AI.

Практичний кейс: Вам треба миттєво дізнатися, коли закінчується життя токена (поле exp) і яка там роль.

Готовий промпт "JWT Decoder":
Виступи в ролі Security Engineer.

Напиши мені JavaScript-функцію для консолі браузера, яка парсить **JWT токен**.

**Вимоги:**
1. Функція приймає рядок токена.
2. Вона декодує другу частину токена (Payload).
3. Виводить вміст у зручному вигляді (console.table або JSON).
4. **Важливо:** Якщо в токені є поля `exp` (expiration) або `iat` (issued at), перетвори їх з Unix Timestamp у читабельну дату (Human readable format).

Код має працювати без зовнішніх бібліотек.


Результат від AI (зберігаємо в Snippets):
function parseJWT(token) {
try {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(window.atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));

const data = JSON.parse(jsonPayload);

// Конвертуємо дати
['exp', 'iat', 'nbf'].forEach(field => {
if (data[field]) {
data[field + '_readable'] = new Date(data[field] * 1000).toLocaleString();
}
});

console.table(data);
} catch (e) {
console.error("Невалідний токен!", e);
}
}


Як це використати?
1️⃣Збережіть цей код у сніпети (ми вчили це вчора 😉) або просто вставте в консоль.

2️⃣Напишіть: parseJWT("ващ_довгий_токен_eyJ...").

3️⃣Дивіться в табличку!

🔹role: "admin" (Ок, права є).

🔹exp_readable: "15.12.2025, 10:00:00" (Ага! Він протух годину тому).


Висновок: Ви діагностуєте проблеми авторизації за секунди, не передаючи дані третім сторонам. Це професійний підхід до безпеки.

А ви користуєтесь онлайн-декодерами чи довіряєте тільки собі? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
👯‍♂️ Stage vs Prod: Як знайти реальні відмінності в JSON, ігноруючи "шум"

Привіт, екіпаж!

Часта задача на регресії: переконатися, що нова версія API повертає те саме, що й стара (за винятком нових фіч). Ви берете два JSON-и по 500 рядків, кидаєте в Text Compare... і все червоне. 😱

Чому? Бо змінилися id, createdAt, updatedAt, traceId. Це "динамічний шум". Вам же треба знати, чи не зникло поле price і чи не змінився тип даних у status.

Очищати файли вручну? Ні. Попросіть AI зробити Smart Diff.

Практичний кейс: Порівнюємо відповідь сервера v1 (Prod) і v2 (Stage).

Готовий промпт "JSON Detective":
Виступи в ролі QA Lead.

У мене є два JSON-об'єкти (Старий і Новий).
**Завдання:**
Порівняй їх структуру та дані, АЛЕ:
1. **Ігноруй** поля, які змінюються динамічно (унікальні ID, timestamp, dates, tokens).
2. Фокусуйся на змінах у **бізнес-логіці**:
- Чи зникли якісь поля?
- Чи змінилися типи даних (наприклад, string став int)?
- Чи змінилися значення констант (наприклад, status: "active" стало "ENABLED")?

Виведи тільки список значущих відмінностей.

**JSON 1 (Old):** ...
**JSON 2 (New):** ...


Що видасть AI: Замість тисячі червоних рядків він напише коротко:

⚠️ Знайдено критичні зміни:
1️⃣Поле user.fullName зникло в новій версії. Замість нього з'явилися firstName та lastName.

2️⃣Поле price змінило тип: було String ("100.00"), стало Number (100.00). Це може зламати старий фронтенд!

3️⃣Поле isAvailable змінилося з true на false, хоча товар той самий.


Висновок: Ви за хвилину знаходите баги зворотної сумісності (Backward Compatibility), які могли б покласти мобільний додаток, і не витрачаєте час на перегляд таймстемпів.

А чим ви порівнюєте великі JSON-и? Очима чи тулами? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
3
📊 Google Sheets на стероїдах: Як перевірити 100 посилань прямо в таблиці

Привіт, екіпаж!

Ситуація: вам дали таблицю, в якій 500 посилань на сторінки товарів. Завдання: "Перевір, які з них робочі (200 OK), а які биті (404 Not Found)".

Варіант "Джуніор": Клікати на кожне посилання вручну. (Прощавай, вихідні).

Варіант "Мідл": Експортувати в CSV, загнати в JMeter/Postman Runner. (Довго налаштовувати).

Варіант "Smart QA": Створити власну функцію в Google Sheets, яка зробить це сама.

Google Таблиці підтримують скрипти (Apps Script). Ви можете створити формулу =CHECK_STATUS(A1), яка піде в інтернет і поверне код відповіді.

Писати скрипт вручну? Навіщо?

Готовий промпт "Sheet Scripter":
Виступи в ролі Google Apps Script Developer.

Мені потрібен скрипт для Google Sheets.
Створи кастомну функцію `GET_STATUS(url)`.

**Логіка:**
1. Функція приймає URL.
2. Робить HTTP-запит (GET) за цією адресою.
3. Повертає HTTP Status Code (наприклад, 200, 404, 500).
4. Якщо виникає помилка (наприклад, DNS error) — повертає текст "Error".
5. Додай обробку кешу, щоб скрипт не спамив запитами при кожному чиху.


Результат від AI (код):
function GET_STATUS(url) {
try {
var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
return response.getResponseCode();
} catch (error) {
return "Error: " + error.toString();
}
}


Як це використати?
1️⃣У Google Таблиці натисніть Extensions (Розширення) -> Apps Script.

2️⃣Видаліть все, що там є, і вставте код від AI.

3️⃣Натисніть "Зберегти" (іконка дискети).

4️⃣Поверніться в таблицю.

5️⃣У комірці B1 напишіть: =GET_STATUS(A1) (де в A1 ваше посилання).

6️⃣Протягніть формулу вниз на всі 500 рядків.


Магія: Таблиця сама почне думати і за хвилину проставить коди: 200, 404, 500. Ви одразу бачите биті посилання. Фільтруєте по "404" — і баг-репорт готовий.

Висновок: Google Sheets — це не просто клітинки. Це повноцінна IDE, якщо знати, як попросити AI написати під неї код.

А ви використовуєте скрипти в таблицях чи тільки формули SUM? 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
4