Я написав плагін для Pytest: як і з якою метою
Привіт, друзі! Я — Олексій Остапов, 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 і мені дуже кортить якось використати свої знання. Тож якщо маєте ідеї плагінів — пишіть!
Дякую, що дочитали! Дякую двічі, якщо спробували плагін самостійно! А як ще й відгук напишете, буду просто в захваті 😁
4 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів