Hopp til hovedinnhold

Jest 30: Raskere, slankere, bedre

· 12 min å lese
Svyatoslav Zaytsev
Svyatoslav Zaytsev
Unofficial Beta Translation

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-jsdom ble oppgradert fra jsdom 21 til 26.

  • Minstekravet for TypeScript-versjon er nå 5.4.

  • Forskjellige expect-aliaser er fjernet. eslint-plugin-jest har 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å .mts og .cts-filer som standard.

  • --testPathPattern er 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 29Jest 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();
});

Dokumentasjon

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)));

Dokumentasjon

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.

Dokumentasjon

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.

Dokumentasjon

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});

Dokumentasjon

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).

Dokumentasjon

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;
});

Dokumentasjon

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.

Dokumentasjon

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

Jest blir med i OpenJS Foundation

· Én min å lese
Ricky Hanlon
Ricky Hanlon
Unofficial Beta Translation

This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →

Bannerbilde for Meta Open Source og OpenJS Foundation

I dag er vi glade for å kunngjøre at Jest blir med i OpenJS Foundation!

Denne endringen overfører eierskapet av prosjektet fra Meta til Jest Core-teamet via OpenJS Foundation som et Impact Project. Vi er takknemlige til Meta for å ha skapt Jest og for all støtten deres gjennom årene, og vi ser frem til fremtiden for Jest som et prosjekt eid av Jest-fellesskapet!

Se kunngjøringene på Meta Engineering-bloggen og OpenJS Foundation-bloggen for mer informasjon.

Jest 28: Blir lettere og forbedret kompatibilitet 🫶

· 9 min å lese
Simen Bekkhus
Simen Bekkhus
Unofficial Beta Translation

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.

Jest 27: Nye standarder for Jest, 2021-utgaven ⏩

· 8 min å lese
Tim Seckinger
Tim Seckinger
Unofficial Beta Translation

This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →

I innlegget om Jest 26 for omtrent ett år siden, kunngjorde vi at etter to store versjoner med få brytende endringer, ville Jest 27 slå om noen brytere for å sette bedre standarder for prosjekter som er nye eller kan migrere problemfritt. Dette gir oss muligheten til å fjerne noen pakker fra standarddistribusjonen av Jest 28 og publisere dem som separat installerbare og pluggbare moduler i stedet. Alle som bruker de nye standardene kan dra nytte av en mindre installasjonsstørrelse, mens de som trenger disse pakkene fortsatt kan installere dem separat.

Med den første store endringen av standarder siden Nye standarder for Jest som kom med den banebrytende versjon 15, er Jest 27 nå her for å holde Jest rask, effektiv og relevant i fremtiden. Vi vil forklare disse standardendringene og andre bemerkelsesverdige brytende endringer i dette innlegget, men først, la oss se på noen spennende nye funksjoner!

Jest 26: Tick Tock

· 7 min å lese
Unofficial Beta Translation

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:

Jest 25: 🚀 Legger grunnstein for fremtiden

· 6 min å lese
Simen Bekkhus
Simen Bekkhus
Unofficial Beta Translation

This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →

Jest 25 legger grunnmuren for store endringer i fremtiden. Vi har holdt brytende endringer til et minimum, men interne arkitekturforandringer kan kreve oppmerksomhet under oppgraderingen. Hovedendringene inkluderer oppgradering av JSDOM fra v11 til v15, 10-15% raskere testkjøring, nytt diff-visning for utdaterte snapshots og slutten på Node 6-støtte.

Over 80 bidragsytere har lagt inn mer enn 200 endringer siden Jest 24.9. Sjekk endringsloggen for full oversikt.

Jest 24: 💅 Forfriskende, polert og TypeScript-vennlig

· 10 min å lese
Simen Bekkhus
Simen Bekkhus
Unofficial Beta Translation

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 neste større utgivelse av Jest - versjon 24! Det har gått 4 måneder siden siste mindre utgivelse, og 8 måneder siden Jest 23, så denne oppgraderingen er en stor en med noe for alle! Høydepunkter innebygd støtte for TypeScript ved å oppgradere Jests interne systemer til Babel 7, fiksing av langvarige problemer med manglende konsollutdata og ytelsesproblemer ved beregning av store diff-er, samt en helt ny glitrende nettside. ✨

Se endringsloggen for fullstendig liste over alle endringer.

Støtte til Jest som åpen kildekode

· 3 min å lese
Ricky Hanlon
Ricky Hanlon
Unofficial Beta Translation

This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →

Jest vedlikeholdes av et fellesskap av bidragsytere til åpen kildekode og Facebook-ansatte.

Våre bidragsytere til åpen kildekode jobber for fellesskapet ved å utvikle nye funksjoner, fikse feil og vedlikeholde saksbehandlingskøen. Facebook-ansatte gjør det samme, med fokus på utfordringer knyttet til Facebooks skala, og kjører alle foreslåtte utgivinger gjennom Facebooks enorme testsuite før publisering.

Alle gjør vår del for å gjøre testing deilig.

På Jest Summit kunngjorde vi Jest Open Collective. Dette er vår måte å støtte innsatsen til det åpne kildekode-fellesskapet i Jest. For å være helt tydelig: Facebook-ansatte kan ikke dra nytte av Jest Open Collective. Kollektivets eneste formål er å støtte den åpne kildekode-siden av Jest-fellesskapet.

I dette innlegget vil vi skissere hva Jest Open Collective er, strukturen og målene vi har.