Ir para o conteúdo principal

Jest 22: Melhorias e Runners Personalizados

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

Hoje anunciamos uma nova versão principal do Jest que refinou quase todas as partes do framework para fornecer uma base de testes mais sólida. Junto com a comunidade Jest, implementamos diversas mudanças abrangentes que ajudarão você a extrair mais valor do Jest. Também promovemos o recurso de runners personalizados para estágio estável e adicionamos um novo pacote, jest-worker, para paralelizar trabalho entre múltiplos processos. Compilamos uma lista de destaques abaixo, mas não deixe de conferir o (como sempre) extenso changelog.

Adeus Node 4 & bem-vindo JSDOM 11

Com esta versão, estamos removendo o suporte para Node 4, principalmente porque uma de nossas principais dependências, o JSDOM, encerrou seu suporte. O Jest agora inclui nativamente o JSDOM 11, que oferece melhor suporte a SVGs, requestAnimationFrame, URL e URLSearchParams integrados, e muito mais.

Runners Personalizados + Paralelização fácil com jest-worker

No Jest 21, introduzimos o conceito de runners personalizados do Jest. Desde então, Rogelio, um dos principais contribuidores do Jest, criou vários runners úteis: Se você possui muitos testes existentes escritos em outro framework mas deseja usufruir imediatamente dos recursos do Jest, confira jest-runner-mocha. Se você tem uma base de código grande que precisa de linting, poderá obter ganhos significativos de velocidade executando o eslint dentro do Jest usando jest-runner-eslint.

Para obter controle mais refinado sobre a paralelização de tarefas pesadas (ex: transformar arquivos ou varrer o sistema de arquivos), projetamos uma nova biblioteca ideal para essa finalidade. Desenvolvemos um módulo moderno baseado em Promises com API acessível, chamado jest-worker, que permite delegar processos filhos para essas funções intensivas. Como o jest-worker, assim como qualquer outro pacote Jest, faz parte da plataforma Jest, você pode usá-lo livremente mesmo sem utilizar o Jest em si. Você encontrará mais detalhes na documentação aqui.

Para compreender melhor runners personalizados e o Jest como plataforma, assista à palestra do Rogelio na Reactive Conf 2017: Jest as a Platform.

Codeframe em falhas de teste

Para facilitar a identificação de qual asserção está falhando no teste, adicionamos um codeframe mostrando o contexto onde a asserção ocorre, ajudando você a focar no seu próprio código. Veja o exemplo de teste abaixo:

test('some test', () => {
function someFunctionWhichShouldThrow() {
if (false) {
throw new Error();
}

return 'success!';
}

expect(someFunctionWhichShouldThrow).toThrow();
});

No Jest 21, exibiríamos o seguinte erro:

failure in Jest 21

No Jest 22, adicionamos um codeframe que fornece mais contexto sobre as asserções falhas. Também limpamos o stack trace para remover mais ruído do que nunca.

failure in Jest 22

Teste simplificado de erros em código assíncrono

Agora você pode usar toThrow e toThrowErrorMatchingSnapshot em rejeições de Promises da mesma forma que em erros síncronos.

async function throwingFunction() {
throw new Error('This failed');
}

test('asynchronous rejection', async () => {
await expect(throwingFunction()).rejects.toThrowErrorMatchingSnapshot();
});

Ambientes de teste assíncronos

Quando o Puppeteer, uma forma de interagir programaticamente com um navegador Chromium real, foi anunciado pela equipe do Google Chrome em agosto, muitos desejaram usar o Jest para escrever testes executados no Chrome. A comunidade nos ajudou a tornar isso possível permitindo ambientes de teste assíncronos. Ainda estamos trabalhando para aprimorar essa experiência, mas você já pode conferir este guia sobre como usar o Puppeteer com o Jest a partir de hoje.

Detecção Experimental de Vazamentos

Adicionamos uma configuração experimental --detectLeaks ao Jest que avisará se uma instância do ambiente interno vazou após a execução de um teste. Ela também alertará quando seu conjunto de testes tentar carregar um arquivo após o término do teste, indicando que você esqueceu de aguardar operações assíncronas ou não limpou algo corretamente. Isso não detecta vazamentos no código de produção, apenas no código de teste, embora a tecnologia subjacente possa ajudá-lo (veja jest-leak-detector). Se reportar um bug sobre uso de memória no Jest, forneça um caso reprodutível onde --detectLeaks faça o teste falhar. Iniciamos um mecanismo de sandbox mais robusto, mas ainda não está pronto para ativação padrão. Se quiser ajudar, fale conosco no Discord!

Aprimoramentos no Modo de Observação

Ao usar o modo de observação, agora é possível focar apenas em testes que falharam anteriormente. Neste modo, o Jest não reexecuta testes aprovados, ajudando você a corrigir falhas. Adicionalmente, implementamos um sistema de plugins para o modo de observação. Adicione módulos a watchPlugins em sua configuração para estender seus recursos.

Suporte ao Babel 7

O Jest utiliza o Babel internamente para cobertura de código e recursos avançados de simulação. Com o Jest 22, ele também suporta o próximo Babel 7. Saiba mais na documentação aqui.

Melhorias em Funções de Simulação

Funções de simulação receberam aprimoramentos no Jest 22. Adicionamos a propriedade mockName para nomear seus mocks, útil em falhas de asserção. Também tornamos as funções de simulação serializáveis no pretty-format, permitindo testes com snapshots. No Jest 21, expect(jest.fn()).toMatchSnapshot() serializava como [Function]; no Jest 22, você obtém resultados como:

test('my mocking test', () => {
const mock = jest.fn().mockName('myMock');

mock('hello', {foo: 'bar'});

expect(mock).toMatchSnapshot();
});

// Serializes to:

exports[`my mocking test 1`] = `
[MockFunction myMock] {
"calls": Array [
Array [
"hello",
Object {
"foo": "bar",
},
],
],
}
`;

Destaques do Jest 21

Destaques do Jest 21

  1. Use expect e jest-mock em navegadores: Michael Jackson doou seu excelente pacote expect ao projeto Jest. Com ajuda de Kenneth Skovhus, a equipe adaptou jest-matchers (renomeado para expect) e jest-mock para navegadores. Isso permite usar asserções e mocks do Jest como substitutos do Chai/Sinon em testes Mocha, embora o Jest completo ainda não funcione em navegadores (veja issue). Migre do expect antigo para o novo expect com jest-codemods.

  2. Licença MIT: Mudamos a licença do Jest para MIT. Yay!

  3. Falha em suites de teste para erros assíncronos: O Jest tinha um bug que causava falhas quando erros eram lançados em partes específicas de código assíncrono. Isso foi corrigido por contribuidores da comunidade.

  4. Inicialização mais rápida: Com o Jest 21, ajustamos a inicialização para ser mais de 50% rápida. A grande sobrecarga do Jest ao executar testes pequenos e rápidos sempre foi um problema, e agora isso não deve mais ser um impedimento para usar o Jest.

Comunidade Jest

A comunidade em torno do Jest trabalha duro para tornar a experiência de testes ainda melhor. Estes são projetos separados do Jest principal, mas queremos destacar alguns de nossos favoritos pessoais aqui.

  • jest-image-snapshot – matcher personalizado para comparar imagens com snapshots, desenvolvido por engenheiros da American Express

  • ts-jest – tudo que você precisa para executar o Jest com sucesso em projetos TypeScript, por @kulshekhar

  • jest-codemods – migre seus testes de outros frameworks para o Jest com facilidade

  • jest-plugins – novo projeto comunitário focado em simplificar a configuração de ambientes de teste para ferramentas específicas como React, além de oferecer utilitários práticos

Também anunciamos o lançamento de um novo espaço para extensões de alta qualidade do Jest – jest-community. É uma nova organização no GitHub que já reúne nossos projetos favoritos, como vscode-jest e jest-extended, curados por mantenedores e colaboradores do Jest. Migramos até nosso eslint-plugin-jest para lá, e já vemos ótimas contribuições publicadas independentemente em ritmo acelerado.

Comunidade Jest

Projetos comunitários sob uma única organização também permitem experimentar coisas como lançamentos automatizados, algo que queremos explorar no futuro para o Jest. Isso também facilita compartilhar elementos comuns entre eles, como a estrutura de README (ideia inspirada na comunidade webpack), tornando tudo mais fácil de aprender e usar.

Se você tem algo incrível para compartilhar, entre em contato conosco! Adoraríamos destacar seu projeto aqui.