Скорачванне Jest выконваецца локальна і ў CI: Workers, Caching і Scope
Практычны спіс пераконтраў для шырэйшага працавання з Jest: спачатку вимеры, налаштовванне працоўнікаў, скорачэння глобальных налаштавань, паўторны выкарыстоўванне кэшу, параметр isolatedModules і запуск толькі тых тэстаў, якія падвергліся змянам.
Павольны комплект тэстаў тыха зміняе спосаб працы команды: людзі запускаюць тэсты рэдкей, падаюць код у CI, каб дазнацца рэзультат, і чакаюць як najдольш, самэ тады, калі могуць гэтага меньш дазволіцца — пад час выправлення проблем у рэальным сервісе. Гэтыя затраты вырастаюць, калі дапаможнікі для кодавання на базе AI шырока генеруюць змяны, а комплект тэстаў стае галоўным захамленнем. Jest прыносіць многа параметраў налаштавання і разумныя стандартныя значэнні, таму працаванне без дадатковых налаштаванняй зазвычай ўсё гаразд, але калькі налаштаванняя могу значна скорачыць час запуску як на ноутбуке, так і ў CI. Ніякі з гэтых методаў не є экзотычным; разам яны ствараюць корыстны список пераконтраўкі.
Змяркуйце прычыны перш чым налаштаваць
Кожная змяна мае свою цену або компроміс, таму пачніце з цифраў. Змерыце час запуску всіх тэстаў без кешу (jest --no-cache), каб атрымаць базовы показнік, а потым прыкладзіце адну змяну за раз і знова змерыце.
Настроюйце паралелізм па можлівасцям апарату
Як правілу, Jest запускае файлы тэстаў паралельна за дапамогою працоўных процэсаў, што зазвычай є хорашаю практыкой, але не завжды оптимальна. Два флагі кантролююць гэта:
--runInBandзапускае всі тэсты серіяльна ў чынным працоўным процэсе без додатковых працоўнікаў. Гэта можа быць шырэй для проектаў сярвера, чыя тэсты выкарыстоўваюць дорогі ресурс, або на працоўніках CI з вельмі малым коллекшам ядоў, дзе стварэнне працоўнікаў коштае больш, чым зарабляе.--maxWorkersзадае колькісць працоўнікаў, якія запускае Jest. Ён можа прыймаць цэлычную колькісць або процантаж доступных ядоў;50%— граматычна правільны пачатковы значэння, якое залишае прастор для решты апаратуры.
Правильнае значэння залежыць ад апаратуры, таму трэба пераканацца ў яго локальна і на працоўніках CI окрема. Апаратырэй працоўнікаѳ CI часта паказвае больш ядоў, чым ён можа фактычна выкарыстоўваць пад навантажэнням, і ўзбільшэнне колькасці працоўнікаў робіць тэсты медленней, а не шырэй.
Зберагачыце глобальную настройку простай
Файл глобальных наяўнасцей ёсць практычным у большых кодавых базах: можна зарэўістраць мокі, паліфілы і інструменты для тэстав аднойчы, і кожны тэст ўжо будзе іх мець. Але проблема тая, што кожны файл з тэстамі платіць за ўсё гэта, включаючы файлы, якім гэта не патрэбна. Масівныя імпорты, настройкі базы дадзеных або вялікія реестры мокав у setupFilesAfterEnv можу ператворыць інакш час адпаведзення ў мілісекундах у сповольнелыя тэсты.
Пераместіце дорогія настройкі ближэй да тых тэстаў, якім яны патрэбны: дапаможнік, імпортаваны явна, beforeAll у адпаведным файле, або окольны проект Jest з сае настройкай для інтеграцыйных тэстаў.
Павтарна выкарыстоўвайце кэш
Другі запускі зазвычай ведуцься быстрэй за першыя, таму што Jest кешуе працаваныя файлы і іншую метаданы. Гэта найбольш помітна ў режыме стазірання, але CI таксама выгадвае, якщо кеш застаёцца між заданнямі. Наставьте cacheDirectory на стабільны шлях і зберагаюце яго за дапамою функцыі кешавання вашай системы CI, выкарыстоўваючы ключ з файлу блокіравання і настройкі Jest, так кожны пайплайн не будзе запускацца з нуля.
Іспользаванне режыму стазірання локальна
Для локальной роботы jest --watch — гэта найкращы цікл зворачнай вясковы ўпэўненасці, які пропонуе Jest. Ён перзапускае толькі тыя тэсты, якія стосуюцца змененых файлоў, а його інтэрактыўны запрос дазволяе фільтраваць па імені файлу або шаблону імені тэста. Ён не прызначаны для CI: пайплайну трэба адны запуск, які завершаецца кодам статусу, таму режым стазірання трэба застаўляць на машынах разработчыкаў.
Увёліканне isolatedModules для TypeScript
Калі тэсты на TypeScript працуюць за дапамою ts-jest, абсалютная перацэнка типоў кожнага файла стварае значны надтэртак. Актывацыя параметра isolatedModules дазволяе трансфармеру компіляваць кожны файл окрема, без інфармацыі пра типы з рэшты программы. Команды паведамляюць пра явныя прышвартуненні часу выконання у проектах на Angular, і вы тым самым втрачаеце мінімум безпекі, як толькі tsc --noEmit або ваш рэдагар усё ўсё перацэнюе кодбазу. Тое, дзе саме знаходзіцца гэты параметр, залежыць ад версіі вашага ts-jest, таму пераканайцеся ў яго актуальной даследчой документацыі.
Тэставайце толькі тое, на шта вплывае змяна
Няма прычыны запускать весь набор тэстаў з-за змяны, якая паўтараецца толькі ў аднам пакете. Сам Jest можа скарасіць запуск за дапамогою параметраў --onlyChanged або --changedSince=<branch>, які выкарыстоўваюць систему кантролю версій, каб знайсці супаўзелыя тэсты. У монорепозітарыі системы будовы, такія як Nx, ідуць даўжэй, разумеючы структуру проекта і запускаючы тэсты толькі для тых проектаў, якія падвергліся вплыву текущай змены.
Зберагаце прынеймна адны цэлы запуск где-небудзь, напрыклад на галоўной гілцы або ў вечарніх версіях, каб з’явіцца можласць выявіць тое, што праўдзібнасць залежнасцяў працягнула бы празахаваць.
Разглянуце Vitest
Vitest ў вялікай меры сумесны з API Jest, актыва падтрымваны і працюе з распашчытымі фрэймворкамі JavaScript, уключаючы Nuxt. Для проектаў, якія вже створены на Vite, гэты выбар часта ёсць найболей логічным, а багато командаў спачатку выбіраюцы яго для новых проектаў. Большасць вышэйзгаданых прадактав — замеры, ліміты працоўнікаў, простая настройка і запуск толькі неабходных тэстаў — таксама паслужыць для Vitest. Якщо вы расследжуеце можлівасць абыякова падменіць сторонній запускач тэстаў, адзірніце замену Jest на натыўны запускач тэстаў Node.
Калі настройкі вымушаныя заканчыцца
У канечнай лініі жадныя змены конфігурацыі не зможаюць пераканаць быстрэйшы апарат. Новейшы ноутбук або большы, самастойны запускач CI можа стаць найдешавшым спосабам падтрымкі, калі сама суцэль тэстаў вже ў хорашым стане.
Ключовыя выводы
- Створыце базовую пазліну без кэшаў і зменяйце адна раштунку за раз.
- Спакавайце значэння
--maxWorkersабо--runInBandз рэальнымі можлівасцямі кожнай среды. - Выканаюце даскладныя настройкі не ў глобальных хукі, а ў тэстах, якія іх патрабуюць.
- Зберагаюце кэш Jest праз усі запускі CI; режым watch выкалікваюце толькі локальна.
- Дазвольце
isolatedModulesпрыхіліцца да пераканалковага адзначэння типоў, тады канкрэтны крокtscбудзе старацца прытрымвацься правільных типоў. - На фічарных галузях выканаюце толькі адпаведныя тэсты, а на галузі main — весь комплект тэстаў.