Інформація далі буде корисна тим, хто використовує для звітів по автотестам - Allure. Для інформування використовує Slack чи Telegram. Ну і не обовʼязково, але для прикладу використовується - GitHub Actions.
У мене давно була «мрія» (тут згадав відео “В мене є мрія”, але додавати його не буду) щось корисне викласти на GitHub. Не те щоб вийшло щось прям дуже корисне, але щонайменше - око тішить і можна отримати мінімальну інформацію щодо пройдених тестів, не відкриваючи повного звіту. До слова, мало кому це здалося корисним та потрібним серед друзів та знайомих, але мені здалось дуже непоганою плюшкою до звіту.
Ну погнали знайомитись з тим, шо в мене вийшло наваяти 😏
Що ж взагалі воно таке?
Для початку треба зазначити, що був створений маленький проєкт з прикладами тестів - ось тут:
Це “фреймворк” для автоматизації тестування, який використовує можливості 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
використовується для генерації кругової діаграми з результатами тестів. Ось основні частини цього
файлу:
-
Імпорт необхідних бібліотек: matplotlib для створення діаграм, PIL для роботи з зображеннями і sys для роботи з аргументами командного рядка.
-
Визначення констант: LOGO_NAME та CUSTOM_FONT: ім’я логотипу та шрифт, який буде використовуватися на діаграмі.
-
Функція create_legend_elements(data): створює елементи легенди для діаграми на основі вхідних даних.
-
Функція apply_custom_font_to_legend(legend): застосовує вказаний шрифт до тексту легенди.
-
Функція generate_chart(…): генерує кругову діаграму на основі вхідних даних. Вона створює діаграму, додає до неї легенду, встановлює заголовок, розміщує текст у центрі діаграми та зберігає діаграму як зображення.
-
Основна частина коду (
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):
python generate_chart.py 100 50 20 10 20 60000
Параметри команди:
100
- загальна кількість тестів50
- кількість тестів, що пройшли20
- кількість невдалих тестів10
- кількість зламаних тестів20
- кількість пропущених тестів60000
- загальна тривалість у мілісекундах
Ось як буде виглядати для прикладу вище:
Сповіщення про результати тестів у Telegram
Після того як в нас є готове зображення з діаграмою - chart.png
, нам треба його відправити у Telegram.
Файл send_telegram.py використовується для відправки повідомлень у Telegram з результатами тестів.
Ось як це працює:
-
Імпорт необхідних бібліотек:
os
,re
,json
,requests
,sys
,glob
таtelegram
. -
Визначення констант: ідентифікатори запуску GitHub, максимальна кількість тестів для звіту в Telegram та регулярний вираз для визначення URL.
-
Функції отримання тестів:
get_tests_by_status
,get_failed_tests
,get_broken_tests
,get_skipped_tests
- ці функції використовуються для отримання тестів з певним статусом зі звіту Allure. -
Функція format_test_message: форматує повідомлення про тест для відправки в Telegram.
-
Функція create_keyboard: створює клавіатуру для повідомлення в Telegram.
-
Функція send_photo_and_message: відправляє фото та повідомлення в Telegram. Вона формує повідомлення, відкриває фото, створює клавіатуру та відправляє запит до API Telegram.
-
Основна частина коду (
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:
Наприклад:
Розбір полів:
- “status” - перебираються статуси, які нам потрібні (“failed”, “broken”, “skipped”)
- “name” - значення береться для назви теста у повідомленні (тут починаючи з
/n
- то вже доопрацювання, а так би було просто “Joke from Chuck (failed)”) - “attachments” - якщо в полі “name” є HTTP/1.1, то беремо значення після HTTP/1.1, тобто - 404
Тут відправити повідомлення локально буде дещо складніше, ніж з діаграмою, але все ж таки можливо:
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
Відмінностей від Telegram дуже мало і всі вони стосуються форматування та особливостей API Slack. Також різниця полягає в тому, що в Slack текст і зображення будуть відправлені двома окремими повідомленнями.
Детально можете ознайомитись за посиланням на Github.
Як підсумок
По-перше, якщо комусь потрібно допомогти з налаштуванням, то можете писати на пошту.
По-друге, я знаю за allure-notifications і шо це все схоже. Не буду писати, шо там опис на рос мові, то і так бачите.
Скажу тільки, шо діаграма там виглядає явно гірше, немає інформації по непройденим тестам, але з іншої сторони там інтеграція з великою кількістю месенджерів, інтеграція у проєкт легша, також плюсом - кастомизація через файл.
Тут можу сказати, що якщо комусь зайде моя “стрєпня”, тобто - Allure Chart Reporter, то я буду додавати месенджери, зроблю це як лібу і т.д і т.п.
Тому ставьте лойси / зірочки, бо це мотивує шось робити
Всім зичу міцного здоровʼя, бережіть себе та близьких, не забувайте допомагати ЗСУ ❤️