Ir para o conteúdo principal

Jest 20: 💖 Testes Encantadores & 🏃🏽 Executor Multi-Projeto

· 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 →

Há alguns meses, anunciamos o Jest 19 com grandes novidades, sendo o maior lançamento até então. O Jest 20 traz o dobro de mudanças em relação à versão anterior, apresenta uma reescrita completa do executor de testes e adiciona novas APIs de teste. Esta versão oferece um novo nível de personalização e configuração para projetos, facilitando a atualização. Além dos Testes JavaScript Sem Dores, acreditamos que o Jest agora proporciona uma experiência encantadora de testes em JavaScript. Vamos explorar as melhores novidades em detalhes:

Executor Multi-Projeto e Reformulação da Configuração

Até agora, o Jest só operava em um projeto por vez. Isso é incômodo ao trabalhar com vários projetos menores, cada um com sua própria configuração. Com o Jest 20, reescrevemos completamente o executor de testes para rodar múltiplos projetos simultaneamente em uma única instância do Jest — ideal para quem trabalha com frontend React e backend Node.js. Veja um vídeo do Jest executando testes para React, Relay, Yarn e Jest ao mesmo tempo:

multi-runner

O Jest agora recolhe o guia de uso após a primeira execução para economizar espaço vertical no terminal.

Além disso, reformulamos completamente o sistema de configuração. Agora você pode passar qualquer opção de configuração via CLI para substituir as definidas no arquivo de configuração. Também ajustamos o Jest para buscar por padrão um arquivo jest.config.js, permitindo definir configurações em JavaScript além do tradicional package.json. Com esses recursos, você pode combinar o Jest de formas mais poderosas. Por exemplo, para identificar quais testes seriam executados com base em arquivos alterados de um commit em múltiplos projetos de um monorepo, combine argumentos da CLI assim:

$ jest --projects projectA projectB --listTests --findRelatedTests projectA/banana.js projectB/kiwi.js
[
"projectA/banana.test.js",
"projectB/kiwi.test.js",
"projectB/pineapple.test.js",
]

Isso é especialmente útil em sistemas de integração contínua (CI), onde convém executar apenas um subconjunto de testes em Pull Requests, evitando que o Jest rode milhares de arquivos a cada pequena alteração.

Finalmente, agora mapeamos corretamente a cobertura de código com TypeScript e executamos cobertura para arquivos não testados em processos worker, trazendo ganhos significativos de velocidade.

Novas e Aprimoradas APIs de Teste

Fizemos várias adições e melhorias nas APIs de teste que ajudarão a escrever testes mais eficazes. Todos esses aprimoramentos foram feitos inteiramente por membros da comunidade!

  • Melhor teste assíncrono: Novo suporte a async/Promise através dos modificadores resolves/rejects no expect: expect(Promise(…)).resolves.toEqual(…). Veja a documentação.

  • Esperar n asserções: Além do expect.assertions(n), o novo expect.hasAssertions() garante que um teste tenha pelo menos uma asserção.

  • Plugin de lint: Adicionamos a regra valid-expect ao eslint-plugin-jest para garantir que uma asserção seja chamada após o expect. Isso evita erros como um expect(banana); solto sem chamada de asserção.

  • Plugins Pretty-Format: Adicionamos novos plugins ao pretty-format do Jest. Agora formatamos estruturas de dados do Immutable.js e HtmlElements em falhas de asserção e snapshots.

  • Ambiente personalizado: Agora é possível adicionar a anotação @jest-environment node|jsdom no comentário doc-block de um arquivo de teste para usar um ambiente diferente do padrão em testes individuais.

Aqui está um exemplo de como todas as novas APIs juntas tornarão os testes mais prazerosos:

/**
* @jest-environment node
*/

test('compares apples and bananas', async () => {
expect.hasAssertions(); // Ensure this test has at least one assertion.

await expect(
Promise.resolve(Immutable.Map({apples: 1, bananas: 2})),
).resolves.toEqual(Immutable.Map({apples: 1, bananas: 3}));

expect('banana'); // valid-expect in eslint-plugin-jest will show an error.
});

Este exemplo exibirá uma falha de teste semelhante a esta:

testing-apis

Mudanças que Quebram Compatibilidade

Como em toda versão principal, estamos fazendo algumas alterações que quebram compatibilidade para possibilitar mudanças maiores no futuro e elevar a experiência de testes a um novo patamar. Desta vez, nos esforçamos para quebrar apenas APIs que não afetarão a maioria dos usuários do Jest:

  • Fork do Jasmine 2.5: Finalmente decidimos criar um fork do próprio Jasmine e assumir o controle do executor de testes do Jest. Isso nos permitirá melhorar todos os aspectos da experiência de testes unitários no futuro, mas por enquanto estamos focados em reescritas incrementais e na redução da superfície da API. Se você encontrar um teste quebrando devido a uma API do Jasmine que agora está ausente, deve haver um recurso equivalente nos objetos jest ou expect. Com isso, removemos muitos recursos do Jasmine que não são comumente usados na maioria das bases de código.

  • Novos Snapshots em CI: Snapshots sempre devem ser commitados junto com o teste e os módulos que estão sendo testados. Alteramos o Jest para não salvar novos snapshots automaticamente em ambientes de Integração Contínua (CI) ou quando a flag --ci é especificada. Para substituir esse comportamento (geralmente não recomendado), a flag --updateSnapshot pode ser usada.

  • Babel-Polyfill: O Jest costumava carregar babel-polyfill automaticamente ao usar babel-jest, o que causava vazamentos de memória. Na maioria das versões do Node, não é necessário carregar babel-polyfill, então removemos essa inclusão automática. Em vez disso, alteramos o Jest para incluir apenas regenerator-runtime por padrão, comumente usado para suportar async/await em versões antigas do Node.js. Se você precisar do babel-polyfill, pode requerê-lo manualmente em seus arquivos de configuração.

Outras Melhorias

  • Documentação: A documentação é crucial para compartilhar melhores práticas e ensinar todos a escrever testes eficazes que levam a softwares melhores. Nas últimas semanas, expandimos a documentação do Jest para incluir um FAQ sobre Testes com Snapshots, um guia sobre como usar o Jest com bibliotecas JavaScript comuns, além de documentar os novos recursos mencionados acima.

  • Traduções: Estamos pedindo sua ajuda para traduzir a documentação do Jest e facilitar o aprendizado do framework.

  • Reporters Personalizados: O Jest agora suporta reporters de teste personalizados através da opção de configuração reporters. Finalmente você pode personalizar a saída do Jest e integrá-lo a outras ferramentas gerando relatórios em formatos como XML. Veja a documentação.

  • Saúde do Código-Fonte: Só foi possível iterar tão rapidamente no Jest porque dedicamos um tempo significativo à saúde do código-base. Fomos um dos primeiros adeptos do prettier, aumentamos notavelmente a cobertura do Flow, criamos um fork do Jasmine para melhorar nossa biblioteca de execução de testes, e reescrevemos/refatoramos partes significativas do próprio Jest para prepará-lo para o sucesso futuro.

  • Correções de Bugs: Como sempre, fizemos diversas correções de bugs no Jest. O changelog completo pode ser encontrado no repositório do Jest.

Palestras sobre o Jest

Recentemente, a equipe principal do Jest e outros colaboradores começaram a falar mais sobre o framework e a experiência de trabalhar nele em conferências:

Como sempre, este lançamento não teria sido possível sem vocês, a comunidade JavaScript. Estamos profundamente gratos por termos a oportunidade de trabalhar juntos para aprimorar os testes em JavaScript. Se quiser contribuir com o Jest, não hesite em nos contatar no GitHub ou no Discord.