Escrita de testes nativa com Node.js - Vamos explorar o novo Node Test Runner
Venha entender o que é a ferramenta de testes nativa no node.js 👀
Essa newsletter é um compilado de aprendizados que obetive desde março desse ano 2023, um mês depois de ser lançado o node test runner.
Eu também realizei uma palestra no evento codecon sobre esse tema, hoje às 19h o vídeo será postado na integra no meu canal do youtube em formato de vlog, caso queiram assistir o LINK ESTÁ AQUI !
Eu vim de um contexto de builds e testes lentos 👻
Pra quem não me acompanha a muito tempo não deve saber, mas eu vim do ecossistema Java.
E se tinha uma coisa que me incomodava muito era ter que estudar a fundo JVM para poder promover tuning em memória e garantir build mais rápidos, e claro ao executar um teste demorava cerca de 15 minutos. Foi ai que me questionei o que mais era preciso sendo que os projetos novos que eu criava estavam nesse mesmo cenário.
Claro que muita coisa envolvia os frameworks que eu utilizava, sei que existe o Quarkus que é mais perfomático, mas nas empresas que trabalha a adoção de um novo framework precisava de um approve que todas as squads (o que é normal em grandes empresas).
Desde que comecei a estudar JavaScript ouvia promessas de testes nativos 🙏
A parte mais louca é que decidi ir de cara em um outro ecossistema e estudando o suficiente para não ter que descer de senioridade, o que aconteceu o/
E um tema que eu ouvia desde que comecei meus estudos era das promessas de testes nativos no runtime Node.js.
Foi aí que eu pensei que além de ter feito a escolha certa de mudar de plataforma, eu também teria a oportunidade de ver como um runtime de testes funciona por debaixo dos panos!
Evplução dos frameworks e libs de testes JavaScript 🦋
QUnit (2008): Desenvolvido por John Resig, o criador do jQuery, o QUnit foi um dos primeiros frameworks de testes para JavaScript. Ele introduziu a ideia de testes unitários no ecossistema JavaScript.
Jasmine (2010): Desenvolvido por Pivotal Labs, o Jasmine introduziu uma sintaxe mais descritiva para testes, permitindo que os desenvolvedores escrevessem testes mais legíveis. Foi um passo importante para a adoção de práticas de TDD (Desenvolvimento Orientado a Testes) e BDD (Desenvolvimento Orientado a Comportamento) em JavaScript.
Mocha (2011): O Mocha focou na flexibilidade, permitindo que os desenvolvedores escolhessem suas próprias bibliotecas de assertivas e sistemas de mock. Também foi um dos primeiros a suportar testes assíncronos.
Jest (2014): Desenvolvido pelo Facebook, o Jest ganhou popularidade rapidamente por ser fácil de configurar e por fornecer uma série de recursos, incluindo asserções integradas, simulação de eventos e testes de snapshot.
AVA (2014): O AVA se destacou pela execução paralela de testes, visando aumentar a eficiência de execução em projetos de grande escala.
Jest (continuação): O Jest continuou a evoluir e se tornou ainda mais popular com sua integração com o ecossistema React, oferecendo recursos como testes de componentes e snapshots.
Cypress (2016): Embora não seja apenas um framework de testes, o Cypress ganhou destaque por sua abordagem única de testes de integração e end-to-end, fornecendo uma experiência de teste mais interativa e visual.
Testing Library (2018): A Testing Library, que inclui a React Testing Library, Vue Testing Library, entre outras, promove a criação de testes que se assemelham mais ao comportamento real do usuário, focando na interação com a interface.
Playwright (2020): Desenvolvido pela Microsoft, o Playwright é uma ferramenta que permite testar aplicativos em navegadores, dispositivos móveis e até mesmo em contextos de servidor, oferecendo uma ampla gama de possibilidades para testes.
WindiCSS (2021): Embora não seja um framework de testes, o WindiCSS introduziu a ideia de testes automáticos de CSS, ajudando os desenvolvedores a detectarem problemas de forma proativa em suas folhas de estilo.
Node Test Runner (2023): Lançado no começo desse ano por um dos desenvolvedores do deno e grande colaborador no Node.js o Colin Ihrig nasce a ferramentea de testes nativa!
Node test runner é tudo isso mesmo? 🧐
Eu fiz um comparativo na minha palestra na codecon sobre cada estratégia de testes e como cada um se comporta.
BDD (Behavior-Driven Development):
O que é: São testes que se concentram no comportamento do sistema a partir da perspectiva do usuário. Em BDD, os testes são escritos em linguagem natural (escrita dos testes) e descrevem o comportamento esperado do sistema em termos de cenários de uso.
Exemplo em JavaScript:
describe('Calculadora', () => {
it('deve somar dois números corretamente', () => {
const resultado = soma(2, 3);
expect(resultado).toBe(5);
});
it('deve subtrair dois números corretamente', () => {
const resultado = subtrai(5, 3);
expect(resultado).toBe(2);
});
});
Testes Convencionais:
O que é: São testes que se concentram em verificar o funcionamento de partes específicas de um programa, como funções, classes ou módulos. Eles são mais técnicos e menos descritivos em comparação com os testes BDD.
Exemplo em JavaScript:
function soma(a, b) { return a + b; } function subtrai(a, b) { return a - b; } test('soma 2 e 3 é igual a 5', () => { expect(soma(2, 3)).toBe(5); }); test('subtrai 3 de 5 é igual a 2', () => { expect(subtrai(5, 3)).toBe(2); });
Fixture tests:
O que são: Fixtures são dados de teste ou ambiente pré-configurado que são usados para garantir que os testes sejam consistentes e reproduzíveis. Por exemplo, ao testar um banco de dados, você pode criar uma fixture com dados de exemplo que são usados em seus testes.
Exemplo em JavaScript:
Imagine que estamos testando uma função que busca informações de um banco de dados:
// Fixture: Dados de exemplo no banco de dados const databaseFixture = [ { id: 1, nome: 'Alice' }, { id: 2, nome: 'Bob' }, ]; // Função que busca informações do banco de dados function buscarPorId(id) { return databaseFixture.find(item => item.id === id); } // Teste test('busca por ID retorna o item correto', () => { const resultado = buscarPorId(1); expect(resultado).toEqual({ id: 1, nome: 'Alice' }); });
Jest vs Node Test Runner 😅
Vamos agora pra um exemplo mais prático, que caso você queira que eu imerga mais nesse tema só comentar!
SPIES com JEST
Com Jest veja que a escrita não foge do usual, temos que realizar o import e criamos um teste spy mockando a função do mesmo:
import {
describe,
it,
jest,
expect
} from '@jest/globals'
function run({ fn, times }) {
for (let i = 0; i < times; i++) {
fn({ current: i * 5 })
}
}
describe('Spies Test Suite', () => {
it('should verify calls in a mock', () => {
const spy = jest.fn()
run({ fn: spy, times: 2 })
expect(spy).toHaveBeenNthCalledWith(1, { current: 0 })
expect(spy).toHaveBeenNthCalledWith(2, { current: 5 })
})
})
SPIES com Node Test Runner
O node test runner usa a mesma assinatura que o Jest e Mocha portanto a escrita é bem parecida, porém no que ele ganha é na velocidade, venha ver
import {
describe,
it,
mock
} from 'node:test'
import assert from 'node:assert'
function run({ fn, times }) {
for (let i = 0; i < times; i++) {
fn({ current: i * 5 })
}
}
describe('Spies Test Suite', () => {
it('should verify calls in a mock', () => {
const spy = mock.fn()
run({ fn: spy, times: 2 })
assert.strictEqual(spy.mock.callCount(), 2)
const calls = spy.mock.calls
assert.deepStrictEqual(calls[0].arguments[0], { current: 0 })
assert.deepStrictEqual(calls[1].arguments[0], { current: 5 })
})
})
A diferença de build!
Isso foi algo que me pegou bastante, ao executar apenas 1 teste com Jest e ao executar toda uma suite de testes com node test runner
Já pode migrar TUDO de Jest pra Node Test Runner?
A verdade é que podemos migrar funções básicas, como: mocks, asserts e coverage nativos.
E pelo fato de ter sido lançado em fevereiro desse ano ainda está em constante evolução, mas eu já utilizo nos meus projetos pessoais a fim de aprender mais sobre o runtime, evitar polyfill e também para incentivar a comunidade a continuar contribuindo com o runtime de testes nativos!
Me conta nos comentários o que você acha do Node Test Runner e se você quer mais conteúdos sobre esse tema!
Dicas para a semana 🔥
EVENTO
Womakerscode - acompanhem os eventos dessa comunidade maravilhosa que amo fazer parte
Codecon Feature[28 de outubro] - evento focado para pessoas no nível sênior!
YOUTUBE
ÀS 19h vai sair no meu canal do youtube um vlog completo contando todos os bastidores de um evento de tecnologia na qual eu palestrei mais a fundo sobre o tema que escrevi na news de hoje!