Jest 30: Raskere, slankere, bedre
This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →
I dag er vi glade for å kunngjøre lanseringen av Jest 30. Denne utgivelsen inneholder et betydelig antall endringer, feilrettinger og forbedringer. Selv om dette er en av de største hovedutgivelsene av Jest noensinne, innrømmer vi at tre år for en hovedutgivelse er for lenge. I fremtiden sikter vi mot å gjøre hyppigere hovedutgivelser for å holde Jest flott for det neste tiåret.
Hvis du vil hoppe over nyhetene og komme i gang, kjør npm install jest@^30.0.0 og følg migreringsguiden: Oppgradering fra Jest 29 til 30.
Hva er nytt?
Jest 30 er merkbar raskere, bruker mindre minne og kommer med massevis av nye funksjoner. Først la oss se på de brytende endringene:
Brytende endringer
-
Jest 30 slutter å støtte Node 14, 16, 19 og 21.
-
jest-environment-jsdomble oppgradert fra jsdom 21 til 26. -
Minstekravet for TypeScript-versjon er nå 5.4.
-
Forskjellige
expect-aliaser er fjernet.eslint-plugin-jesthar en autofixer du kan kjøre for å oppgradere kodebasen automatisk. -
Ikke-tellbare egenskaper utelukkes nå som standard fra objektmatchere som
toEqual. -
Jest støtter nå
.mtsog.cts-filer som standard. -
--testPathPatterner omdøpt til--testPathPatterns. -
Jest håndterer nå løfter som først avvises og senere fanges for å unngå falske positive testfeil.
-
Vi gjorde flere forbedringer i Jests snapshot-utskrift som kan kreve at du oppdaterer snapshots. Google avviklet
goo.gl-lenker vi brukte i snapshots. Vi misliker dette selv, men du må oppdatere alle snapshotsene dine. -
Jest er nå pakket i én fil per pakke. Dette forbedrer ytelsen, men kan føre til problemer hvis du har verktøy som aksesserer Jests interne struktur.
Dette er bare noen høydepunkter. Fullstendig liste over brytende endringer finner du i CHANGELOG og Jest 30-migreringsguiden.
Ytelse og minneforbedringer
Jest 30 leverer reelle ytelsesgevinster takket være mange optimaliseringer, spesielt innen moduloppløsning, minnebruk og testisolasjon. Ved å bruke den nye unrs-resolver ble moduloppløsningen i Jest mer funksjonsrik, standardkompatibel og raskere. Takk til @JounQin for migreringen. Avhengig av prosjektet kan du oppleve betydelig raskere testkjøringer og redusert minneforbruk. For eksempel observerte en stor TypeScript-app med klient og server 37% raskere tester og 77% lavere minnebruk i en del av kodebasen:
| Jest 29 | Jest 30 | |
|---|---|---|
| Server tests | ~1350s / 7.8 GB max | ~850s / 1.8 GB max |
| Client tests | ~49s / 1.0 GB max | ~44s / 0.8 GB max |
Jest er rask, men på grunn av testisolasjonen forverrer treg brukerkode ofte ytelsesproblemer og fører til langsomme testkjøringer. Når tester etterlater åpne håndteringer som uavsluttede timere eller tilkoblinger til andre tjenester, kan det få Jest til å henge eller sakke ned. Jest 30 er bedre til å oppdage og rapportere disse problemene, noe som hjelper deg med å identifisere og fikse trege eller problematiske tester lettere. Tester hos Happo ble for eksempel fremskyndet med 50% fra 14 til 9 minutter ved å rydde åpne håndteringer og oppgradere til Jest 30.
Hvis du bruker filer som samler eksportene fra flere moduler i én enkelt fil (dvs. "tønnefiler"), anbefaler vi å bruke verktøy som babel-jest-boost, babel-plugin-transform-barrels eller no-barrel-file for å unngå å laste inn store deler av applikasjonskoden for hver testfil. Dette kan gi ytelsesforbedringer på opptil 100 ganger.
Rydding av globale variabler mellom testfiler
Jest oppnår testisolering mellom filer ved å kjøre hver test i en egen VM-kontekst, som gir hver fil et friskt globalt miljø. Men hvis koden din ikke rydder globale variabler etter hver testfil, kan det føre til minnelekkasjer i Jest og tregere testkjøringer. Jest 30 introduserer en ny funksjon som varsler deg om globale variabler som ikke er riktig ryddet etter testkjøring.
I fremtiden vil Jest automatisk rydde globale variabler etter hver testkjøring. Hvis du ikke får advarsler om uryddede globale variabler med Jest 30, kan du allerede nå aktivere denne funksjonen fullt ut ved å sette globals cleanup-modus til "on", og dra nytte av betydelige minnebesparelser og ytelsesforbedringer:
export default {
testEnvironmentOptions: {
globalsCleanup: 'on',
},
};
Standardinnstillingen i Jest er globalsCleanup: 'soft'. For å deaktivere denne funksjonen kan du sette den til off. Hvis du trenger å beskytte spesifikke globale objekter mot opprydding – for eksempel delte verktøy eller mellomlagre – kan du merke dem som beskyttet med jest-util:
import {protectProperties} from 'jest-util';
protectProperties(globalThis['my-property']);
Takk til @eyalroth for å implementere denne funksjonen!
Nye funksjoner
Forbedret støtte for ECMAScript-moduler og TypeScript
Støtte for import.meta.* og file:// ble lagt til ved bruk av native ESM med Jest. I tillegg kan du nå skrive Jest-konfigurasjonsfiler i TypeScript, og .mts- og .cts-filer støttes nå uten ekstra konfigurasjon. Hvis du bruker Nodes innebygde TypeScript-typefjerningsfunksjon, laster vi ikke lenger TypeScript-transformeren for å fjerne typer, noe som gir raskere testkjøringer.
Spioner og using-nøkkelordet
Du kan nå bruke JavaScripts nye syntaks for eksplisitt ressurshåndtering (using) med Jest-spioner. Hvis miljøet ditt støtter dette, vil using jest.spyOn(obj, 'method') automatisk gjenopprette den originale metoden når blokken avsluttes, så du slipper manuell opprydding.
test('logs a warning', () => {
using spy = jest.spyOn(console, 'warn');
doSomeThingWarnWorthy();
expect(spy).toHaveBeenCalled();
});
expect.arrayOf
Jest 30 introduserer en ny asymmetrisk matcher, expect.arrayOf, som lar deg validere hvert element i en array mot en betingelse eller type. For eksempel kan du forvente en tallarray der alle elementer er tall:
expect(someArray).toEqual(expect.arrayOf(expect.any(Number)));
Ny plassholder i test.each: %$
Hvis du bruker datadrevne tester med test.each, kan du nå inkludere en spesiell plassholder %$ i testtitlene dine for å sette inn testtilfelletes nummer. For eksempel:
test.each(cases)('Case %$ works as expected', () => {});
vil erstatte %$ med testens sekvensnummer.
jest.advanceTimersToNextFrame()
@sinonjs/fake-timers ble oppgradert til v13, og la til jest.advanceTimersToNextFrame(). Denne nye funksjonen lar deg flytte alle ventende requestAnimationFrame-tilbakekallinger til neste rammegrense, noe som gjør det enklere å teste animasjoner eller kode som bruker requestAnimationFrame uten å måtte tippe millisekundvarigheter.
Konfigurerbare testrepetisjoner
Jest 30 forbedrer jest.retryTimes() med nye alternativer som gir deg kontroll over hvordan repetisjoner håndteres. Du kan angi en forsinkelse eller umiddelbart gjenta en mislykket test uten å vente til hele testsuiten er fullført:
// Retry failed tests up to 3 times, waiting 1 second between attempts:
jest.retryTimes(3, {waitBeforeRetry: 1000});
// Immediately retry without waiting for other tests to finish:
jest.retryTimes(3, {retryImmediately: true});
jest.unstable_unmockModule()
Jest 30 introduserer det nye eksperimentelle API-et jest.unstable_unmockModule() for finjustert kontroll ved avmockering av moduler (spesielt ved bruk av native ESM).
jest.onGenerateMock(callback)
En ny onGenerateMock-metode er lagt til. Den registrerer en tilbakekallingsfunksjon som aktiveres når Jest genererer en mock for en modul. Dette lar deg endre mocken før den returneres til testmiljøet ditt:
jest.onGenerateMock((modulePath, moduleMock) => {
if (modulePath.includes('Database')) {
moduleMock.connect = jest.fn().mockImplementation(() => {
console.log('Connected to mock DB');
});
}
return moduleMock;
});
Andre forbedringer
Tilpasset objektserialisering
Jests matcherverktøy støtter nå definisjon av en statisk SERIALIZABLE_PROPERTIES på egendefinerte objekter. Dette lar deg kontrollere hvilke egenskaper som inkluderes i øyeblikksbilder og feilmeldinger, noe som gir mer fokuserte og relevante utdata.
Støtte for asynkron oppsett
Testfiler oppført i setupFilesAfterEnv kan nå eksportere en asynkron funksjon eller bruke toppnivå await, på samme måte som setupFiles.
Og så mye mer…
Se fullstendig CHANGELOG for alle endringer, forbedringer og nye funksjoner.
Kjente problemer
jsdom har endret seg for å bli mer spesifikasjonskompatibel. Dette kan bryte noen brukstilfeller, spesielt mocking av window.location i tester. Jest leveres nå med @jest/environment-jsdom-abstract for enklere tilpasning av egendefinerte testmiljøer basert på jsdom. Hvis du bare ønsker å patche jsdom, kan du bruke denne jsdom-patchen til prosjektet ditt. I fremtiden kan vi vurdere et alternativ til jsdom som er bedre egnet for testing.
Hva blir det neste?
Jest har vært det mest populære JavaScript-testrammeverket i et tiår, brukt av millioner av utviklere i alt fra små biblioteker til verdens største kodebaser. Gjennom konstant forbedring har vi akkumulert teknisk gjeld. Vi støtter funksjoner få bruker, og har begrenset brytende endringer for å unngå brudd. Noen funksjoner hører ikke hjemme i kjernefunksjonaliteten, mens andre kan føre til feil testtilnærminger. Teamendringer har også ført til tregere utvikling. Slik adresserer vi dette fremover:
-
Ytelse/teknisk gjeld: Foredl Jest til en slankere, ytelsesoptimalisert kjerne. Fjern lite brukte funksjoner og fokuser på det som gjør Jest unikt.
-
Konsistente utgivelsessykluser: Vi sikter mot mer forutsigbare utgivelser og utfasinger.
-
Åpen utvikling: Bygg alt åpent, vær transparent i planlegging, og skap flere bidragsmuligheter for økt deltakelse.
-
Vær dristige: Som Jest-teamet bør vi være mer dristige. Det er mange ting som holder Jest tilbake fra sitt fulle potensial. Det er på tide å ta grep.
Den gode nyheten er at Jest alltid har vært godt forberedt for å leve opp til disse prinsippene, helt siden vi bygde rammeverket som et modulært system med klar ansvarsdeling. Nå er det på tide å levere. Mer om dette snart!
Takk
Denne utgivelsen ville ikke vært mulig uten det harde arbeidet fra vårt fellesskap. Takk.
@SimenB, @mrazauskas, @Connormiha, @liuxingbaoyu, @k-rajat19, @G-Rath, @charpeni, @dubzzz, @stekycz, @yinm, @lencioni, @phawxby, @lukeapage, @robhogan, @fisker, @k-rajat19, @connectdotz, @alesmenzel, @rickhanlonii, @mbelsky, @brunocabral88, @brandon-leapyear, @nicolo-ribaudo, @dj-stormtrooper, @eryue0220
En spesiell takk til alle som bidro til Jest for første gang i denne utgivelsen. Takk for at dere gjør Jest bedre for alle!
@eyalroth, @KhaledElmorsy, @mohammednumaan, @bensternthal, @BondarenkoAlex, @phryneas, @jayvdb, @brandonchinn178, @latin-1, @rmartine-ias, @fa93hws, @Dunqing, @gustav0d, @noritaka1166, @andreibereczki, @Dreamsorcerer, @satanTime, @icholy, @ecraig12345, @cgm-16, @sebastiancarlos, @dancer1325, @loganrosen, @zakingslayerv22, @dev-intj, @tez3998, @anbnyc, @pengqiseven, @thypon, @co63oc, @danielrentz, @jonasongg, @andrew-the-drawer, @phryneas, @hyperupcall, @tonyd33, @madcapnmckay, @dongwa, @gagan-bhullar-tech, @ikonst, @ZuBB, @jzaefferer, @brandonnorsworthy, @henny1105, @DmitryMakhnev, @askoufis, @RahulARanger, @Jon-Biz, @fynsta, @KonnorRogers, @BondarenkoAlex, @mouadhbb, @kemuridama, @Avi-E-Koenig, @davidroeca, @akwodkiewicz, @mukul-turing, @dnicolson, @colinacassidy, @ofekm97, @haze, @Vadimchesh, @peterdenham, @ShuZhong, @manoraj, @nicolo-ribaudo, @georgekaran, @MathieuFedrigo, @hkdobrev, @Germandrummer92, @CheadleCheadle, @notaphplover, @danbeam, @arescrimson, @yepitschunked, @JimminiKin, @DerTimonius, @vkml, @ginabethrussell, @jeremiah-snee-openx, @WillianAgostini, @casey-lentz, @faizanu94, @someone635, @rafaelrabelos, @RayBrokeSomething, @DaniAcu, @mattkubej, @tr1ckydev, @shresthasurav, @the-ress, @Mutesa-Cedric, @nolddor, @alexreardon, @Peeja, @verycosy, @mknight-atl, @maro1993, @Eric-Tyrrell22






