Hopp til hovedinnhold

Jest 15.0: Nye standarder for Jest

· 8 min å lese
Unofficial Beta Translation

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

I løpet av det siste året har vi gjort Jest raskere, enklere å konfigurere, lagt til massevis av funksjoner og utviklet snapshot-testing. Men det var to områder vi investerte lite i: CLI-utdata og brukeropplevelse. Med Jest 15 endrer vi rammeverket radikalt for å gjøre det enklere å bruke for både nybegynnere og erfarne brukere. Vi er begeistret for at investeringen i Jest nå gir avkastning: vi kan bevege oss raskt og forbedre rammeverket for Facebook og open source-fellesskapet i lynfart. Jests mål er å komme med batterier inkludert og kreve minst mulig konfigurasjon. Nylig fikk vi anledning til å forklare filosofien vår i en create-react-app-sak.

Den viktigste endringen er en serie med nye standardinnstillinger. Hvis du er en eksisterende Jest-bruker, må du trolig oppdatere konfigurasjonen din for Jest 15. I de fleste tilfeller vil dette forenkle oppsettet ditt, og Jest vil gi nyttige feilmeldinger under oppgraderingen. Alle de nye standardene kan deaktiveres etter dine behov, men vi anser fortsatt de deaktiverte funksjonene som kritiske for Jest i visse situasjoner og vil fortsette å bruke og støtte dem på Facebook langsiktig. Vår API-dokumentasjon er også fullstendig omskrevet for å reflektere disse endringene. Denne pull-forespørselen for React viser noen av endringene som trengs for eksisterende prosjekter.

Nye CLI-feilmeldinger og oppsummeringer

Som del av arbeidet med å fjerne Jasmine gradvis i Jest, er erstatningen av alle Jasmine-matchere nesten fullført. Mye tid er brukt på å finjustere hver feilmelding for hver matcher for å gi best mulig signal til brukerne når en test feiler – tidspunktet når Jest bør gi mest verdi til deg. I tillegg til å skrive ut forventede og mottatte verdier, vises en diff for toBe- og toEqual-matchere for å hjelpe deg med å finne feil. Flere farger er lagt til, og relevante filer fra stack traces fremheves tydeligere.

Her er en sammenligning av før og etter på en lys terminal: failure1 Det fungerer også bra med mørkere farger: failure2

Ny watch-kommando

Vi omskrev fullstendig jest --watch for å gjøre den mer interaktiv. Den kan nå bytte mellom å kjøre alle tester eller kun testfiler relatert til endrede filer ved å trykke a eller o. Ved å trykke p vises en spørring som lar deg angi et testmønster for å fokusere på en bestemt filgruppe. Snapshot-tester kan oppdateres ved å trykke u.

watch

Forbedringer av jest-react-native

Mock-objekter for ListView, TextInput, ActivityIndicator, ScrollView og mer er lagt til. Eksisterende mock-objekter er oppdatert til å bruke de virkelige implementasjonene, og eksisterende snapshots må trolig oppdateres ved oppgradering til Jest 15. En mockComponent-funksjon er lagt til i jest-react-native som kan brukes til å mocke native komponenter:

jest.mock('MyNativeComponent', () => {
const jestReactNative = require('jest-react-native');
return jestReactNative.mockComponent('MyNativeComponent');
});

Det har også vært en rekke forbedringer rundt mocking av bilder, fetch-modulen og andre native APIer.

Buffrede konsollmeldinger

Jest paralleliserer testkjøringer på tvers av arbeidere for å maksimere ytelsen. Tidligere videresendte Jest konsollmeldinger fra arbeidere til forelderen og skrev dem ut umiddelbart. Når flere tester kjøres parallelt, var det ofte vanskelig å finne ut hvilken test og hvilken modul som kalte en loggfunksjon. I Jest 15 er alle konsollmeldinger buffret og skrevet ut sammen med individuelle testresultater. I tillegg skrives filen og linjenummeret for loggkallet ut slik at koden enkelt kan inspiseres.

Sammenlign utdataene fra forrige versjon av Jest og Jest 15: console

Automocking deaktivert

Automocking er nå deaktivert som standard i Jest. Dette er utvilsomt den mest forvirrende funksjonen for nye brukere, og for mange små prosjekter gir den egentlig ikke mening. Vi introduserte automocking hos Facebook, og det fungerte utmerket for oss da enhetstesting ble tatt i bruk i en stor eksisterende kodebase med få eksisterende tester. Men over tid føltes det ut som om folk brukte mer tid på å kjempe med mocked/umockede moduler enn det ville tatt å skrive en test på vanlig måte. Vi la også merke til at bibliotekutviklere ofte krever et stort antall grunnleggende moduler som alltid må umockes manuelt. Selv for Jest selv innså vi at flertallet av testene hadde automocking deaktivert manuelt. Vi mener fortsatt at eksplisitt automocking kan være utrolig verdifull. Denne endringen bytter rett og slett ut implisitte mocks med eksplisitte mocks via kall til jest.mock(moduleName).

Hvis du fortsatt ønsker å bruke automocking som standard, aktiver automock-innstillingen i konfigurasjonen din, eller kall jest.enableAutomock() manuelt i testfilen eller oppsettsfilen din.

Testfilsmønstre

Ikke alle bruker samme konvensjon med en __tests__-mappe for å lagre tester. Jest 15 ser nå også etter filer som slutter på .spec.js eller .test.js, to populære fellesskapsstandarder. Jest 15 fjerner også konfigurasjonsvalgene testDirectoryName og testFileExtensions, og ber brukere om å bytte til testRegex-valget når de gamle konfigurasjonsvalgene brukes.

Modulregisterpersistens

Jest pleide å tilbakestille alle moduler implisitt før hver test, og vi anbefalte å kreve moduler i beforeEach eller inne i tester. Dette er nyttig når moduler har lokal tilstand som ikke skal deles mellom tester. Men to store endringer har skjedd: ES-moduler med toppnivåsyntaksen import og en fornyet interesse for å skrive tilstandsløse funksjonelle moduler.

Dette har ført til mange inkompatibiliteter. Vi la også merke til at vi hos Facebook ikke engang brukte denne implisitte tilbakestillingen. I stedet stolte vi på eksplisitte kall til jest.resetModules(), noe som gir utviklere kontroll over når all tilstand skal slettes.

Her er et eksempel:

const React1 = require('react');
jest.resetModules();
const React2 = require('react');

React1 !== React2; // These two are separate copies of React.

Kallet til resetModules tørker vekk require-cachen. Et nytt kall for å hente samme modul vil resultere i en ny instansiering av samme modul og alle dens avhengigheter. Denne funksjonen er spesielt nyttig når man arbeider med moduler som har bivirkninger, som jest-haste-map.

Vi mener det er bedre å gi brukerne kontroll, så vi har deaktivert den implisitte tilbakestillingen. Moduler kan tilbakestilles ved bruk av jest.resetModules() i koden, og alternativet resetModules kan aktiveres i konfigurasjonen for å gjenopprette forrige atferd.

Ekte vs falske timere

Som standard pleide Jest å mocke alle tidsfunksjoner som setTimeout eller process.nextTick og tilbød et API jest.runAllTimers() for å flytte tidsfrister programmatisk. Dette er nyttig når en kodebit setter en lang timeout som vi ikke vil vente på i en test.

Men vi fant at bruksområdene ofte er ganske isolerte. Asynkron programmering har også blitt mye enklere i testkjøringsmiljøet vårt. Jest bruker nå ekte timere som standard.

Du kan fortsatt overstyre dette ved å spesifisere "timers": "fake" i konfigurasjonen eller ved å bruke de globale bryterne jest.useRealTimers() og jest.useFakeTimers().

setupEnvScriptFile vs setupFiles

Konfigurasjonsvalget setupEnvScriptFile har vært utdatert en stund. Jest 15 fjerner det helt og erstatter det med setupFiles. Dette valget forventer en array med filstier som lastes i rekkefølge før en testfil kjøres.

Omskrevet støtte for kodedekning

Kodedekning i Jest kan brukes via jest --coverage og krever ingen ekstra pakker eller konfigurasjon. Støtten for kodedekning ble fullstendig omskrevet, og et nytt alternativ collectCoverageFrom ble lagt til for å samle dekningsinformasjon fra hele prosjekter, inkludert filer som ikke er testet. Merk at dette alternativet bruker glob-mønstre da vi håper å forenkle konfigurasjonsalternativer ytterligere i fremtiden og tilby et enklere alternativ til regulære uttrykk. Se Jest's package.json for et eksempel.

Andre forbedringer

En rekke andre forbedringer er også implementert:

  • Forbedret ytelse ved kjøring av få tester.

  • Jest bruker nå utførlig modus når kun én testfil kjøres.

  • Lagt til --env-alternativ for å overstyre konfigurert testmiljø.

  • moduleNameMapper bruker nå en oppløsningsalgoritme.

  • Jest fungerer nå med filstier som inneholder spesialtegn som parenteser.

  • Lagt til global.global i node-miljøet.

  • Fikset babel-plugin-jest-hoist sin ugyldige feilmelding når en tilfeldig brukerfunksjon het mock.

  • Fikset testEnvironment-oppløsning til å foretrekke jest-environment-{name} fremfor kun {name}. Dette forhindrer modulkollisjon ved bruk av jsdom som testmiljø.

  • Forbedringer av Jest egen testinfrastruktur ved å slå sammen integrasjons- og enhetstester. Kodedekning samles nå for Jest selv.

Vi ser tilbake på alle endringene vi har gjort sammen med samfunnet med stor glede, og gleder oss til å gjøre Jest enda bedre i løpet av de neste månedene. Vennligst rapporter et problem hvis noe ikke fungerer som forventet, og send oss pull requests.

Neste steg: Samtidig reporter.