Ir para o conteúdo principal

Jest 30: Mais Rápido, Mais Leve, Melhor

· 12 min de leitura"
Svyatoslav Zaytsev
Svyatoslav Zaytsev
Tradução Beta Não Oficial

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

Hoje temos o prazer de anunciar o lançamento do Jest 30. Esta versão traz uma quantidade significativa de mudanças, correções e melhorias. Embora seja um dos maiores lançamentos principais do Jest até hoje, reconhecemos que três anos para uma versão major é muito tempo. No futuro, planejamos fazer lançamentos principais mais frequentes para manter o Jest excelente na próxima década.

Se você quer pular as novidades e começar a usar, execute npm install jest@^30.0.0 e siga o guia de migração: Atualizando do Jest 29 para o 30.

O que há de novo?

O Jest 30 é visivelmente mais rápido, consome menos memória e traz toneladas de novos recursos. Primeiro, vamos ver as breaking changes:

Mudanças que Quebram Compatibilidade

  • Jest 30 remove suporte para Node 14, 16, 19 e 21.

  • jest-environment-jsdom foi atualizado do jsdom 21 para o 26.

  • A versão mínima compatível do TypeScript agora é a 5.4.

  • Vários aliases do expect foram removidos. O eslint-plugin-jest possui um autofixer que você pode executar para atualizar automaticamente seu código.

  • Propriedades não enumeráveis de objetos agora são excluídas por padrão de matchers como toEqual.

  • Jest agora suporta arquivos .mts e .cts por padrão.

  • --testPathPattern foi renomeado para --testPathPatterns.

  • Jest agora trata corretamente promises que são inicialmente rejeitadas e posteriormente capturadas, evitando falsos positivos em testes.

  • Fizemos várias melhorias na impressão de snapshots do Jest, o que pode exigir que você atualize seus snapshots. O Google descontinuou links goo.gl que usávamos em snapshots. Também não gostamos, mas você precisará atualizar todos os snapshots.

  • O Jest agora é empacotado em um único arquivo por pacote. Isso melhora o desempenho, mas pode quebrar ferramentas que acessam internals do Jest.

Estes são apenas alguns destaques. A lista completa de breaking changes pode ser encontrada no CHANGELOG e no guia de migração do Jest 30.

Melhorias de Desempenho e Memória

O Jest 30 oferece ganhos reais de desempenho graças a várias otimizações, especialmente em resolução de módulos, uso de memória e isolamento de testes. Ao adotar o novo unrs-resolver, a resolução de módulos no Jest tornou-se mais rica em recursos, compatível com padrões e mais rápida. Agradecemos a @JounQin pela migração. Dependendo do seu projeto, você pode observar execuções de testes significativamente mais rápidas e consumo reduzido de memória. Por exemplo, um grande app TypeScript com cliente e servidor observou testes 37% mais rápidos e 77% menos uso de memória em parte do código:

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

O Jest é rápido, mas devido ao seu isolamento de testes, código lento do usuário frequentemente amplia problemas de performance e leva a testes lentos. Quando testes deixam handles abertos como timers não finalizados ou conexões com outros serviços, isso pode fazer o Jest travar ou ficar lento. O Jest 30 melhorou na detecção e relato desses problemas, ajudando você a identificar e corrigir testes lentos ou problemáticos mais facilmente. Por exemplo, testes na Happo foram acelerados em 50%, caindo de 14 para 9 minutos após limpar handles abertos e atualizar para o Jest 30.

Se você utiliza arquivos que consolidam as exportações de múltiplos módulos em um único arquivo (chamados "barrel files"), recomendamos usar ferramentas como babel-jest-boost, babel-plugin-transform-barrels ou no-barrel-file para evitar carregar grandes blocos de código da aplicação em cada arquivo de teste. Isso pode gerar ganhos de performance de até 100x.

Limpeza de globais entre arquivos de teste

O Jest garante isolamento entre arquivos de teste executando cada teste em um contexto VM separado, fornecendo um ambiente global novo para cada arquivo. Porém, se seu código não limpar variáveis globais após cada arquivo de teste, isso pode causar vazamentos de memória e tornar a execução mais lenta. O Jest 30 introduz um novo recurso que alerta sobre globais não limpos corretamente após a execução dos testes.

No futuro, o Jest limpará automaticamente as variáveis globais após cada execução de teste. Se você não receber alertas sobre globais não limpos no Jest 30, já pode ativar totalmente esse recurso definindo o modo de limpeza para "on" - isso trará economia significativa de memória e melhorias de performance:

export default {
testEnvironmentOptions: {
globalsCleanup: 'on',
},
};

O padrão no Jest é globalsCleanup: 'soft'. Para desativar o recurso, defina como off. Se precisar proteger objetos globais específicos (como utilitários compartilhados ou caches), marque-os como protegidos usando jest-util:

import {protectProperties} from 'jest-util';

protectProperties(globalThis['my-property']);

Agradecemos ao @eyalroth pela implementação deste recurso!

Novos Recursos

Melhor suporte a ECMAScript Modules e TypeScript

Foi adicionado suporte a import.meta.* e file:// ao usar ESM nativo com Jest. Além disso, agora você pode escrever arquivos de configuração do Jest em TypeScript, e arquivos .mts/.cts têm suporte nativo sem configuração extra. Se usar o recurso nativo do Node para remover tipos TypeScript, não carregamos mais o transformer, acelerando a execução.

Spies e a palavra-chave using

Agora você pode usar a nova sintaxe de gerenciamento explícito de recursos do JavaScript (using) com spies do Jest. Em ambientes compatíveis, using jest.spyOn(obj, 'method') restaurará automaticamente o spy ao final do bloco, eliminando a limpeza manual.

test('logs a warning', () => {
using spy = jest.spyOn(console, 'warn');
doSomeThingWarnWorthy();
expect(spy).toHaveBeenCalled();
});

Documentação

expect.arrayOf

O Jest 30 introduz um novo matcher assimétrico, expect.arrayOf, que valida cada elemento de um array contra uma condição ou tipo. Por exemplo, para verificar um array de números:

expect(someArray).toEqual(expect.arrayOf(expect.any(Number)));

Documentação

Novo placeholder no test.each: %$

Em testes data-driven com test.each, agora você pode usar o placeholder %$ nos títulos para inserir o número sequencial do caso de teste. Exemplo:

test.each(cases)('Case %$ works as expected', () => {});

Isso substituirá %$ pelo número do caso de teste.

Documentação

jest.advanceTimersToNextFrame()

@sinonjs/fake-timers foi atualizado para v13, adicionando jest.advanceTimersToNextFrame(). Essa nova função avança todos os callbacks pendentes de requestAnimationFrame para o próximo frame, facilitando testes de animações ou códigos que dependem de requestAnimationFrame sem precisar estimar durações em milissegundos.

Documentação

Retentativas de teste configuráveis

O Jest 30 aprimora jest.retryTimes() com novas opções que dão controle sobre como as retentativas são tratadas. Você pode especificar um atraso ou repetir imediatamente um teste falho, em vez de esperar até toda a suíte de testes terminar:

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

Documentação

jest.unstable_unmockModule()

O Jest 30 adiciona a nova API experimental jest.unstable_unmockModule() para controle refinado ao desativar mocks de módulos (especialmente com ESM nativo).

Documentação

jest.onGenerateMock(callback)

Um novo método onGenerateMock foi adicionado. Ele registra uma função de callback invocada sempre que o Jest gera um mock para um módulo, permitindo modificar o mock antes de retorná-lo ao ambiente de teste:

jest.onGenerateMock((modulePath, moduleMock) => {
if (modulePath.includes('Database')) {
moduleMock.connect = jest.fn().mockImplementation(() => {
console.log('Connected to mock DB');
});
}
return moduleMock;
});

Documentação

Outras Melhorias

Serialização personalizada de objetos

Os utilitários de matcher do Jest agora suportam definir uma propriedade estática SERIALIZABLE_PROPERTIES em objetos personalizados. Isso permite controlar quais propriedades são incluídas em snapshots e mensagens de erro, tornando a saída mais focada.

Documentação

Suporte a configuração assíncrona

Arquivos de teste listados em setupFilesAfterEnv agora podem exportar funções assíncronas ou usar await no nível superior, similar ao setupFiles.

E muito mais...

Confira o CHANGELOG completo para todas mudanças, melhorias e novos recursos.

Problemas conhecidos

O jsdom fez alterações para maior conformidade com especificações. Isso pode quebrar alguns casos de uso, principalmente mocks de window.location em testes. O Jest agora inclui @jest/environment-jsdom-abstract para facilitar a criação de ambientes personalizados baseados em jsdom. Se você está apenas procurando corrigir o jsdom, pode aplicar este patch do jsdom ao seu projeto. Futuramente, podemos oferecer uma alternativa ao jsdom mais adequada para testes.

Próximos passos

O Jest é o framework de testes JavaScript mais popular há uma década, usado por milhões em projetos desde pequenas bibliotecas até os maiores códigos do mundo. Com melhorias constantes, acumulamos dívidas técnicas como qualquer projeto de software duradouro. Suportamos recursos pouco usados e minimizamos breaking changes para evitar impactos. Algumas funcionalidades deveriam ser possíveis sem fazer parte do core, enquanto outras incentivam práticas questionáveis. Com membros da equipe saindo ao longo do tempo, o ritmo de lançamentos diminuiu. Nossa estratégia:

  • Desempenho/Dívida técnica: Tornar o core mais enxuto e performático, removendo recursos subutilizados e focando no essencial.

  • Ciclos de lançamento consistentes: Adotar ciclos de lançamento e políticas de depreciação mais previsíveis.

  • Transparência: Construir tudo abertamente, compartilhar planos publicamente e criar mais oportunidades de contribuição.

  • Seja Ousado: Como equipe do Jest, precisamos ser mais audaciosos. Diversos fatores impedem o Jest de alcançar seu pleno potencial. É hora de agir.

A boa notícia é que o Jest sempre esteve bem estruturado para cumprir esses princípios, desde que construímos o framework como um sistema modular com clara separação de responsabilidades. Agora é hora de executar. Mais detalhes em breve!

Agradecimentos

Esta versão não teria sido possível sem o trabalho árduo da nossa comunidade. Obrigado.

@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

Um agradecimento especial a todos que fizeram sua primeira contribuição para o Jest nesta versão. Obrigado por tornar o Jest melhor para todos!

@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 ingressa na OpenJS Foundation

· "message": "1 min de leitura
Ricky Hanlon
Ricky Hanlon
Tradução Beta Não Oficial

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

Imagem de banner para Meta Open Source e OpenJS Foundation

Hoje temos o prazer de anunciar que o Jest está ingressando na OpenJS Foundation!

Esta mudança transfere a propriedade do projeto da Meta para a equipe central do Jest por meio da OpenJS Foundation como um Projeto de Impacto. Somos gratos à Meta por criar o Jest e por todo o suporte ao longo dos anos, e aguardamos com expectativa o futuro do Jest como um projeto pertencente à comunidade Jest!

Confira os anúncios no blog de Engenharia da Meta e no blog da OpenJS Foundation para mais informações.

Jest 28: Redução de peso e melhorias de compatibilidade 🫶

· 9 min de leitura"
Simen Bekkhus
Simen Bekkhus
Tradução Beta Não Oficial

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

O Jest 28 finalmente chegou, trazendo recursos há muito solicitados como suporte para fragmentação (sharding) de testes em múltiplas máquinas, exports em pacotes e a capacidade de personalizar o comportamento de temporizadores falsos (fake timers). Estes são apenas alguns destaques pessoais, e exploraremos mais neste post.

Além disso, conforme anunciado no post do Jest 27 no ano passado, removemos pacotes não utilizados por padrão da instalação padrão. Como resultado, o tamanho da instalação reduziu cerca de 1/3.

Jest 27: Novos Padrões para o Jest, edição 2021 ⏩

· 8 min de leitura"
Tim Seckinger
Tim Seckinger
Tradução Beta Não Oficial

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

No post do Jest 26 há cerca de um ano, anunciamos que após dois lançamentos principais com poucas mudanças significativas, o Jest 27 ajustaria configurações para estabelecer padrões melhores em projetos novos ou que possam migrar suavemente. Isso nos permite remover alguns pacotes da distribuição padrão do Jest 28 e publicá-los como módulos instaláveis e plugáveis separadamente. Todos com os novos padrões se beneficiam de um tamanho de instalação menor, enquanto quem precisa desses pacotes ainda pode instalá-los separadamente.

Com a primeira grande mudança de padrões desde os Novos Padrões para o Jest introduzidos na seminal versão 15, o Jest 27 chega para manter o framework rápido, enxuto e relevante no futuro. Explicaremos essas mudanças de padrões e outras alterações significativas neste post, mas primeiro, vamos conhecer novos recursos empolgantes!

Atualização do Site do Jest

· 2 min de leitura"
Sébastien Lorber
Docusaurus maintainer
Tradução Beta Não Oficial

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

Estamos animados em apresentar o novo site do Jest!

O site do Jest foi atualizado de Docusaurus 1 para Docusaurus 2, sendo um dos primeiros a adotar o suporte a i18n recém-lançado do Docusaurus 2.

Mas o que há de novo exatamente?

Jest 26: Tique-Taque

· 7 min de leitura"
Tradução Beta Não Oficial

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

Quando começamos a reconstruir o Jest há cinco anos, nosso objetivo era criar um executor de testes com tudo incluso e configuração zero que fosse acessível para iniciantes, extensível para quase todos os casos de uso de testes e escalável para grandes projetos. Um dos lançamentos fundamentais foi o Jest 15 que integrou tudo e forneceu padrões eficientes permitindo executar o Jest frequentemente sem configuração. Porém, essa abordagem tem uma grande desvantagem: o Jest instala muitas dependências em seus projetos que você pode não precisar.

Estamos começando a resolver essa limitação trabalhando na redução do tamanho de instalação do Jest, mantendo-o acessível e extensível. Implementamos as seguintes mudanças significativas no Jest 26:

Jest 25: 🚀 Lançando as bases para o futuro

· 8 min de leitura"
Simen Bekkhus
Simen Bekkhus
Tradução Beta Não Oficial

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

O Jest 25 está preparando o terreno para grandes mudanças futuras. Por isso, minimizamos alterações que quebram compatibilidade, mas mudanças na arquitetura interna podem exigir atenção durante a atualização. As principais mudanças são: atualização do JSDOM da v11 para v15, execução de testes 10-15% mais rápida, nova visualização de diff para snapshots desatualizados e fim do suporte ao Node 6.

Foram mais de 200 commits desde o Jest 24.9, feitos por mais de 80 contribuidores diferentes. Como sempre, confira o changelog para a lista completa de alterações.

Jest 24: 💅 Renovado, Polido e Amigável ao TypeScript

· 9 min de leitura"
Simen Bekkhus
Simen Bekkhus
Tradução Beta Não Oficial

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

Hoje temos o prazer de anunciar a próxima versão principal do Jest - a versão 24! Passaram-se 4 meses desde a última versão menor e 8 meses desde o Jest 23, então esta atualização é grande, com algo para todos! Os destaques incluem suporte nativo ao TypeScript ao atualizar os componentes internos do Jest para o Babel 7, correção de problemas antigos como saída de console ausente e lentidão no cálculo de grandes diffs, além de um site novo e reluzente. ✨

Para a lista completa de alterações, consulte o changelog.

Apoiando o Jest em Código Aberto

· 4 min de leitura"
Ricky Hanlon
Ricky Hanlon
Tradução Beta Não Oficial

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

O Jest é mantido por uma comunidade de contribuidores de código aberto e funcionários do Facebook.

Nossos contribuidores de código aberto trabalham em nome da comunidade para criar novos recursos, corrigir bugs e manter o backlog de issues. Os funcionários do Facebook fazem o mesmo, focando nos problemas específicos da escala do Facebook, e executam todas as versões propostas na enorme suíte de testes do Facebook antes da publicação.

Todos nós fazemos nossa parte para tornar os testes uma experiência agradável.

Na Jest Summit, anunciamos o Jest Open Collective. Esta é nossa forma de apoiar os esforços da comunidade de código aberto do Jest. Para deixar absolutamente claro: funcionários do Facebook não podem se beneficiar do Jest Open Collective. O propósito exclusivo do coletivo é apoiar o lado de código aberto da comunidade do Jest.

Neste artigo, vamos descrever o que é o Jest Open Collective, sua estrutura e nossos objetivos.