Ir para o conteúdo principal

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.

Adeus Node 6

O Node 6 atingiu seu fim de vida (EOL) em 30 de abril de 2019, e o Jest 25 o deixa para trás. Abandonar o Node 6 significa que podemos atualizar nossas dependências, principalmente o JSDOM, que foi atualizado para a versão 15. Essa atualização também elimina a necessidade de transpilar a sintaxe async-await, resultando em execução de código mais rápida e menor consumo de memória. Como bônus, o código transpilado do Jest será mais fácil de depurar para quem se aventurar nessa toca do coelho.

Embora o Node 8 também tenha atingido seu EOL, o Jest 25 manterá suporte a ele para facilitar a atualização de quem ainda utiliza o Node 8. Isso traz algumas compensações, como o JSDOM v16 ter sido lançado sem suporte ao Node 8. Portanto, será necessário usar jest-environment-jsdom-sixteen para utilizar a versão mais recente.

Melhorias de desempenho

Recebemos relatos de que o Jest desacelerou nas últimas versões. O Jest 25 inclui uma atualização do Micromatch, que traz grandes ganhos no tempo de inicialização, além de correções de bugs e ajustes que restauram a velocidade do Jest 23. Para o Jest em si, como mencionado no início deste post, isso significa redução de 10-15% no tempo de execução dos testes. Continuamos buscando melhorias, então verifique o desempenho comparado a versões anteriores e abra issues se pudermos melhorar!

Cobertura de código V8

A instrumentação de cobertura de código atual do Jest é feita pelo babel-plugin-istanbul, que insere código de coleta antes de gerar relatórios. Porém, isso é lento e consome muita memória, especialmente em arquivos e bases de código grandes. Felizmente, o V8 possui cobertura de código nativa, cada vez mais utilizável no Node graças ao trabalho de Benjamin Coe e outras equipes do V8 e Node.js. O Jest 25 traz suporte experimental via a nova flag --coverage-provider. Consulte a documentação para ressalvas e uso.

Pensando rápido e devagar quando testes falham

Esforço desnecessário para interpretar relatórios de falhas prejudica:

  • "pensar rápido" para reconhecer padrões da experiência anterior

  • "pensar devagar" para analisar mudanças e decidir se são progressos esperados ou regressões inesperadas

O Jest 25 completa a segunda etapa de um esforço iniciado no Jest 24 para melhorar todos os matchers:

  • linha de descrição correta, incluindo modificadores .rejects, .resolves e .not

  • rótulos concisos e alinhamento consistente para valores esperados e recebidos

  • destaque invertido de diferenças de substring quando valores são strings

  • contagem de linhas alteradas para identificar exclusões ou inserções

Agradecimentos especiais ao mantenedor do Jest Mark Pedrotti por liderar essa iniciativa e seu trabalho contínuo para otimizar erros de expectativa.

Cores das diferenças em testes de snapshot falhos

A mudança mais óbvia para substituir confusão por confiança são as cores das linhas alteradas nas diferenças quando testes de snapshot falham:

  • - Snapshot muda de verde para magenta

  • + Received muda de vermelho para verde-azulado com fundo ciano/água

Exemplos de relatórios de testes de snapshot (antes à esquerda e depois à direita)

  1. As contagens de linhas alteradas confirmam sua primeira impressão sobre a direção da mudança no snapshot (ou seja, linhas excluídas ou inseridas)

linhas-de-inserção-de-snapshot

  1. As cores de fundo atraem seus olhos para comparar linhas alteradas adjacentes

linhas-de-alteração-de-snapshot

  1. As cores de fundo também ajudam a identificar quais testes toThrow exigem uma decisão sobre atualizar ou não o snapshot

substrings-alteradas-no-snapshot

Aqui estão algumas razões para escolhermos cores únicas:

  • Os 95% das pessoas com visão completa de cores podem reconhecer rapidamente quais relatórios são de testes de snapshot versus outros matchers.

  • Resolve o conflito direto entre o significado de verde/vermelho nos testes do Jest versus vermelho/verde em revisões de código.

  • Ao contrário de uma inversão para vermelho/verde que sugere que a atualização é a decisão padrão, sugere que as diferenças exigem revisão mais cuidadosa para possíveis regressões em falhas locais de testes de snapshot do que em revisão de código (quando os problemas já foram corrigidos).

A diferença de tonalidade de magenta em 300° para verde-azulado/ciano/água em 180° oferece melhor acessibilidade para visão de cores, e o tom de fundo claro para linhas alteradas fornece contraste consistente em temas claros e escuros.

Se você mantém uma ferramenta de linha de comando, pode encontrar inspiração para melhorar sua acessibilidade em #9132.

Suporte a Módulos ECMAScript (ESM)

O Node 13 possui suporte não sinalizado para ESM, e começamos a trabalhar modestamente para suporte nativo no Jest. O Jest 25 inclui suporte para arquivos de configuração jest.config.cjs e jest.config.mjs, mas os próprios testes ainda não podem ser escritos usando ESM sem algo como Babel ou TypeScript para transformá-los em CJS.

As APIs que o Jest usará ainda são experimentais e sinalizadas, então não espere suporte imediato. Essas APIs são algo que a equipe de Módulos do Node.js está trabalhando ativamente, e ficaremos de olho para experimentar e fornecer feedback. Você pode se inscrever em esta issue para receber atualizações sobre o status de implementação no Jest.

Outras melhorias e atualizações

  • O Jest ultrapassou 1000 contribuidores únicos. Um marco incrível! Obrigado a todos que nos ajudam a tornar os testes o mais agradáveis possível.

  • Graças ao membro da comunidade Josh Rosenstein, o Jest agora possui suporte para BigInt na maioria dos matchers, como toBeGreaterThan. O Jest também entenderá literais bigint prontamente.

  • A funcionalidade --detect-leaks do Jest estava quebrada para Node 12 e versões mais recentes - isso foi corrigido no Jest 25.

  • Como anunciado no post do blog do Jest 24, a base de código do Jest foi reescrita em TypeScript - esse trabalho foi concluído no Jest 24.3. Então, se você usar qualquer parte individual do Jest, deve obter ótima integração com IDEs. Olhando adiante, realmente queremos tornar os mocks do Jest mais amigáveis com sistemas de tipos, e adoraríamos a ajuda da comunidade nisso. Por favor, participe aqui com ideias e envie PRs! Também investigaremos mover as tipagens para usar o Jest como executor de testes do DefinitelyTyped para o próprio Jest.

  • O pacote jest-diff agora exporta funções como diffLinesUnified e diffStringsUnified com opções de configuração, permitindo que outros aplicativos formatem diferenças de maneira personalizada. Para mais informações e exemplos de código, consulte o novo arquivo README.md no repositório do Jest ou em repositórios de pacotes.

  • Graças ao membro da comunidade Wei An Yen, o Jest não destacará mais correspondências assimétricas aprovadas em erros de expectativa. Essa era uma dor persistente com correspondentes assimétricos e estamos muito felizes por finalmente estar resolvido.

  • Pelo segundo ano consecutivo, o Jest venceu o prêmio de Maior Satisfação no State of JS. Estamos incrivelmente gratos pelo apoio da comunidade e esperamos aproveitar esse impulso para tornar 2020 ainda melhor!

Planos para o futuro

  • A configuração do Jest é vasta e um pouco complicada – frequentemente há pelo menos duas maneiras de fazer a mesma coisa, muitas vezes até mais. Para o Jest 26, esperamos condensar a configuração e torná-la mais previsível. Veja detalhes nesta issue.

  • Também esperamos fornecer uma API programática adequada para executar o Jest, facilitando a integração em IDEs e outras ferramentas. Acompanhe o progresso nesta issue.

  • Existe um PR aberto para adicionar o Lolex como implementação dos temporizadores fictícios do Jest desde dezembro de 2017. Embora não estejamos adicionando isso às APIs públicas no Jest 25, o suporte está tecnicamente incluído e estamos estudando como expô-lo para testes e experimentação. Usá-lo permite simular Date e outras funções de tempo que o Jest atualmente não aborda. Note que isso deve ser considerado experimental, e um suporte de API adequado virá em versões futuras. Acompanhe as atualizações neste PR.

Bons testes! 🃏