Jest 26: Tick-Tock
This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →
Da vi startet gjenoppbyggingen av Jest for fem år siden, var målet vårt å levere en testkjøring med alt inkludert og null konfigurasjon som er tilgjengelig for nybegynnere, utvidbar for nesten alle testbruksområder og skalerbar til store prosjekter. En av de avgjørende utgivelsene var Jest 15 som bandt alt sammen og leverte gode standardinnstillinger som gjorde at brukere ofte kunne kjøre Jest uten oppsett. Denne tilnærmingen har imidlertid en stor ulempe: Jest installerer mange avhengigheter i prosjektene dine som du kanskje ikke trenger.
Vi begynner nå å adressere denne mangelen og jobber med å redusere installasjonsstørrelsen til Jest samtidig som vi beholder den tilgjengelig og utvidbar. Vi har gjort følgende brytende endringer i Jest 26:
-
[expect, jest-mock, pretty-format]FjernerES5-byggfiler med nytt minimumskrav om støtte for ES2015 (Node 8) som kun ble brukt i nettleserbygg (#9945)Migrering: Med denne endringen flytter vi ansvaret for å pakke de berørte pakkene over på brukerne, i stedet for at Jest leverer dem ferdige, siden de kjenner sine målmiljøer best. Hvis du ønsker dette tilbake, er vi åpne for å levere disse som separate pakker. PR-er velkomne!
-
[jest-config, jest-resolve]Fjerner støtte forbrowser-feltet (#9943)Migrering: Installer
browser-resolve-modulen og bruk følgende konfigurasjon:{
"jest": {
"resolver": "<rootDir>/resolver.js"
}
}// resolver.js
const browserResolve = require('browser-resolve');
module.exports = browserResolve.sync; -
TypeScript-definisjoner krever minst TypeScript v3.8 (#9823)
Med disse endringene er Jest 26 nå 4 MiB mindre enn Jest 25.5.4 (53 → 49 MiB). Husk at mange avhengigheter som Babel sannsynligvis allerede er en del av prosjektet ditt. Jests egen størrelse ble redusert med 1,2 MiB (4,3 → 3,1 MiB).
Selv om dette er en god start, er det ikke nok til å gjøre Jest betydelig slankere. Vi planlegger å gradvis redusere Jests og dens avhengighetstrestørrelse med opptil 70%. De fleste endringene for å redusere Jests standardoppsett vil være små brytende endringer, og vi ønsker å ta fellesskapet med oss så mye som mulig. Derfor vil vi gjennomføre følgende endringer i Jest 27 og Jest 28 ved hjelp av en «Tick-Tock»-utgivelsesprosess:
-
Jest 27 vil leveres med en ny testkjøring «
jest-circus» og Node.js-miljøet som standard.jest-jasmine2ogjest-environment-jsdomvil fortsatt være inkludert, slik at brukere kan fortsette å bruke dem ved å endre én linje i konfigurasjonen. -
Jest 28 vil fjerne
jest-jasmine2ogjest-environment-jsdomfra standarddistribusjonen av Jest. Pakkene vil fortsatt bli aktivt vedlikeholdt som en del av Jest-prosjektet og publiseres separat. Brukere må installere disse pakkene for å bruke dem.
Ved oppgradering til disse hovedutgivelsene vil Jest veilede deg gjennom nødvendige endringer. Hvis du ønsker å komme i forkant og migrere til de nye standardene nå, og prosjektet ditt ikke krever et DOM-miljø, kan du oppgradere til Jest 26 og legge til følgende konfigurasjonsalternativer:
{
"jest": {
"testEnvironment": "node",
"testRunner": "jest-circus/runner"
}
}
Jest vil fortsette å levere babel-jest aktivert som standard. Den støtter for tiden flere Jest-funksjoner utover å kompilere moderne JavaScript-syntaks til noe som forstås av nåværende versjoner av Node.js og nettlesere: Den støtter også Jest's kodedekning og mocking av ES-moduler. Jest leveres nå med eksperimentell støtte for V8-dekning og nativen støtte for ES Modules (mer om dette nedenfor!). Det er ikke mulig å mocke statiske ES-moduler i henhold til spesifikasjonen uten å transformere koden først, så vi vil oppmuntre til mønstre som fungerer uten transformasjonen vi bruker Babel til i dag. Når V8-dekning og native ESM-støtte stabiliseres i Jest, vil vi også kunne fjerne babel-jest som standard, men vi vil fortsette å vedlikeholde den.
Nye falske klokker
Med Jest 26 leverer vi en ny implementering av falske klokker basert på @sinonjs/fake-timers. Vi har ønsket å gjøre dette i årevis og er glade for at dette endelig har kommet langt nok til å støtte alle Jest's eksisterende brukstilfeller for falske klokker.
Den nye implementeringen kommer med ekstra funksjoner som mocking av Date, queueMicrotask og mer, se denne README-filen. Den fungerer transparent ved bruk av eksisterende timer-APIer som jest.runAllTimers() – sjekk dokumentasjonen på vår nettside.
Vi er trygge på at denne implementeringen er klar for produksjon, men vi ønsker ikke å tvinge brukere til å omskrive testene sine hvis de er avhengige av subtile forskjeller mellom gammel og ny implementering. I Jest 26 vil denne nye implementeringen forbli valgfri og kan aktiveres ved å kalle jest.useFakeTimers('modern') eller ved å sende modern til timers-alternativet i konfigurasjonen din hvis du tidligere har aktivert falske klokker for alle tester.
I Jest 27 vil vi bytte standard til den nye "moderne" implementeringen, men vi vil fortsette å støtte og vedlikeholde den gamle implementeringen som kan brukes ved å kalle jest.useFakeTimers('legacy'). Hvis du er usikker på om du får oppgradert alle testene dine før Jest 27 lanseres, kan du legge til dette i testene dine nå for å beholde det gamle oppførselen.
Vi vil takke Carl-Erik Kopseng, Benjamin Gruenbaum og andre vedlikeholdere av @sinonjs/fake-timers for deres hjelp og tålmodighet under samarbeidet for å få dette til! Spennende.
En ny måte å bruke Jest på - @jest/globals
Jest har støttet seg på globaler popularisert av Jasmine-testrammeverket og andre som describe, it, test og expect. Selv om dette er et mye brukt mønster, har mange uttrykt en preferanse for å importere testrelaterte funksjoner i stedet. For å støtte dette brukstilfellet har vi lagt til et nytt pakke @jest/globals som kan brukes til å importere testfunksjoner: import {expect, jest, test} from '@jest/globals';.
Begrensninger:
-
For øyeblikket eksisterer globalene fortsatt i miljøet, men vi vil innføre en modus for å deaktivere globaler i fremtiden. På samme måte kan du ikke bruke
const jest = require('@jest/globals')fordijest-variabelen fortsatt er global for øyeblikket. -
Det er for øyeblikket ingen måte å legge til egendefinerte matchere til TypeScript-definisjonene når du bruker globaler på denne måten.
-
Selv om dette tillater kjøring av tester uten globaler, tillater det for øyeblikket ikke kjøring av tester uten Jest's testkjøring.
Native ESM-støtte
Som nevnt i Jest 25-blogginnlegget har vi jobbet med støtte for ECMAScript Modules. Dette er ikke stabilt ennå, men klart for testing. Vi setter stor pris på tilbakemeldinger og feilrapporter! For oversikt over nåværende status kan du sjekke denne saken eller bla gjennom alle saker med ES Modules-merket.
Andre brytende endringer i Jest 26
-
Fjernet støtte for Node 8 (#9423)
-
[jest-environment-jsdom]Oppgradertejsdomtil v16 (#9606) -
[jest-runtime]Fjernet lenge avskrevnerequire.requireActualogrequire.requireMock-metoder (#9854) -
[jest-haste-map]FjernetprovidesModuleNodeModules(#8535) -
[jest-circus]Tester feiler nå hvis en test tar done-callback og returnerer verdier (#9129) -
[jest-circus]Gir nå korrekt feilmelding hvis tester/hooks defineres asynkront (#8096)
Ta vare på dere selv
Vi opplever alle en tid med stor usikkerhet. Hvis du sliter økonomisk, vil vi bruke Jests Open Collective-midler til å hjelpe nye og eksisterende bidragsytere. Vi har belønninger på noen saker og er åpne for å tilby belønning på enhver åpen sak - du kan foreslå belønning direkte i saken eller kontakte @cpojer via privat melding på Twitter.
Vær så snill og ta vare på dere selv.
