Галоўная / Артыкулы

Playwright і TypeScript без ведання TypeScript: інжынер, AI-пласт і чатыры фільтры

QA-інжынер, які прыйшоў з Selenium і C#, з дапамогай AI будуе фрэймворк Playwright на TypeScript: структура, правілы архітэктуры, хукі і чатыры фільтры для тыкетаў.

Выдавец: REACTAPP.TOP25 хв чытання5663 слоў

Крыніцы: I Built a Playwright Framework in TypeScript Without Knowing TypeScript — Using AI

Рэпазітары, які можна кланаваць, у яком знаходзяцца Скіллз і Правілы, а таксама Playwright, кераваны MCP, які самастаіцельна працуе з аплікацыяй, лёгка ў обяве, але медленна ў рэалізацыі. Гэты рэпазітары ўжо існуе як рабочы праект: кланаваць яго, запусціць адзін каманду, і тэсты будуць выкананы на жывай станцыі. Історыя яго стварэння пачалася з старой суіты тэстаў і пытання пра выбор мовы.

Міграцыя, якая так і не была апраўдана

Команда QA працавала чатыры годы над розвіццём старой суіты тэстаў на Selenium, а дзеякія колегі, якія пазней перайшлі ў віддзел разработкі, зналі яе ўсё давэй. Яе ядром былі тыясячы тэстаў UI на C#, сакраваных за гады автарамі, якія большасцю выйшлі з компаніі. Пераход на Playwright давно быў у спіску бажанняў — ён быстрэйшы, стабільнейшы і зручнейшы для работы, але пераход так і не адбыўся.

Прычына была звычайная. Ніхто не меў ста дапаможных гадзін працы інжынера, каб вкласты іх у перапісво, якое не мае жадной эканамічной цяні, а менеджэр не можа схваліць тэзу „новы інструмент працюе лепшая“. Тэхнічныя аргументы завжды ў наявнасці, але чым больша суцэльнасць інструментаў, тым дорожэ пераход на новыя тэхналогіі, а корысты ад гэтага становяцца ўсё менш значнымі. Перапісво трэба плаціць загадзя і ў повнай меры. Яго аддача ніколі не паказваецца як цыфра ў атласе: яна прыходзіць у вачынку меншай колькасці неудачных тэстаў і шырэйшага выправлення проблем за калькі гадоў. Таму гэя ідэя застала нерэалізаванай. Playwright і TypeScript сталі з’являцца ў все большай колькасці абавесцей пра працавую месца, а нячынанне стало стаць дарожэ як для праекту, так і для адносова чалавека.

Потым іншая команда пачала ўсё з нуля: без спадчыны, без масы тэстаў, якія не павінны зламацца, і без патрэбы ў міграцыі. Прапанованне стварыць автаматызацыю UI і API прынесла Playwright і TypeScript у ўласную ўжытковую работу. Гэта таксама адкрыло некомфортную правду: Java і C# былі вядомыя, за імі стаяло дзесяць гадоў коду тэстаў, але гэта была праца з тэстамі, а не з розвіццю, якая выклікае іншую глыбіну працы. JavaScript, TypeScript і сам Playwright былі новымі тэхналогіямі. З’явілася запытанне, якое два гады тыму здалася б рэтарычным: наскількі незнаўства мовы можа стрымваць каго-небудзь у 2026 году, калі ўсюды ёсць AI?

Звязка з эксперыментам

Няхто адзін дзень не стаў прычыной гэтага крока. Ён выкліквалі паступовае усвядомленне таго, што простае тэставанне і напісанне тэстаў нікуды не вядуць. QA здоблівае свою ролю не за ліквум багоў чы сумой ліній коду, а праз павышэнне якосці продукту за дапамогою процэсаў, дакументацыі, автаматызаціі і комунікаціі, і з гадамі сістэматычны падход перамага індывідуальныя зусіллі.

Две прычыны спрабавалі ў тым жа напрамку.

Адзін з такіх спроб быў здзейснены пры помцы бота для трынку крыптовалюты, напісанага на Python за дапамою Claude Code, чыяму создатэлю не было вядома Python. Праца пачалася з адрэналіну першага успеху, а заканчылася крахам, калі код стаў незрозумелым для всіх, і ніхто не мог узрозумець, чаму не працуюць тэсты і як іх парадкаваць. Урок заключаўся у розніцы межы стварэнням коду і пабудовай сістэмы: бот працаваў, але яго не можна было падтрымваць. Не існавало жаднай карты праекту, парадкаванні прычын стваралі новыя проблемы, а токены знікалі ў працэсе опісу сімптамаў заместо пошуку ўсіх прычын.

Іншы тлак надаўся з ўласнай працы, дзе штучны інтэлект пачаў прасачвацца ў рутыны аптэкты якосці. Эксперыменты займаліся стварэннем цэлага ланцоўка, якая праходзіла ад задання да завершанага тэсту, формулюваннем правіл, каб мадэль строго ўсё іх дазволяла, а таксама стварэннем умов для таго, каб весь працэс быў павторным і керованым. Колегі выкарыстоўвалі штучны інтэлект як болей розумную пошуковую палатку чы праца-вендыр коду. Маладзе хто ўпакоўваў яго ў сістэму, якая б зробіла яго прыдатным для прыкладнага выкарыстоўвання; гэта вазілася на тым, што сама сістэматычная частка ўтрымвае ўсю ценнась.

Гэтыя два напрамкі прывелі да стварэння праекту Playwright, які быў сформульаваны як гіпатэза: насколькі далека можа зайсці інжынер з моцнымі фундаментальнымі знаннямі, калі штучны інтэлект выконвае працу з набірання тэксту, і чы можа існаваць цэлыя рамкі тэставання без напісання жаднай лініі на мове, яку інжынер не можа вольна чытаць?

Чаму TypeScript, а не C# чы Java

Першая перапрацоўка была бяспекавая. Playwright таксама існуе для C# і Java, таму, можа, зміна мовы не была неабходная. Разлік, як выявілася, не лежыць у кераванні браузерам. Цяя частка ідэнтычная ў всіх варыянтах: тая ж API, тыя ж селектары і тыя ж браузеры. Разлік крыўцяцца ў тым, як організаваныя і запускаюцца тэсты.

У JavaScript і TypeScript Playwright выклікаецца з натывным выконвальнікам тэстаў, які падтрымляе паралельную експанацыю, фікстуры, атласы рэзультатаў і аўтаматычны аналіз. Для C# і Java такога няма. Команды выбіраюць тое, што ужо існуе ў ўсім экасістэме — будзь то xUnit, NUnit, JUnit чы TestNG, — а Playwright проста падае для іх базовыя класы, таму арганізацыя і паралелізм ствараюцца вручную. Гэтае і ёсць справжняя прыганка: не странная сынтаксіс чы відсутнае метод, а неабходнасць перастраіваць усё з нуля, включаючы паралелізм, ізоляцыю дадзейнаў па ніткам, адпаведную інфраструктуру і атласы рэзультатаў — усія проблемы, якія ужо былі рашаныя і калі-небудзь крашчэ за ўсё ухіліцца. Паралельна з гэтым існавала альтэрнатыва, якая прыходзіла ужо готовая, але на мове, якую ніхто не ведаў. Playwright вырос разам з JavaScript, таму ён ёсць натывным элементам, а не стороннім рашэннем.

Што на самай працэ «стварэння без знанняў» насправды значыць

Называць гэты праект створаным без паведамленняў пра тое, як яго будуець ствараць, — гэта не проста некальканоснае асэнсце. Гэта будзе чыстая брэхня. За гэтым стоіць дзесяць гадоў дазвілля ў сферы аптэкты: стварэнне процэсаў з нуля і тэставанне сістэм усіх відаў — ад веб-застосоў і API да мобільных дапысоў. Самэ гэта дазвілля не дазволіла рабоце занурыцца ў мора створанага коду. Сінтаксі TypeScript і Playwright заўсёды заставалася неспадзяваным фактам.

Калькі лекцыі дапамоглі. Як у ранейшых эксперыментах, так і пад час гэтага стварэння, калькі курсаў Anthropic былі прызначаны для дзеяння з праектаваннем агентаў, сувязываннем навыкаў і формулюванням задач для AI. Яны дапамаглі падкрэсліць апыт, але не заменілі яго. Гэтае мела значэння — падход. Праект не з’явіўся як ідэя кодавальніка, які просіў пра калькі тэсты. Ён з’явіўся як рэшчэнне інжынера, які задаў модэлю правілы, архітэктурныя меры і тое, што трэба пераканаць, а потым дазволіў яму дзеяць у межах гэтых правілаў, што ператворыла хаотычны абмян на адарожаны процэс.

Каркас, з двума застэрэжэннямі

Перш чым говорыць пра структуру і яе рашэнні, трэба згадаць два моменты.

Паўначальна, праект являе сабою толькі канструкцыйную основу, а не готавы продукт, які можна выймаць, адладжваць чы рэшыць. Ён дзеліцца для паказу падходу, а не для стварэння ілюзіі досконаласці. Тыя, хто шукае готавы інструмент, будуць разчароўваны, тады як тыя, хто шукае мадэль для стварэння сістэмы на адной з тэхналогій AI, зможуць яе знайсці. Команды маюць свае абмежэнні, трэбаванні ў аблэгацыі безпекі і інтэграцыі, і дызайн, які падходзіць для публічнай дэманстрацыі, можа патрабаваць серйозных перэрабоць у рамках корпаратыўных рашэнняў SSO, MFA, спецыяльных правіл для тэстовых дадзеных і сістэмы керування тэстамі. Таму логіка, якая стоіць за кодам, являе сабою тую частку, якая можа быць перанесена.

Паўтора, набор адзінакоў быў мінімальны. Ён складаўся з Claude Code за базовую месячную прайм-перадплата ў 20 долераў, Visual Studio Code як рэдагара, настроеныя сервера MCP для Playwright, які дазволяе модэлю самастойна аналізаваць прыкладнэ рашэння, і, можа, найважлівейшае — чысты розум і трохі вольнага часу. Не было ні дорогіх корпаратыўных рашэнняў, ні складнай інфраструктуры, ні распрашчаных атрыбутаў для тэставання. Усё працюе на звычным ноутбуку, і гэта таксама ўключаецца ў сэнс: для запуску не трэба нічага надпрыроднага, толькі розумення таго, што ствараецца, і бажанне гэта зрабіць.

Што включае праект і як ён структураваны

Цэль — Toolshop, адкрытый дэмавы магазін у Інтэрнэце, створаны для практыкавання автаматызацыі. Выбар мае значэнне: няма закрытага сістэмы, няма бізнес-кантэксту, таму кожны можа клонаваць рэпазітары, інсталаваць залежнасці за аднам камандам і запускаваць тэсты на жывым сайце, без неабяжнага стварэння акаунтаў і шукання дакументацыі.

У комплекце ўсьмо трыдцаць сям тэстаў: трыдцаць чатыры працуюць, а тры навмысна не працуюць, каб у атласе было відна, як выглядае абыякі неяксамоць. Тэсты API абрабатваюць логіку сервера, тэсты UI — інтэрфейс, а гібрыдныя тэсты ствараюць стан праз API, а пасля пераканальваюць яго ў браузеры. Гэтага цэлкам дастаткова, каб паказаць архітэктуру, але гэтага занадта мало, каб сказаць ўсё пра паверхню пакрыцця продукту, якая залежыць ад конкрэтнага продукту і яго бізнес-рызыкаў, а не ад таго, сколькі тэстаў ў дэмавым варыянцы. Структура дырэктарыі:

config/
 env.ts // The only place where environment variables are read
 timeouts.ts // Timeouts, also in one place
core/
 run-user.ts // The user registered by this specific run
 global-setup.ts // Register → UI login → data snapshot → download OpenAPI spec
 global-teardown.ts // Cleanup after the run: remove favorites and the user
 allure-labels.ts // Parses [Section / Subsection] from the test name into report structure
 allure-categories.ts // Buckets for triaging failures in the report
api/
 generated/schema.d.ts // Types generated from OpenAPI, never touched by hand
 types.ts // Domain types derived from the schema
 client.ts // openapi-fetch, paths and params checked by the compiler
 contract.ts // Runtime validation of API responses against the schema
 auth.api.ts // Typed clients on top of api/client.ts
pages/
 base.page.ts // Base page class
 components/ // Elements present on every page (site header)
 auth/ // Page Objects for authorization pages
 account/ // Account area: account, profile, favorites
 shop/ // Catalog, product page, checkout
fixtures/
 base.fixture.ts // All dependency injection, test/expect only imported from here
data/ // Strings and routes, so they don’t live inside tests
utils/ // Logger, reference data snapshot
tests/
 auth/ // Everything auth-related in one folder
   auth.api.spec.ts // API: login, token lifetime
   registration.api.spec.ts
   login.ui.spec.ts // UI: login form, errors, logout
 catalog/
   products.api.spec.ts
   catalog.ui.spec.ts
 cart/
   cart.ui.spec.ts
 favorites/
   favorites.api.spec.ts
   favorites.hybrid.spec.ts // Hybrid: state via API, verification via UI
 profile/
   profile.hybrid.spec.ts
 contract/
   contract.api.spec.ts // Matching live API responses against the spec
 demo/ // Tests tagged @demo that fail on purpose
docs/ // Feature maps, checklists, test cases, plans
.claude/ // AI layer: rules, skills, agents, hooks```

Рашынкі, якія дазволяюць масштабаванне

  • Спачатку функцыя, пасля — слой. Адна выбор на першы погляд здаецца дзівна, але яна вялікай меры вплывае на можлівасць масштабавання: тэсты групуюцца па функцыях, а слой — гэта суфікс імені файла, як у login.ui.spec.ts, auth.api.spec.ts і checkout.hybrid.spec.ts. Распрацоўшчык, які зменяе логіку автарызаціі, знаходзіць усія супаўзвязаныя тэсты пад tests/auth/ і не павінен шукаць у трох каталогах. Калі тэстаў трыдцаць, ніхто нічога не зазначае, а структура на адной основе слоёў выглядае апрантна. Калі ж тэстаў трыста, tests/ui/ ператвараецца на каталог з шастыдзiesцю файлаў, таму што змена функцыі вплывае на кожны тэст, які ў яе ёсць, незалежна ад слоя. Разрозненыя тэсты ператвараюць аналіз у пошук.
  • Калі нават папкі з функцыямі стае перапоўнена. З тыямі тэстаў папка з функцыяй можа запрацца на сотні файлаў. Наступны крок — стварэнне падпапак па падфункцыях або сцэнарыях, такіх як tests/auth/login/, tests/auth/registration/ і tests/auth/password-reset/, што распрастраńяе тую ж ідэю залічвання кантэксту па боку коду. Таксама сотні тэстаў не должны дзеліцца адным файлам, калі ўжо тады гэта стварае неразбірамы, немагчымы да перагляду „маніяка“.
  • Гібрыды як пачатковая пункт. Дэманстрацыя складаецца з тэстаў API, UI і гібрыдных, але рэальны праект не прымушаны ўсё гэта відтвараць чы ствараць тры шары для кожнай функцыі. Можа не існаваць самастоятэльнага API, які варта було бы тэставаць, або тэсты UI можа ўжо быць гібрыднымі, пры чым пярэднія умовы задаюцца праз API чы базу дадзеных, а пераконтваецца лячуць толькі тыя часткі, якія стосуюцца інтэрфейсу, у браузеры. Гэта ўсуненне, таму што сама по сабе сепарацыя — глытак. Складанне гібрыдных тэстаў UI з самага пачатку дапамагае ухіліцца ад чыстых тэстаў UI, якія перадаюць стан праз браузер і з’яўляюць мінуты часу. Структура — гэта засоб, а кожная дадатковая абстракцыя прыносіць дапамогу ў ўтрыманні.

Чатыры рашэнні, якія пояснююць рэшта

У рэпазітарыі зафіксавана чотырнацца архітэктурных рашэнняў у файле .claude/rules/architecture.md; кожна з іх адпавядае на пытанне «чаму самэўсёльва так», а не «што гэта». Чатыры з іх павтараюцца тут, адтуды што рэшыннія лепшая застаць у рэпазітарыі, чым пераказваць іх.

Кожны запуск рэгіструе свога сабе корыстніка

Звычная налада — адна тэстовая адзначка, якая выкарыстоўваецца для кожнага тэсту. Гэта працуе пакуль набор тэстаў не стане большым і тэсты не будуць выконваны паралельна. Тады адны тэст спрабоўвае спрактавіць аперацыю, а іншы пераканаецца, чы ў кошыку ёсць прадукт; гэта прыводзіць да невыпаннага тэсту, які з’яўляецца раз у двадца запускаў і ніколі не выклікаецца на самай машыне дэбагера.

Правілле выглядае простаўленым: кожны запуск апрацоўвання мае свой сэндбокс. Гэта не тое ж самае, што обяцанне утрымвацца ад спільных дадзеных чы ад ўпорадкування пасля завершэння. Гэта значыць, што фізычна немае нікаго, з кім можна было б сталкнуцца. У публічнай дэманстрацыі для гэтага выконвае ролю новы корыстнік, зарэўнаваный у global-setup. Корпаратыўная асяроддзе можа перакрыць гэта за дапамогою лімітавання корыстнікаў, спільных ентытэў чы вялікага колькасці задаў на стварэння дадзеных. Прынцып застаецца, а спосаб стварэння сэндбокса — гэта аднае з аднойчых пытанняў.

Той жа логіка дае retries: 0. Перапрытак працуе як супрэсор, а не як страхаванне: ён перакрашвае рэальную сітуацыю з супернагрузкай у зелены колер і перадважае наследкі на той дзень, калі гэта завдае найбольшай шкоды. Тэст, які патрабуе перапрытак, не ўзнікомлівы, але фіксуе адміністратыўную памылку, і такі звёстка заслуговае на расследаванне. Косцы чыста адзначаны: у дэмаверсіі рэўістрацыя карыстальніка выконваецца за адну запытку і завжды успевае, а ў іншых месцах механізм будзе іншым.

Тыпы выходзяць з спецыфікацыі, а тэст контракту перакантролюе спецыфікацыю

Гэта два разныя контралі, якія часта плутаюцца.

  • Першы — гэта контроль у часы кампілявання. API мае дакумент OpenAPI, і з яго генеруюцца тыпы, таму полье, якое апісанае ў кодзе, але не ў спецыфікацыі, заважае праекту кампілявацыі. Гэта займае два секунды і не трэбуе запыткі да сервера.
  • Другі тэсты выявляюць, чырпаваць сервер дасправды адпавядае своім спецыфікацыям. Створаны тып не можа гэта падтвердзіць, адколькі ён можа толькі падтвердзіць адпаведнасць з дакументам. Тэсты на адпаведнасць з контрактом працуюць з рэальным API і поручаюць рэальныя адпаведзіці з схемай. Ужо пад час першага запуску яны знайшлі неадпаведнасць у паце: у дакуменце было зазначана products/{productId}, а ў кодзе — products/{id}. Іншы раз яны паказалі, што фільтр каталогу выклікаў параметр by_category_slug, якога ў спецыфікацыях вовсе няма. Сервер яго прымеў, і тэсты паспелі, таму ўсё „функцыонуе“. Але параметр, які не ўключаны ў контракт, не можа адхіляцца ад яго правілаў. Ён можа толькі таямна знікнуць калі-небудзь.
  • Тэст на адпаведнасць з контрактом таму не ўточняе, чырпаваць канцэнтры працуе. Ён пераканваецца, чырпаваць гэта той канцэнтр, пра які всі дагадаліся.

    Токен, які існуе трыста секундаў

    У звычайнай версіі дызайну спачатку выканана ўваходжанне, пасля чаго токен зберагаецца у файле і кожны працоўнік можа яго прачытаць. Па-першым разам усё было самэ так. Але токен у гэтым API існуе роўна трыста секундаў, што падтверджваецца спецыяльным тэстам па порэванню двух полей у токене; прычаму тэсты выкананыя ў рамках цэлага комплексу трываюць дыяўольска дзяўна. У спадзейшым тэсце токен можа стаць недзейным, і тады будзе атрымана памылка 401, якая выглядае як проблема з правамі, а не як заканчэнне тэрміну дзейнасці, таму адлагоджэнне пачнёцца не там, дзе трэба.

    Таму у файле зберагаюцца толькі абмові, а не токены. Кожны працоўнік трывожы свой токен у памяці і аднаўляе яго рана. З гэтага вынікае наступны вынік: токен павінен завжды запрашывацца там, дзе ён выкарыстоўваецца, і ніколі не копіюваліся ў зменную на пачатку блока. Одна такая лінія знову стварае тую самую проблему, якую прагталі усунуць у дызайне.

    Даныя знімка стану выкалікаюцца адно раз і змінны стан ніколі

    Катэгорыі, маркі і стороніцы продукта не зміняюцца між запускамі. Іх можна запрашаць адно раз пры пачатку і перэдаць тэстам, тады трыдцаць тэстаў не будуць запрашаць той самы спіс. Улюбленыя элементы, кошык і прафіль ніколі не павінны паўхадзіць у такім знімку, таму што самі тэсты іх зміняюць. Выкаліканне знімка зміннага стану не ўскладненне. Яно стварае даны, якія ёсць з затрымкай: тэст чытае тое, што было правдой пяць секунд раней, паспяшае, і хтось шукае баг у прыемнасці, якой яго няма.

    Чыстка таксама паводзіцца па той жа логіцы. Яна выканана па парадку: спачатку ентытэты, а пасля іх власнікі, і ніколі не паспяшае; короткія правыя належнасці выдаюць толькі адзвешчанне. Неудачная чыстка ператварае адзін чырвоны тэст у чырвоны запуск з некорэктным адказам, што ўзятое з усіх найгоршае.

    Слой AI

    Разглядзім, што адзначаецца, калі Claude Code ачынаецца ў папцы праекта і прымае запіт «запісаць тэсты для корзіны». Мадэль мае толькі гэты запіт. Яна не ведае, што спільныя акаунты забраныя, што локейяторы павінны быць з паўнастаўленай карты, або што асэрцыя на глобальным лічыльніку ў паралельнай серыі ёсць пасткай. Яна здагадваецца, і робіць гэта досыць добра, таму код выглядае прыемна і, верагатна, працюе. Большасць людзей зупіняецца на гэтым моменце і называе гэта работай з AI.

    Слой AI перафразуе проблему. Запіт перастае быць тым, што мадэль будзе здагадвацца, і стае тым, што яна павінна ведаць і што яна можа ніколі не зрабіць. Яго складае пяць компанентаў, кожны з якіх мае сваю задачу.

    • CLAUDE.md, які завжды чытаецца. Файл у корні праекту, які чытаецца на пачатку кожнай сесіі. Ён выступае як інструкцыя для новага спавярніка, у гэтым случае модэлі, якая паказваецца на два экрана: што такое праект, дзе знаходзяцца розныя элементы, пяць найважлівейшых пунктав і што абсалютна забараняецца. Слова "завжды" вказывае на ліміт, таму ў кожнай розмове платаецца толькі за файл, які ў тым кантэксце неабходны. У ём уключаецца толькі тое, што неабходна ў кожны раз. Чацвероцца стылю ўключаецца у околічны файл, да якога ён з’яўляецца.
  • правілы/, прычыны, а не заповеды. У этых файлах зберагаюцца рашэнні па архітэктурныя пытанні, стандарты коду і процедуры прыстроек для працы з веб-контэнтам. Заповедзь гаворыць не паднесаць токен у зменную. Правілы пояснююць, што токен жыве трыста секунд, таму той, які паднесены на верх, гіне пад час выканання і спрычынае адмову 401 у наймедленнейшым тэсце. Калі ёсць прычына, модэлю не патрэбны конкрэтныя забораны: ён розумее клас проблемы і выявляе яе ў незнайомых умовах.
  • навыкі/, процедуры з кантролем. Навык — гэта інструкцыя для аднаго завадзя: крокі, апісанне, фразы-трыгеры, назначаны модэль і спіс дазволеных інструментаў. Спіс інструментаў ёсць рэальным лімітам, а не дакументацыяй. Навык, які піша тэстовыя кейсы, не можа выкананыць заповеды, таму ён не можа пачаць выконанне тэстаў проста на всякі случай, як бы ён не быў адданы сваёй задачы.
  • Агенты – адзінны падзеўнік з меньшымі правамі. Іх існаванне падтрымліваецца двумя практычнымі прычынамі. Першая – кантэкст: выкарыстоўванне всіх атрыбутаў стварае тыячы зайвых элементаў, і калі гэты матэрыял патрапляе ў главную частку дыялогу, маркап заменяе сабою обсув пунктавага спіску. Агент працуе у своем сабсконтэксце і вяртае рэзультат, а не сырой матэрыял. Другая прычына – межы. Доследны агент не мае доступу да коду для тэставання, таму рэканайсенг дае толькі дакументацыю, а не сам код як факт. Агент, які пішае тэсты, можа не запускаць ўсю серыю тэстаў, таму напісанне без запуску застаецца сама по сабе.
  • хукі/, які ўскладнююць працэю і не запам’ятваюцца. Правіла у прозаічнай форме дзейнаюць толькі тады, калі хтось іх запам’ятае, таму найболей жорсткія забораны стаюць хукамі: малымі скрыптамі, якія запускаюцца раней за адпаведную дзеяннё і можуць яго заблокаваць. Створаныя тыпы і файлы .env не можна зменіць. Команды git push --force, --no-verify і --amend атоматычна адхоўваныя. Хук не пераканвае і не пояснюе нічога пасля гэтага. Дзеяннё не адбываецца, а ў адпаведным адпаведзе наводзіцца прычына і правільны шлях.
  • Кожна фраза — у аднай лініі: CLAUDE.md — гэта матэрыял для чытання з першага дня для новачка, правіла — стандарты команды, навыкі — інструкцыі па віконанні задач, агенты — стажысты з обмежаным доступам, а хукі — гэта «вораты», якія застаюцца закрытымі.

    Той самы слой на жывым тыкеце

    Абстракцыі стаюць зрозумелымі толькі тады, калі праз яны праходзіць рэальная задача. Возьмемо PROJ-431, «Адзначэнне платы за замовленне карткай». Звычны парадак вядзення работ не мае нічынага з ШЫ: хтось прыменяе гэтую функцыю вручную, хтось пішае чарт-пераказ задач, хтось перакладае яго ў конкрэтныя кейсы, хтось автоматызуе ўсё гэта. Адна людзь можа выконваць усе чатыры задачы, а можа трое людзей раздзеліць іх між сабою. Для працэсу не мае значэння, хто гэта робіць, і гэта ёсць сэрцэвыя ідэя, таму што працэс працюе пад час існуючага алгорытму, а не заменяе яго. Нумар задачы ёсць тыя „ніткі“, якія праходзяць праз усё, і яе вжываюць замест назв функцый чы рамкаў, таму што яна застаецца незменнай нават пасля перэйменавання чы перадзначэння.

    Першы крок: чарт-пераказ задач

    Інжынер з аптэкстыявлення пачынае працу з функцыяй і дае яй номер. Калі MCP з’яўляецца падключаным да Jira, функцыяя можа чытаць тык-тэксты напрэму, включаючы опіс, крэтырыяя прыняцця і, часта самае корыстнае, каментарыя, у якіх распрацоўшчык поясніў палову функцыяналу без зменыя опісу. Калі MCP нямаецца або тык-тэксты порожні, інжынер опісвае функцыяю у запытцы. Практыка патрэбуее інпут і не пакушаецца з’ясавіць, звядзе гэта ўзята.

    Потым пачынаецца этап, для якога ўсё было створана. Адпаведныя навыкі не ствараюць спіса пераканаў на адваротнае з тэксту заявкі. У замест на гэта вызываецца агент для дакладнага аналізу, які заходзіць у прыкладнэ раштунак, у локальную чы або тэставую срэду, адвідуе сторункі функцыі, клацае на елементы, чытае актуальны DOM, самастаяна вызывае API і парабягае адпаведныя адпаведзі з тэхнічнымі спецыфікаціямі. Лячы спіс пераканаў ствараецца толькі пасля гэтага, на адваротнае з тым, што было обяцана ў заявцы, а адпаведна да таго, што насправды існуе. Крэтыярыя прыйнятнасці ёсць вхіднымі данымі, а не аб’ектываючымі правіламі, і палова з іх несувярэннасцяў з рэальнасцю ёсць першымі багамі задання, якія знаходзяцца ўсё раней, чым існуе які-небудзь код.

    Выходзьце два файлы, і найважлівейшым урокам тут яўнае ўтрыманне іх адзін ад другога. Першы — гэта чарткі перагляду: сцэнарыі працы з прапрацоўкамі, апранутыя ў фармаце каманды, а не перагляд элементаў. Чырвоныя рамкі навакол поля не ўважаюцца сцэнарыямі; адмова корыстніку з карточкай іншай адзы і поясненне прычыны ўважаюцца сцэнарыямі. Другі файл — гэта карта функцый, якая містыць паўнастаўленыя месцазнаходжэння, поля API, правілы верыфікацыі і проблемы, знайдзеныя па дорозе. Чарткі перагляду — гэта безпосерэдній рэзультат задання, а карта служыць базай дадзеных для наступных крокаў. Інжынер QA чытае чарткі перагляду, вычырае тое, што непатрэбна, дадае тое, што ведае толькі адзін чалавек, і гэтыя перагляды являюцца контрольным пунктам: нічога не можа працаваць без схвалення.

    Другі крок: тэстовыя кейсы

    Той, хто выконаў першы крок, можа продаваць працу, або інша адзначка, калі ручныя тэсты і автаматызацыя аддзелены. Другая адзначка прыступае да той самой нумерацыі задання і сама шукае спіс пераконтрацоў і карту. Інжынер выбірае, што трэба пераконтрацаваць — усё або толькі тое, што было даговорана. Штоўка ператварае гэтыя пункты на кейсы і рашае адну прыбліжнасць за кожны кейс: які шар належыць пераконтрацыі.

    • Правілы, якія выкананы серверам, стаюць тэстамі API.
    • Тое, што бачыць корыстнік, стае тэстамі UI.
    • Пераконтрацыя, якой для аднай прыбліжнасці трэба п’ятнацаць клацанняў пад час налагоджэння, стае гібрыдной, пры чым стан ствараецца праз API, а толькі відразлівая частка пераконтрацаваецца вачамі.

    Памылкі тут коштаюць дорожэ, чым паслаба прадстаўленыя кейсы, таму што яны ствараюць медленную, перакрытую адпаведнасць, якую ніхто пазней не наважваецца выдаліць. Гэтыя навыкі таксама дадаюць раздзіл з абслугою для кожнага кейса: даны, якія трэба вікорыстоўваць, месцападзелы, што павінна быць унікальным, што павінна быць вычышана і пад якым рахункам. Для чалавека гэта выглядае як паперовая праца. Для наступнага крока гэта ўжо готовыя спецыфікацыі. Інжынер пераглядае і затварае ўсё, што ёсць другым контрольным пунктам. Команды на Qase або TestRail могу дадаць тут навык, які завантажае затвараныя кейсы праз API і пазней пазначае іх як автаматызаваныя.

    Трэці крок: автаматызацыя

    Автаматызацыйны спэкт таксама берае номер задання і запрашоўвае спіс перакананняў, прыклады і саму карту. Яго першы крок ўсёх здзівляе: ён пераканваецца, насколькі свежая ўсё ўсё-такі карта. Кожны раздзіл мае дату пераканання, а тое, што старэй за месц, перастае лічыцца фактам і стае толькі тверджэннем. Спэкт нічога не адмовляе і нічаму не верыць слепа. Ён перакладае застарэлыя часткі ў раздзіл рызыкаў плану і перакладае рашэнне на чалавека — чы то паўтарыць разведку, чы то прыміць рызык. Застарэлы локатор усё рава будзе прадстаўлены, але праз тры крокі як таймаут, прычына якога застаецца нез’ясованай.

    Далей выкладываецца план: якія файлы будуць вікорыстаны, якія даныя застаюцься в кожным тэсце, што ствараецца перад запускам і што выкарыстоўваецца пасля яго, якія сторанкі і методы кліента дадаюцца, і якія запытанні застаюцца нерашанымі. План ёсць трэцім і найважлівейшым этапам, таму што ён вяршыць, чы можна без апасцярожнасці запускаць пакетныя тэсты паралельна, а яго змены пасля гэтага ёсць даскладнымі.

    Пасля затверджэння план пераходзіць да агента, які пішае код, пры чым яго галоўная характэрыстыка — гэта тое, што ён не выдумвае локейтары. Калі на карце не ёсць неабходны локейтар, ён ні не спробуе знайсці сэродні, ні не будзе мінуць тэст, ўтаіваючы гэты прынт. У кодзе ён залічыць прыметку, што локейтар не быў перакананы, і адзвярнёць на гэта ўвагу. Тэст все рава будзе напісаны і не працюе, што ўсё правільна, таму што проблема застаецца відной і не знікае.

    Тое, што раней было окрэмымі запаведамі, цяпер знаходзіцца ў рамках гэтага крока: запуск, чытанне памылкі, вылечэнне. Кожны тэст мае два спробы, пасля чаго агент зупініцца і прызнае поражэнне. Одны парадны запуск пераканальвае логіку, а два паралельныя — пераканальваюць ізоляцыю. Не трэба додатковых кнопак, адколі нічога з гэтага не вымагае рашэння чалавека. Цэта процедура зафіксаваная ў правілах.

    Забораныя правілы тут ёсць абсалютнымі і не падлягаюць дыскусіі:

    • Не выключайце неудачны тэст, каб запуск стаў «зеленым».
    • Не збільшайце колькасць спроб.
    • Не слабяйце тэст таямніча, каб ён паспадзяраваў спостэрагванае паведанне.

    Калі прыкладнэе програма паводзіцца некорэктна, правым рэзультатам ёсць «чырвоны» тэст.

    Чэтырыцьці крок: анаіз і затверджэнне

    Адзінктура і зберэжэнне належаць да двух разных навыкаў, а не да аднаго; гэта свядомая разліка, каліжо шаг, які пачынаецца з намеру зберагчы код, гэройшы лепш сустрэчае прычыны, чаму гэтага не робіць. Адзінктура мае спецыфічныя для праекту знанні, якіх няма у звычайных адзінкуравачоў: што тут значыць спяльнае цэлэ, што ставіць пад апасоň токен у верхней часты блока, чаму абманлівае адзначэнне значэння глобальнага лічыльніка. Кожны пункт у гэтым спіску выйшаў з практычных прыкладаў нарушэнняў гэтага набора правіл. Ёнколі бы разліка не стала толькі формальнасцю, адзінктура ставіць «пятэнак» дыферэнцыі, яю пераглядала, а зберэжэнне адмовляецца працаваць, якшчы дыферэнцыя з таго часу змянілася. Гэта не замак. Гэта запытанне з точным адказам: чыі код быў адзінктураваны, чы ўсё-такі іншы код? Разліка межа процэсам і прычынкам сяліцца самэль тут.

    Калі весь ланцюг завершыўся, PROJ-431 мае ў сабе всю інфармацыю: што было даследжана, што было выбрана для пераканання, што практыкуецца за дапамою аўтаматызацыі, што застаецца ручным і што не будзе аўтаматызавана, а таксама прычыны. Прычына не ў любові да документацыі. Чыры разы пазней пад час аналізу сітуацыі хтось запытаецца, чаму той чы іншы сценарый не практыкуецца, і трэба, каб існавала адпаведная адпаведзь.

    Што застаецца пасля завершэння задачы

    Галоўныя рызыкі такой структуры — не паспелы код, а тое, што чыры разы пазней кантэкст ператвараецца на хаос, і ніхто не ведае, якому файлу даваць прыорытэт. Таму кожны элемент мае трохі разны тымп жыцця, і ўжо забраняецца ўжываць іх разам.

    • Правілы застаюцца у сіле настолькі, насколькі і праект, і зміняюцца толькі разам з кодам.
    • Карта фічаў застаецца у чыннасці гадамі і належыць да самай фічы, а не да заявкі. Яе паўнаважнаюць датаваныя роздзелы, новыя сторанкі і новыя проблемы, і яе ніколі не перабудовваюць па кожнай задачы.
    • Спісы пераканаў, кейсы і планы належыць да адной задачы і стаюць частынай історыі, калі тая задача завершаецца.

    Без такога раздзелення чырвоў годзіну пазней карта-локатары існуе ў дзесяці копіях, распакаваных па номерах задач, пры чым палова з іх некарэктныя, і няма можлівасці з’ясаваць, калькі з іх. Калі карта аднаго з элементаў расшырваецца, як і карты большых элементаў, спосаб рашэння падобны да таго, які вікорыстоўваецца для коду: трэба разлучыць яе на часткі па прыродных межах, такіх як стораніца, падэлемент або сцэнарый, і стварыць короткі індэкс, які паказвае, што знаходзіцца дзе. Таксама дыяўчы правілы: у карту можна дагружаць толькі перакананыя факты, тыя, якія агент фактычна бачыў у рэальным прыемніку, з датай. Здагадкі і пераказы з тыкетаў тут не паслужаюць. Карта, якая іх прыме, ёсць некальканосным матэрыялам у рамках спрынта, а пасля факты нельга разлучыць ад здагадак.

    Нічыя з гэтых спосабаў не ўсюды падходзяць. Чатыры крокі ў працэсе апрацоўкі, пяць элементаў шара AI, вораты і трымкі артэфактов — гэта адна з можлівых структураў. Колькісны склад каманд, продукты і інструменты разныя, таму палова дэтаў будзе розніцяцца. Дзеяныя спосабы будуць эфектывныя, іншыя будзуць трэба адладзіць, а ўсё інша не будзе працаваць, і гэта ўзяцца за звычай.

    Але галоўная ідэя застаецца незменнай. Правільна створыце шар AI, каб модэль прыменяла правіла каманды ў межах яе працы, выкарыстоўваючы артэфакты каманды, а рутынная работа залішалася за самай камандай: чытанне заявок, напісанне падобных кейсаў, выбіранне шароў, пошук месца распалоху, паўтарная запуск і вылечэнне несправаў, перагляд тых сабоўых памылак усё разы. Інжынеры QA не заменяюцца, а існуючы працэс не анулюецца. Час проста перастае вітрачацца на тое, што можна перадаць іншым.

    Чы роўна ўсё ж такі потрэбны старшыя спецыялісты?

    Патронатныя інжынеры зараз патрабуецца больш, чым будзь-колі, пры чым змянілася ўласна ў ўсіх аспектах. Дэвід Хайнемейер Ханссон зазначыў, што найэфектывэйшая прышвартованасць за дапамогою агента, якую ён бачыў, выйшла ад самых патронатных спецыялістаў — тых, хто можа ацэніць, чыі рэзультат працы агента падходзіць для вжытку.

    Раней інжынеры ценіліся за напісанне коду, знаўства сынтаксісу і шыранне задач быстра, што мела сэнс, калі код быў галоўным продуктам. З’явіўшыся штучныя інтэлекты, гэтае значэнне змінілася на значна большую велічыну, а не на калькіляваныя відсоткі. Машына пішае код, а чалавек вяршыць, што пісаць, чаму, у якіх межах і як пераканацца, што рэзультат не ўводзіць у глухы кут.

    Уявіце двух спецыялістаў. Першы ачынае Claude Code і просіць напісаць тэст на входжанне. Ён яго напісвае, тэст праходзіць, і спецыяліст адчувае ся продуктыўны, што сьпадзяе і сёньні. Чэрэз месяц тэст перастае працаваць, прычына застаецца загадкай, патчы вносяцца аднойчынна, пакалі токены згораюць, і востатком усё перапісваецца або тэст выдаліваецца і забываецца.

    Другі спецыяліст спачатку праектуе: як ізолюваць тэсты, які шаблон следуе кліент API, як кераваць токенамі і што вадзіцца з станамі, якія зміняюцца між тэстамі. Ляч тады толькі наказ даецца модэлю: напісаць тэст на входжанне па гэтыях правілах.

    У першам выкананы тэсты, якія зараз працуюць. У другам — сістэма, якая продовжвае працаваць, таму што яна стоіць на архітэктурэ, а не на ўдачы. На малай колькасці тэстаў разліка нема, за выключэнням таго, што першы завершае дзесяць чы пятнаццаць тэстаў за дзесяць хвілін, тады як другі для фундаменту патрэбуе два гады чы больш. Пасля ста, двухсот чы тысячы тэстаў і пяцідзесят чы ста запускаў пайплайна разлік стае явным.

    Чы гэта значыць, што неабходна выучыць мову програмавання?

    Так, але не для напісання коду. Патрэбна мова, каб разумець, што створыла штучны інтэлект, каб знайсці памылкі ў створаным кодзе, каб пераглянуць запросы прыўязкі і адначасова вырашыць, што патрапіць у галоўную гілку. Сынтаксіс — гэта інструмент. Складная структура, заснованая на памяці, недоступна для тэставальніка ў незнайомай сферэ, але архітэктура — гэта вядомая тэрыторыя: як павінен выглядаць сістэма, як тэсты залішаюцца ізольаванымі, як організаваныя пайплайны і што мае містыцься ў хорашым звіце. Самэ гэтае падстава зробіла можлівым праект Playwright.

    Архітэктура не выходзіць з простага запіту. Штучны інтэлект можа яе запропанаваць, інодзе добра, але архітэктура — гэта выбор сярод адпаведных варыянтаў, а не проста адпаведны варыянт. Мадэль працоўна прыносіць пяць варыянтаў, якія ўсе выглядаюць разумнымі. Кой з іх падойдзе за шасць месцаў, пасля дзесяці разоў большых тэстаў і змяненых трэбаванняў, — гэта не тое, што можна проста стварыць. Гэта выходзіць з адпаведнага дазвяжэння, з дасвядчэння, атрыманага падчас вылечвання проблем з тэстамі, выяснення прычын, чаму тэст праходзіць локальна, але не праходзіць у серэдовышчы CI, а таксама выявлення таго, што спільны акаунт ёсць схованым элементам, які можа вызваць крызу.

    Компаніі не патрэбны людзі, які толькі нажымаюць кантакты і пішуць запіты ў Claude Code чыста Cursor. Такіх людзей многа, і ўсё будзе ўсё больш, а рынак заполненыя кодавальнікамі, якія думаюць, што знайшлі скарб, але гэта трывае толькі кароткае час. Патрэбныя людзі, якія розумеюць, чаму ШЫ зрабіла ўсё так, як зрабіла, бачаць, калі ёё рашэння некорэктнае, сформулюваць задачы так, каб мадэль даўала рабоча рашэння, а не проста відшліфаваную памылку, і ствараць сістэму замест таго, каб постаўляць токены ў бесканцовыя цыклы „спробуй зноў, не так“.

    Апаратная і програмна праца, а таксія працы ў паўтоку — гэта не проста архіўны матэрыял. Гэта аднойчына падстава для кваліфікаванай працы з ШЫ і тое, што адзначае таго, хто стварае хаос, ад таго, хто стварае сістэму. Раней знанні служылі для выканання задач вручную. Цяпер яны служылі для задавання задач ШЫ і пераканання ў рэзультатах. Ролі змяніліся, але цэннасць экспертызы засталася тая ж. Гэта легвае зрозумець, адтуды, што палягаючы на ШЫ, стае ясна, хто проста генеруе, а хто розумее, што было створана і чаму.

    Што паказвае эксперымент

    Была створана парадыгма на мове, якой яе создатар не ведае, і гэта не історыя пра геніяльнасць. Гэта історыя пра тое, каб не намагацца здагадвацца, што зробіць штучны інтэлект, а замест таго прыдзяліць часу, каб поясніць правіла гры: што дазволена, што — ні, і чаму самэўсёліва так, а не інакш. Гэта нудна, гэта не мае нічынага з атмасферай, і прыходзіць час, пры яком прадзейсцвуе першы рэзультат. Самэ гэта і работае.

    Рэпазітарый не доказвае, што інжынеры сталі занятымі або што мовы больш не маюць значэння. Гэта жывы тэст таго, як змінюецца роль інжынера, калі значэнне пераходзіць з напісання коду на формулюванне задач, праектаванне сістэм і перакананне рэзультатаў. Напісанне коду вручную застаецца навыкам. Да яго прыўёўся другі навык, які таксама падтвердзіў сваю важнасць: розумеўце таго, што было створана, чаму, і што будзе далей.

    Штучный інтэлект не заменяе інжынера. Ён стае найшырэйшым і найболей паслухным «младшым спавнікам», які толькі можна сабраць: не вярожы, ніколі не спарчуецца і завжды гатовы да новай спробы. У ёнага ёсць адна особлівасць: ён прыносіць як правільны рашэнні, так і абсалютную нясэрйознасць з аднаковым адказом, і толькі той, хто розумее задачу, можа іх адзін ад другога адразніць. Таму інжынер павінен застацца тым, хто керуе, тым, хто знае парадакс і шлях, а не проста тым, хто трымае календар.

    Супаўязаныя матэрыялы

  • Inжынерыя ціклоў: чатыры вярнутыя ціклы для самапраўцоўных агентаў AI — Як чатыры вярнутыя контрольныя ціклы (ReAct, retry, queue, hill climbing) плюс суддзя, метраж бюджэту і перакананне ў недаступнасці змян робяць агента надзеяным, паказана на прыкладзе атрыбутавання страховых полісаў.