Jest 24: 💅 Renovado, Polido e Amigável ao TypeScript
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.
Novo Site
@orta criou um redesign incrível do site do Jest, implementado pelos membros da comunidade @montogeek e @brainkim.
O objetivo do redesign foi destacar melhor o que torna o Jest fantástico e desvincular a ideia de que ele é apenas para testar apps React - você pode usar o Jest com qualquer tipo de projeto e queremos deixar isso claro. Saiba mais sobre as motivações do redesign nesta issue.
Suporte ao TypeScript
Atualizamos internamente para o Babel 7 no Jest 24, que traz suporte a projetos TypeScript. Isso significa que o Jest pode transpilar TypeScript prontamente, desde que você configure o Babel com @babel/preset-typescript. Uma ressalva importante, semelhante ao suporte do Flow, é que o Babel apenas remove as anotações de tipo para gerar JavaScript válido. Ele não faz verificação de tipos.
Apesar do Jest suportar Babel 7 desde a versão 22 (Dezembro/2017), era necessário usar um módulo ponte para compatibilidade com o Babel 6. No Jest 24 migramos completamente para o Babel 7, com grande ajuda do membro da comunidade @milesj. Isso simplifica a configuração e permite aproveitar outros recursos do Babel 7, como carregamento automático de configurações e transpilação de modules. Remova o babel-core@^7.0.0-bridge.0 pois não é mais necessário.
Para verificar tipos durante os testes, use ts-jest. Você precisará configurar o transformer, pois por padrão o Jest aplica Babel a arquivos .ts e .tsx. Alternativamente, execute tsc ou use um runner do Jest para transpilar seu TypeScript enquanto executa os testes! Veja jest-runner-tsc para detalhes.
Consulte a documentação para mais informações.
Se por algum motivo você não puder atualizar para o Babel 7, ainda pode usar o Jest 24 com babel@6 mantendo o babel-jest na versão 23.
test.todo
No Jest 23, testes sem implementação passaram a gerar erros em vez de serem ignorados. Essa mudança veio de feedbacks sobre dificuldade em descobrir testes acidentalmente ignorados. Porém, isso prejudicou o fluxo de muitos desenvolvedores que usavam o recurso para planejar testes.
No Jest 24, resolvemos isso com test.todo (inspirado no excelente AVA), que aparece separadamente no resumo de testes. Ele permite esboçar rapidamente quais testes você planeja criar, e futuramente uma regra do ESLint poderá até alertar sobre testes esquecidos.
test.todo('invalid input should throw');
test.todo('missing options should be normalized');

Mensagens de Asserção Aprimoradas
Quando os testes falham, você precisa tomar decisões confiantes e corretas sobre quais mudanças são progressos esperados e quais são regressões inesperadas. É especialmente importante não perder algumas regressões ocultas em meio a muitos avanços. O Jest 24 torna os relatórios de falhas em asserções mais claros e concisos para vários matchers. Como o esforço continuará no Jest 25, você pode notar algumas inconsistências temporárias. Se seus testes nunca falharem, você não verá essas melhorias - para o resto de nós, será mais fácil depurar por que algo não funciona conforme o esperado. Agradecemos o trabalho árduo de @ittordepam e outros contribuidores da comunidade.
Você pode ver essas mudanças em todos esses PRs: 7621, 7557, 7448, 7325, 7241, 7152, 7125, 7107, 6961.
Exemplos:
Asserção com falha

Incompatibilidade de tipos

Função mock não chamada

Corrigindo problemas antigos
Corrigimos alguns problemas bem antigos nesta versão.
O primeiro que destacamos são declarações console.log que desapareciam. O Jest intercepta e coleta todos os logs para fornecer um stack trace e disponibilizá-los aos reportadores. Porém, isso causava um problema onde eles simplesmente sumiam em certos casos extremos. Felizmente, no Jest 24, @spion resolveu esse problema. Muito obrigado!
O segundo é um problema onde o Jest esgotava memória se a diferença na serialização de valores esperados e recebidos tivesse muitas inserções (seja por erro no teste, defeito no serializador ou falhas temporárias em TDD). @ittordepam substituiu o algoritmo anterior pelo pacote diff-sequences, que resolve isso usando o mínimo teórico de memória. Isso abre caminho para diffs de palavras no futuro, similar ao que o git oferece. Veja este PR e participe se quiser ajudar!
Outros destaques
-
Melhorias em
globalSetupeglobalTeardown: a transformação de código agora se aplica a eles, igual aosetupFiles, e são suportados como parte deprojects. -
É possível configurar o local dos snapshots do Jest, útil para quem cria ferramentas que usam o Jest em processos de build maiores.
-
Uma particularidade da CLI do Jest era que algumas flags e opções usavam camelCase (como
runInBand), enquanto outras não (comono-cache). Na Jest 24, ambas são reconhecidas, permitindo que você escreva os argumentos da CLI como preferir. -
Renomeamos
setupTestFrameworkScriptFileparasetupFilesAfterEnve transformamos essa opção em um array. Esperamos que isso deixe mais claro o propósito da configuração. Planejamos revisar mais a fundo a configuração na próxima versão principal - veja detalhes na seção abaixo. -
Para reduzir a "mágica" que o Jest faz para "simplesmente funcionar™", nesta versão removemos a injeção automática do
regenerator-runtime, usado em códigos assíncronos compilados. Incluirregenerator-runtimenem sempre é necessário, e acreditamos que é responsabilidade do usuário adicioná-lo se preciso. Se você usa@babel/preset-envcomtargetsconfigurado para versões modernas do Node (ex: Node 6+), não precisará incluí-lo. Consulte nossa documentação sobre Babel para detalhes. -
O Node.js 10 trouxe um módulo experimental chamado
worker_threads, similar às Web Workers dos navegadores. Ojest-worker, parte da plataforma Jest, poderá usarworker_threadsquando disponível em vez dechild_process, tornando-o ainda mais rápido! Benchmarks mostram 50% de melhoria. Por ser experimental, não está habilitado ao usar Jest como test runner, mas você pode usá-lo em seus projetos! Planejamos habilitá-lo por padrão quando sair do status experimental no Node.js.
Mudanças que Quebram Compatibilidade
Embora todas as mudanças estejam listadas no changelog, algumas merecem destaque:
-
Atualizamos para o Micromatch 3. Isso pode não afetar todos os usuários, mas ele é mais rigoroso na análise de globs que a versão 2 (usada na Jest 23). Leia esta discussão e tópicos relacionados para exemplos de globs inválidos caso encontre problemas.
-
Removemos resquícios de código necessários para Node 4. Anteriormente era tecnicamente possível executar Jest 23 no Node 4 - isso não é mais viável sem polyfills e transpilação.
-
Alterações na serialização de funções mock em snapshots - verifique cuidadosamente seus snapshots após a atualização. PR relacionado aqui.
-
O Jest não injeta mais
regenerator-runtimeautomaticamente - se encontrar erros relacionados, configure o Babel para transpilar funçõesasynccorretamente, usando por exemplo@babel/preset-env. PR relacionado aqui.
O Futuro
Estamos profundamente honrados pelos resultados no State Of JS 2018, onde o Jest ganhou o prêmio de "Maior Satisfação". Outro marco importante foi em outubro de 2018, quando o Jest atingiu 2 milhões de downloads semanais pela primeira vez. Obrigado.
Agradecemos imensamente pela confiança da comunidade e pretendemos consolidá-la no futuro. Garantiremos que a Jest 24 e futuras versões continuem construindo sobre esta base incrível, mantendo-se como parte essencial do toolkit de desenvolvedores JavaScript.
Esta foi a primeira versão em que exploramos a ideia de usar nosso financiamento do Open Collective para criar programas de recompensa por bugs. Isso funcionou bem para envolver desenvolvedores não-núcleo na implementação da nova página inicial, e estamos otimistas com um bug persistente onde os globais do Jest não correspondem aos globais do Node. Gostaríamos de fazer mais disso - se você tem um bug recorrente que seria um bom candidato para nosso programa de recompensas, por favor nos avise. Enquanto isso, você pode encontrar todos os tickets com recompensa através do rótulo de issue.
Já começamos a planejar a próxima versão do Jest 25, com o maior recurso planejado sendo uma reformulação completa de nossa configuração, que atualmente é bastante complexa de entender, principalmente devido a opções sobrepostas e mistura de globs com expressões regulares. Feedback sobre como você deseja que a configuração do Jest seja organizada é muito bem-vindo e pode ser enviado nesta issue.
Você também pode ter ouvido que estamos planejando migrar a base de código de Flow para TypeScript. Esperamos que essa migração permita que ainda mais contribuidores participem e ajudem a tornar 2019 ainda melhor para testes JavaScript. 🚀 O plano é implementar isso em uma versão menor num futuro próximo. Feedback sobre essa escolha pode ser adicionado ao RFC.
Por fim, se você já se perguntou como o Jest é construído, @cpojer gravou um vídeo com uma visão geral da arquitetura interna do Jest. Sinta-se à vontade para entrar em contato se tiver mais perguntas sobre o assunto. O vídeo está disponível em nosso site.
Bons testes! 🃏
