Jest 28: Blir lettere og forbedret kompatibilitet 🫶
This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →
Endelig er Jest 28 her, og den kommer med lenge etterspurte funksjoner som støtte for sharding av testkjøringer på tvers av flere maskiner, pakke-exports og muligheten til å tilpasse oppførselen til falske timere. Dette er bare noen personlige høydepunkter, og vi vil utforske flere i dette blogginnlegget.
I tillegg, som annonsert i Jest 27-blogginnlegget i fjor, har vi fjernet noen pakker som ikke lenger brukes som standard fra standardinstallasjonen. Resultatet er at installasjonsstørrelsen har redusert med omtrent en tredjedel.
Brytende endringer
Listen over brytende endringer er lang (og kan sees i sin helhet i endringsloggen), men for migreringsformål har vi også skrevet en guide du kan følge. Forhåpentligvis gjør dette oppgraderingen så sømløs som mulig!
De viktigste brytende endringene som kan påvirke migreringen din er fjerning av støtte for Node 10 og 15 (men ikke Node 12, som blir EOL om noen dager) sammen med noen omdøpte konfigurasjonsvalg.
Merk at begge fjernede moduler (jest-environment-jsdom og jest-jasmine2) fortsatt vedlikeholdes og testes på samme måte, så den eneste brytende endringen er at du nå må installere dem eksplisitt.
Guiden bør gjøre migreringen enkel, men merk at hvis du bruker noen av pakkene Jest består av direkte (som jest-worker eller pretty-format) i stedet for bare å kjøre jest, må du gå gjennom endringsloggen for å se eventuelle brytende endringer.
Funksjoner
La oss nå snakke om de nye funksjonene i Jest 28 - det som virkelig er spennende! Og det er ganske mange, så fest setebeltet.
Sharding av testkjøringer
Jest inkluderer nå et nytt --shard CLI-alternativ, bidratt av Mario Nebl. Det lar deg kjøre deler av testene dine på forskjellige maskiner, og har vært en av Jests lengst ventede funksjonsforespørsler.
Jests egen testsuite på CI gikk fra ca. 10 minutter til 3 på Ubuntu, og på Windows fra 20 minutter til 7.
package.json exports
Jest leverte minimal støtte for exports i 27.3. Den støttet imidlertid kun hovedinngangspunktet (.), og bare hvis package.json ikke hadde noe main-felt. Med Jest 28 leverer vi endelig full støtte!
Relatert til dette: I Jest 27 tilbød vi enten require- eller import-betingelsen. I Jest 28 vil jest-environment-node nå automatisk tilby node og node-addons-betingelsene, mens jest-environment-jsdom vil tilby browser-betingelsen.
Dette har vært et av Jests største kompatibilitetsproblemer, og forhåpentligvis er det nå løst en gang for alle.
Falske timere
Jest 26 introduserte "moderne" falske timere som bruker @sinonjs/fake-timers under panseret, og Jest 27 gjorde dette til standard. I Jest 28 gjør vi nå mer av den underliggende implementasjonen tilgjengelig gjennom både konfigurasjons- og kjøretids-APIer. En stor takk til Tom Mrazauskas som bidro med denne funksjonen!
Dette lar deg unngå å mocke process.nextTick, noe som forbedrer kompatibiliteten med falske Promise-objekter, eller å aktivere advanceTimers som automatisk forfremmer timere.
Se konfigurasjonen for fakeTimers for detaljer.
GitHub Actions-rapporterer
Jest leverer nå en rapporterer spesielt for GitHub Actions, som bruker annotasjoner for å vise testfeil direkte i koden.

Du kan aktivere denne rapportereren ved å bruke github-actions i reporters-konfigurasjonsvalget.
Stor takk til Bernie Reiter og andre bidragsytere for å ha stått på og fått denne funksjonaliteten på plass.
Inline testEnvironmentOptions
Du kan nå sende testEnvironmentOptions direkte i en fil, på samme måte som du setter testmiljø. Dette er nyttig hvis du f.eks. vil endre URL-en i en enkelt fil.
/**
* @jest-environment jsdom
* @jest-environment-options {"url": "https://jestjs.io/"}
*/
test('use jsdom and set the URL in this test file', () => {
expect(window.location.href).toBe('https://jestjs.io/');
});
Alle globale Node.js-objekter
Hvis du bruker den nye fetch-implementasjonen i Node v18, har du kanskje lagt merke til at denne funksjonen ikke er tilgjengelig i Jest. Dette har vært et vedvarende problem der vi måtte kopiere globale variabler manuelt til testglobals. Med Jest 28 er dette ikke lenger et problem, da vi nå inspiserer det globale miljøet som Jest selv kjører i, og kopierer manglende globale variabler til testmiljøet.
ECMAScript-moduler
Lite har endret seg i Jests støtte for native ESM siden Jest 27 kom ut. Vi fortsetter å være blokkert av stabilisering i Node, og håper situasjonen forbedres før heller enn senere!
Vi har imidlertid klart å legge til noen nye funksjoner i Jest 28.
data:-URL-er
Tommaso Bossi har bidratt med støtte for data-URL-er, som lar deg definere JavaScript direkte uten å bruke eval.
import.meta.jest
Selv om du har kunnet få tilgang til jest via import {jest} from '@jest/globals' i Jest, har vi fått tilbakemeldinger om at dette er mindre ergonomisk enn den (tilsynelatende, men ikke egentlig) globale jest-variabelen tilgjengelig i CJS. Derfor leverer Jest 28 import.meta.jest for enklere tilgang.
Diverse
Det er ganske mange funksjoner, og dette er mine personlige høydepunkter. Men vi har fortsatt flere som jeg skal gå raskt gjennom:
Asynkrone resolvere
Ian VanSchooten har bidratt med støtte for asynkrone resolvere, som muliggjør bedre integrasjoner med verktøy som Vite.
Asynkrone oppsettfiler
Hvis du har asynkront arbeid du ønsker å utføre når du bruker setupFiles, kan du nå eksportere en async function som Jest vil kalle og vente på før den laster tester.
Merk at denne funksjonen kun er tilgjengelig for CJS. For ESM anbefaler vi å bruke toppnivå-await i stedet.
Bruke globalThis
Internt har Jest brukt global for å referere til det globale miljøet. Men siden dette kun finnes i Node, og ikke i nettlesere (window), førte dette til inkompatibilitet ved forsøk på å bruke Jest-moduler i andre miljøer.
Jest 28 bruker nå globalThis i stedet, som fungerer i alle miljøer.
JSDOM 19
Selv om Jest, som nevnt, ikke lenger leverer jest-environment-jsdom i standardinstallasjonen, blir den fortsatt aktivt vedlikeholdt. Som en del av dette har Jest 28 oppgradert fra jsdom@16 til jsdom@19.
TypeScript
Hvis du bruker Jest med TypeScript, enten i testene dine eller når du skriver plugins som egendefinerte kjøringsverktøy, kommer Jest 28 med omfattende forbedringer av typene våre. Her er en ikke-uttømmende liste over endringene i Jest 28.
expect
Når du bruker expect sine egne typer (enten direkte eller via import {expect} from '@jest/globals'), er det nå endelig mulig å legge til egendefinerte matchere. Se vårt eksempel for hvordan du gjør dette.
Egendefinerte plugins
Hvis du skriver egendefinerte kjøringsverktøy, testrapporteringsverktøy, resolvere eller lignende, eksporterer vi nå flere typer som kan hjelpe deg med å typetjekke disse mer korrekt. Dette er et løpende mål, så hvis du er forfatter av noe pluggbart i Jest og typene ikke er så nyttige som de kunne vært, vennligst opprett en sak!
jest-runner-tsd
jest-runner-tsd er et egendefinert kjøringsverktøy for å kjøre typetester. Dette er det Jest selv bruker for å teste typene våre, og vi håper det også kan brukes av andre! Som navnet antyder, er det basert på tsd, men under panseret bruker det forgreiningen tsd-lite.
Alle disse forbedringene og fiksene har blitt bidratt av Tom Mrazauskas. Tusen takk, Tom! 👏
Til slutt er nå minimumsversjonen for TypeScript-støtte 4.3.
jest-light-runner
Det siste vi ønsker å fremheve i dette blogginnlegget, er et veldig kult nytt Jest-kjøringsverktøy skapt av Nicolò Ribaudo kalt jest-light-runner. Dette tar nesten alt av utvikleropplevelsen Jest er kjent for, og akselererer den betydelig ved å være et tynnere lag på toppen av Node. Babel sine tester ble nesten dobbelt så raske etter migrering. Selv om det finnes begrensninger, bør eksistensen av dette kjøringsverktøyet gjøre det enda enklere for de som har mindre Node-moduler å teste å velge Jest. Takk, Nicolò!
Fremtidsplaner
Mens Jest 28 kom nesten et år etter Jest 27, vil Jest 29 komme tidligere, sannsynligvis om bare noen måneder. Den nåværende planen er da å kun ha én brytende endring (bortsett fra å fjerne støtte for Node-versjoner), og det er å sette snapshotFormat standard til {escapeString: false, printBasicPrototype: false}. Dette gjør øyeblikksbilder både mer lesbare og mer kopieringsvennlige.
Dette vil selvfølgelig kunne overstyres hvis du ikke ønsker å endre, men du kan også bruke disse innstillingene allerede i dag hvis du ikke vil vente!
Takknemlighet
Jest 28 har mottatt bidrag fra over 60 personer, hvorav over to tredjedeler bidro for første gang. Tusen takk til alle bidragsytere, både nye og gamle. Uten dere ville ikke prosjektet vært på langt nær så bra som det er! Jeg vil spesielt takke Tom Mrazauskas og Feng Yu for alle deres bidrag, fra kode til saksbehandling og feilsøking, som har gjort Jest 28 til det den er. Tusen takk! 🙏
Takk for at du leste, og lykke til med testingen! 🃏
