Я написав плагін для Pytest: як і з якою метою

💡 Усі статті, обговорення, новини про тестування — в одному місці. Приєднуйтесь до QA спільноти!

Привіт, друзі! Я — Олексій Остапов, 15 років як QA-інженер, автор блогу QA Mania та один з ведучих подкасту «Питання Якості». Сьогодні я хочу розказати вам, як я плагін для pytest написав — pytest-analyzer.

З чого все почалось

Написали мені ще весною Михайло Поляруш та Михайло Бондарчук, автори testomat.io — тест-кейс менеджмент-системи для автоматизованих тестів. Кажуть, «ти ж тестувати любиш, гарний досвід пайтону маєш, чи не бажаєш написати плагін для нашої системи керування тестами? Щоб все було зручно і красиво: для кожного тест-кейса прив’язати ID унікальний, під час виконання статус на льоту оновлювати».

Мені ідея сподобалась, але реального досвіду написання плагінів я не мав, тож погодився начаклувати PoC, а далі видно буде. Потім почалась рутина — комунікація за вимогами, уточнення АПІ і аналіз — а як же взагалі пишуться плагіни і як змусити конкретно мій виконувати ті вимоги, що мені були поставлені.

Які вимоги

Перш за все, що таке testomat.io? Це українська тест-кейс менеджмент-система, заточена на автоматизовані тести. Її «фішка» перевертає концепцію автоматизації: типово, першими заводяться мануальні тести, які пізніше автоматизуються. А тут — навпаки! Спочатку можна написати тести, будь-які, навіть компонентні (unit), а потім імпортувати їх в систему разом з кодом для подальшого аналізу.

Мені така ідея здається зручною, бо як тест впав, можна, не відкриваючи IDE, прикинути, чи є в коді помилки, чи це точно баг продукту.

Один з Михайлів сказав, що першочергова задача — це аналіз написаних тестів. Плагін має вміти збирати імена власне тестів, файлів, класів, код.

Наступна задача — синхронізація тестів, тобто можливість передати зібрані дані в систему тест-кейс менеджменту і отримати звідти набір унікальних тест ID.

Ну, і далі — забезпечити інтерактивне виконання. Кожен тест має «звітувати» про свій статус одразу після виконання. Якщо тести будуть виконуватись довго, можна слідкувати за процесом просто в застосунку.

Додатково я собі поставив за мету зробити плагін якомога непомітнішим, тобто він має максимально використовувати вбудовані можливості pytest. Навіщо винаходити велосипед і додавати до тестів унікальні декоратори, які потім ще треба імпортувати, якщо pytest вже має дуже гнучкий декоратор @pytest.mark.

Процес розробки, сповнений технічними деталями, який можна читати по діагоналі

Код плагіну можна подивитись тут: github pytest analyzer. Для аналізу коду тестів я хотів використати вбудовані можливості pytest. Він же й сам аналізує все перед запуском, чом би не поділитись?

На жаль, виявилось, що як тільки помістити будь-які тести в директорії, пайтон одразу ж намагається оптимізувати код і компілює його в *.pyc файли. І як би я не намагався, вихідний код тестів просто перестає існувати на момент аналізу.

Тож я звернувся до ChatGPT і поцікавився, які є бібліотеки для роботи з кодом, і отримав рекомендацію — autopep8. Досить простий спосіб, як зібрати всі тести у вигляді пайтон об’єктів, так і модифікувати код, додавши до нього імпорти і декоратори.

Для комунікації з REST API testomat.io я вирішив не ускладнювати собі життя і використав одну з найпопулярніших бібліотек — requests. Довелось трохи помучитись з ID тестів — особисто мені не зайшов спосіб репрезентації тестів, які повертаються з системи.

Сам собою testomat.io не зберігає тестові артефакти, такі як скриншоти, але пропонує налаштувати інтеграцію з S3 сховищем і зберігати лише посилання на артефакти. Я використав для роботи з S3 бібліотеку boto3, але протестував її лише з однією реалізацією S3, тож мені дуууже цікаво, як плагін буде працювати з іншими хостингами, зокрема з AWS. Тож як будете користуватись — пишіть відгуки і баги. 🙂

Після того, як чернетка плагіну була написана, постало питання — як зробити з написаного плагін, тобто запакувати і розмістити в pypi? Довелось знову трохи помучитись з конфігурацією файлу проєкту, але все вийшло! Навіть написав собі короткий гайд на майбутнє просто в документації, щоб жодного кроку не пропустити.

Використання ШІ

Сам плагін ШІ не використовує, хоча було б круто! Але трохи раніше я написав, що питав про рішення ChatGPT. І мені кортить розказати про можливості ШІ.

По-перше — чат. Він все ще не може написати програму за вас. Навіть приклади коду, які він надає, не працюють у 50% запитів. Мій типовий діалог:

  • як зробити це?
  • Так можна, ось код.
  • Але в пайтест нема таких функцій.
  • Дійсно, нема... ну що ж, тоді хз ¯\_(ツ)_/¯

Але може порекомендувати бібліотеки чи хитрощі, які важко нагуглити. Я використовую одну функцію в пайтест, опис якої знайти в документації неможливо за ключовими словами.

По-друге, я підписався на Github Copilot. Реклама каже, що він економить час на написання коду. І він дійсно це робить! За відчуттями — це як просунутий intellisense — ти починаєш писати код, і він його доповнює згідно з контекстом:

  • створив список, почав писати цикл і одразу отримав код для його перебору;
  • оголосив функцію parse_test, отримав досить гідну чернетку парсеру, що чудово вписується в уже написаний мною код;
  • Copilot дописує не тільки код, а ще й конфіги, readme і навіть Playwright-тести. Дійсно, вчився на дуже різноманітних прикладах. Одного разу я навіть отримав ефект дежавю, коли почав писати фікстуру для пайтест, і отримав точнісінько свій код зі свого ж проєкту на github у відкритому доступі;
  • іноді, в 20% випадків, він неправильно інтерпретує мій намір, і дає підказку коду, що мені взагалі не потрібен. І робить це досить вперто. Мені не вистачає якогось хоткея, щоб відмовитися від допомоги в конкретному випадку

Загальне враження від Copilot — супер. Я б дуже хотів використовувати його на постійній основі не тільки в pet-проєктах, а й на основній роботі.

Що в мене вийшло

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

pip install pytest-analyzer 

І вже можна аналізувати тести командою

pytest --analyzer debug 

В результаті роботи створиться metadata.json файл, в якому буде зібрана інформація про ваші тести.

Далі можна створити проєкт в testomat.io, додати API key проєкту в змінні оточення (environment variables) і зробити справжню магію:

pytest --analyzer add

Якщо все налаштовано правильно, всі ваші тести самі з’являться в системі керування тестами, не треба нічого копіювати руками. Але це ще не все. У вашому коді над кожним тестом автоматично з’явиться декоратор з ID тесту. Прописувати ID руками? Забудьте!

Ну і вишенька на торті — звітування тестів. Виконуємо:

pytest --analyzer sync 

Відкриваємо Test Runs в testomat.io і насолоджуємось прогресом виконання ❤️

Як погратись з плагіном

Я створив проєкт з автотестами на Playwright, в якому збираюсь використати всі найкрутіші можливості інструменту автоматизації. Його можна завантажити, створити змінну оточення TESTOMATIO з вашим API Key і запустити. Все так просто. Записав відео інструкцію, як це зробити:

Roadmap

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

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

Висновки

Мої pet-проєкти виходять на новий рівень і можуть приносити реальну користь тестерам, що дуже мене тішить. А ще я в деталях розібрався, як працює мій улюблений фреймворк pytest і мені дуже кортить якось використати свої знання. Тож якщо маєте ідеї плагінів — пишіть!

Дякую, що дочитали! Дякую двічі, якщо спробували плагін самостійно! А як ще й відгук напишете, буду просто в захваті 😁

👍ПодобаєтьсяСподобалось16
До обраногоВ обраному4
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Прикольно. Я колись писав схожу штуку на Java щоб у той самий TestRail слати даннi. А потiм упоровся i ще написав плагiн для Intellij Idea який створював тест-кейси з степ анотацiй Аллюру.

Дякую за статтю! А я нагадаю, що Testomat.io це перша українська тест менеджмент система. І якщо ви давно думали замінити чимось Testrail, а може Allure чи Qase, то є ми!

Виглядає класно і мачурно!
Я колись бавився зі схожим (правда на примітивнішому рівні) — писав ліби для JUnit та TestNG на Java, щоб збирати дані і результати тестів та відправляти то все в TestRail.

Тоді ходіть писати до нас, нам якраз Java на даний момент є ДУЖЕ необхідна!

Підписатись на коментарі