skip to content
Зміст

Інформація далі буде корисна тим, хто використовує для звітів по автотестам - Allure. Для інформування використовує Slack чи Telegram. Ну і не обовʼязково, але для прикладу використовується - GitHub Actions.

У мене давно була «мрія» (тут згадав відео “В мене є мрія”, але додавати його не буду) щось корисне викласти на GitHub. Не те щоб вийшло щось прям дуже корисне, але щонайменше - око тішить і можна отримати мінімальну інформацію щодо пройдених тестів, не відкриваючи повного звіту. До слова, мало кому це здалося корисним та потрібним серед друзів та знайомих, але мені здалось дуже непоганою плюшкою до звіту.

Ну погнали знайомитись з тим, шо в мене вийшло наваяти 😏


Що ж взагалі воно таке?

Для початку треба зазначити, що був створений маленький проєкт з прикладами тестів - ось тут:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
00K00KMIT

Це “фреймворк” для автоматизації тестування, який використовує можливості Python, Kotlin, Maven та GitHub Actions для створення комплексного рішення для тестування.

Проект включає робочий процес GitHub Actions, який автоматизує процес запуску тестів, створення тестового звіту Allure та надсилання резюме результатів тестування разом з діаграмою до Telegram та Slack.

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

Якщо відокремити проєкт демонстрації з автотестами, то залишаються тільки файли, які тут, а це:

  • font.ttf - шрифт для діаграми
  • generate_chart.py - генератор діаграми
  • send_telegram.py - скрипт для формування повідомлення та додавання до нього діаграми, відправка у Telegram
  • send_slack.py - скрипт для формування повідомлення та додавання до нього діаграми, відправка у Slack

Генерація діаграми результатів тестування

Діаграма результатів тестів

За цей процес в нас відповідає скрипт - generate_chart.py

Файл generate_chart.py використовується для генерації кругової діаграми з результатами тестів. Ось основні частини цього файлу:

  1. Імпорт необхідних бібліотек: matplotlib для створення діаграм, PIL для роботи з зображеннями і sys для роботи з аргументами командного рядка.

  2. Визначення констант: LOGO_NAME та CUSTOM_FONT: ім’я логотипу та шрифт, який буде використовуватися на діаграмі.

  3. Функція create_legend_elements(data): створює елементи легенди для діаграми на основі вхідних даних.

  4. Функція apply_custom_font_to_legend(legend): застосовує вказаний шрифт до тексту легенди.

  5. Функція generate_chart(…): генерує кругову діаграму на основі вхідних даних. Вона створює діаграму, додає до неї легенду, встановлює заголовок, розміщує текст у центрі діаграми та зберігає діаграму як зображення.

  6. Основна частина коду (if __name__ == "__main__"): відбувається читання аргументів командного рядка, а потім викликається функція generate_chart(...) для створення діаграми.


Для того щоб згенерувати таку красу вам потрібен доступ до звіту Allure, а саме до файлу summary.json, котрий знаходиться за шляхом allure-report/widgets/summary.json

{
"reportName": "Allure Report",
"testRuns": [],
"statistic": {
"failed": 1,
"broken": 1,
"skipped": 1,
"passed": 9,
"unknown": 0,
"total": 12
},
"time": {
"start": 1717227660876,
"stop": 1717227667375,
"duration": 6499,
"minDuration": 0,
"maxDuration": 1691,
"sumDuration": 6415
}
}

Звідси ми будемо брати дані по тестам, а саме:

  • “total” - загальна кількість тестів
  • “passed” - кількість успішних тестів
  • “failed” - кількість невдалих тестів
  • “broken” - кількість зламаних тестів
  • “skipped” - кількість пропущених тестів
  • “duration” - час виконання тестів

В проєкті на GitHub задача зі збору цих даних лежить на плечах main.yml, але це ви можете робити як вам завгодно, головне передати потім ці дані до generate_chart.py

А ось як це виглядає саме в main.yml:

- name: Install jq
run: sudo apt-get install jq
- name: Generate test report message
id: test_report_message
run: |
FAILED=$(jq .statistic.failed allure-report/widgets/summary.json)
echo "FAILED=$FAILED" >> $GITHUB_ENV
BROKEN=$(jq .statistic.broken allure-report/widgets/summary.json)
echo "BROKEN=$BROKEN" >> $GITHUB_ENV
SKIPPED=$(jq .statistic.skipped allure-report/widgets/summary.json)
echo "SKIPPED=$SKIPPED" >> $GITHUB_ENV
PASSED=$(jq .statistic.passed allure-report/widgets/summary.json)
echo "PASSED=$PASSED" >> $GITHUB_ENV
TOTAL=$(jq .statistic.total allure-report/widgets/summary.json)
echo "TOTAL=$TOTAL" >> $GITHUB_ENV
DURATION=$(jq .time.duration allure-report/widgets/summary.json)
echo "DURATION=$DURATION" >> $GITHUB_ENV
MINDURATION=$(jq .time.minDuration allure-report/widgets/summary.json)
echo "MINDURATION=$MINDURATION" >> $GITHUB_ENV
MAXDURATION=$(jq .time.maxDuration allure-report/widgets/summary.json)
echo "MAXDURATION=$MAXDURATION" >> $GITHUB_ENV
SUMDURATION=$(jq .time.sumDuration allure-report/widgets/summary.json)
echo "SUMDURATION=$SUMDURATION" >> $GITHUB_ENV
echo "::set-output name=message::Tests completed. \
Failed: $FAILED, \
Broken: $BROKEN, \
Skipped: $SKIPPED, \
Passed: $PASSED, \
Total: $TOTAL"

Що ж тут відбувається:

  • Використовуючи утиліту jq, витягуються статистичні дані з файлу summary.json, який генерується Allure після виконання тестів. Ці дані включають кількість невдало пройдених (FAILED), зламаних (BROKEN), пропущених (SKIPPED), успішно пройдених (PASSED) тестів, а також загальну кількість тестів (TOTAL).

  • Також витягуються дані про тривалість тестів:

    • DURATION - загальна тривалість
    • MINDURATION - мінімальна тривалість (не використовується)
    • MAXDURATION - максимальна тривалість (не використовується)
    • SUMDURATION - сумарна тривалість (не використовується)
  • Кожне з цих значень записується в змінні середовища ($GITHUB_ENV), щоб їх можна було використовувати в наступних кроках робочого процесу та саме вони передаються далі у наш generate_chart.py

  • На останньому кроці формується повідомлення, яке містить усю цю інформацію. Це зроблено більше для того, щоб під час налагодження бачити цю інформацію у Github Action.


В цілому, ви можете перевірити роботу скрипта просто виконавши команду нижче. Але треба впевнитись, що встановлений Python та необхідні модулі (наприклад matplotlib):

Terminal window
python generate_chart.py 100 50 20 10 20 60000

Параметри команди:

  • 100 - загальна кількість тестів
  • 50 - кількість тестів, що пройшли
  • 20 - кількість невдалих тестів
  • 10 - кількість зламаних тестів
  • 20 - кількість пропущених тестів
  • 60000 - загальна тривалість у мілісекундах

Ось як буде виглядати для прикладу вище:

Приклад згенерованої діаграми


Сповіщення про результати тестів у Telegram

Приклад звіту в Telegram

Після того як в нас є готове зображення з діаграмою - chart.png, нам треба його відправити у Telegram.

Файл send_telegram.py використовується для відправки повідомлень у Telegram з результатами тестів.

Ось як це працює:

  1. Імпорт необхідних бібліотек: os, re, json, requests, sys, glob та telegram.

  2. Визначення констант: ідентифікатори запуску GitHub, максимальна кількість тестів для звіту в Telegram та регулярний вираз для визначення URL.

  3. Функції отримання тестів: get_tests_by_status, get_failed_tests, get_broken_tests, get_skipped_tests - ці функції використовуються для отримання тестів з певним статусом зі звіту Allure.

  4. Функція format_test_message: форматує повідомлення про тест для відправки в Telegram.

  5. Функція create_keyboard: створює клавіатуру для повідомлення в Telegram.

  6. Функція send_photo_and_message: відправляє фото та повідомлення в Telegram. Вона формує повідомлення, відкриває фото, створює клавіатуру та відправляє запит до API Telegram.

  7. Основна частина коду (if __name__ == "__main__"): відбувається читання аргументів командного рядка, а потім викликається функція send_photo_and_message для відправки фото та повідомлення в Telegram.


Тут треба зазначити наступні речі:

  • MAX_TESTS_FOR_TELEGRAM_REPORT - тут ми задаємо максимальну кількість тестів для кожного статусу. Це означає, що якщо буде, наприклад, 10 тестів у статусі “failed”, то відобразиться 7 тестів, які впали та буде повідомлення типу: “And 3 more failed tests…” Це зроблено для того, щоб влізти в обмеження символів (4096)

  • Функція get_tests_by_status, що вона робить:

    • Проходиться по всіх файлах з розширенням .json в директорії, вказаній у allure_report_path (це target/allure-results)

    • Перевіряє, чи містить JSON об’єкт поле status і чи входить його значення в список statuses (це в нас - “failed”, “broken”, “skipped”)

    • Якщо умова вище виконується, то вона ініціалізує змінну response_code як None і проходиться по всіх елементах в полі attachments JSON об’єкта.

    • Якщо в полі name елемента attachment присутній рядок ‘HTTP/1.1’, то встановлюється response_code як значення поля name з видаленим рядком ‘HTTP/1.1 ’ і перериває цикл.

    • Створює словник test з полями name, status і response_code, взявши відповідні значення з JSON об’єкта.

Останні описані кроки (get_tests_by_status) робляться для того, щоб отримати у списку подібне відображення:

• Joke from Chuck (failed)
https://api.chucknorris.io/jokes/random/dev
404

Але це буде працювати тільки при деяких доопрацюваннях з вашої сторони у самих тестах.

Для прикладу ось вам файл 0ccb7440-a02e-408a-a45a-ee925833e1dd-result.json:

Наприклад:

Приклад JSON файлу з результатами тесту

Розбір полів:

  • “status” - перебираються статуси, які нам потрібні (“failed”, “broken”, “skipped”)
  • “name” - значення береться для назви теста у повідомленні (тут починаючи з /n - то вже доопрацювання, а так би було просто “Joke from Chuck (failed)”)
  • “attachments” - якщо в полі “name” є HTTP/1.1, то беремо значення після HTTP/1.1, тобто - 404

Тут відправити повідомлення локально буде дещо складніше, ніж з діаграмою, але все ж таки можливо:

Terminal window
python send_telegram.py "6664016666:XXHhjjLsDcsjXxxXX73xxxxxX-x4BXXwU0I" "-0008888899999" ./chart.png 100 50 20 10 20 "https://github.com/imbirovsky/allure-chart-reporter" "target/allure-results"

Параметри команди:

  • send_telegram.py - шлях до скрипту
  • "6664016666:XXHhjjLsDcsjXxxXX73xxxxxX-x4BXXwU0I" - token бота телеграм
  • "-0008888899999" - chat_id, куди відправляти повідомлення
  • ./chart.png - шлях до вашої діаграми
  • 100 50 20 10 20 - це статуси тестів: TOTAL, PASSED, FAILED, BROKEN, SKIPPED
  • "https://github.com/imbirovsky/allure-chart-reporter" - це шлях до вашого звіту, використовується у кнопці форми
  • "target/allure-results" - шлях до результатів тестів

Як на мене, то таке рішення досить зручне для API тестів, де тобі достатньо побачити в такому репорті у телеграм запит та код помилки і зрозуміти, що там вже не так.

Але знов таки - в кожного свої потреби


Сповіщення про результати тестів у Slack

Приклад звіту в Slack

Відмінностей від Telegram дуже мало і всі вони стосуються форматування та особливостей API Slack. Також різниця полягає в тому, що в Slack текст і зображення будуть відправлені двома окремими повідомленнями.

Детально можете ознайомитись за посиланням на Github.


Як підсумок

По-перше, якщо комусь потрібно допомогти з налаштуванням, то можете писати на пошту.

По-друге, я знаю за allure-notifications і шо це все схоже. Не буду писати, шо там опис на рос мові, то і так бачите.

Скажу тільки, шо діаграма там виглядає явно гірше, немає інформації по непройденим тестам, але з іншої сторони там інтеграція з великою кількістю месенджерів, інтеграція у проєкт легша, також плюсом - кастомизація через файл.

Тут можу сказати, що якщо комусь зайде моя “стрєпня”, тобто - Allure Chart Reporter, то я буду додавати месенджери, зроблю це як лібу і т.д і т.п.

Тому ставьте лойси / зірочки, бо це мотивує шось робити

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
00K00KMIT

Всім зичу міцного здоровʼя, бережіть себе та близьких, не забувайте допомагати ЗСУ ❤️

Обговорення
Вхід через GitHub
Завантаження коментарів...