DEV Community

Cover image for Testabilidade em Javascript 🧪
Ágatha
Ágatha

Posted on

1 1 1 1 1

Testabilidade em Javascript 🧪

Testabilidade é sobre o quão fácil é escrever testes para um pedaço do seu código. Para que um código seja fácil de testar, ele precisa ser bem organizado e seguir bons princípios de design, como ter funções com responsabilidades claras e separadas, evitar dependências complicadas entre partes do código e outras boas práticas de programação.


Exemplo: Cálculo de IMC 📏👤

Num cenário inicial complicado para testes, poderia existir um cáculo de IMC, e todo o cálculo e interação com o usuário, estar tudo misturado numa única função ou módulo. Isso faria com que testar o cálculo do IMC fosse difícil, pois você teria que simular toda a interação do usuário.

Para melhorar a testabilidade, o melhor seria separar a lógica do cálculo do IMC em um módulo separado, deixando a interação com o usuário para outra parte do código. Isso torna muito mais simples escrever testes unitários para a lógica do IMC, pois você pode testá-la diretamente sem se preocupar com as partes de interação do usuário.

// IMCModel.js
class IMCModel {
  calculaIMC(peso, altura) {
    return peso / (altura * altura);
  }
}

module.exports = IMCModel;
Enter fullscreen mode Exit fullscreen mode

E então, em outra parte do código, lidar com a interação do usuário:

// IMCController.js
const IMCModel = require('./IMCModel');
const model = new IMCModel();

function calculaEExibeIMC(peso, altura) {
  const imc = model.calculaIMC(peso, altura);
  console.log(`Índice de Massa Corporal (IMC): ${imc}`);
}

calculaEExibeIMC(70, 1.75);

Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, IMCModel contém apenas a lógica para calcular o IMC, tornando-a fácil de testar de forma isolada. Não é necessário se preocupar com detalhes de como o peso e a altura são obtidos ou como o resultado é exibido. Essa separação de responsabilidades melhora a testabilidade do código.

Essa abordagem mostra como o design do código influencia diretamente na facilidade de testá-lo. Separar a lógica de domínio da apresentação não só torna seu código mais limpo e organizado, mas também muito mais fácil de testar.


Exemplo: Chamada Assíncrona ⏳🔄

Trabalhar com código assíncrono é algo bem comum, especialmente quando se trata de operações como chamadas de rede, leituras de arquivo, ou qualquer tarefa que leve tempo para ser concluída. Isso torna o teste dessas funções um pouco mais desafiador, mas não impossível.
Vamos começar com uma classe MyMath que contém uma função assíncrona para calcular PI e uma versão síncrona dessa mesma função para facilitar os testes:

class MyMath {
  // Função síncrona que calcula PI.
  syncPI(prec) {
    let pi = 0;
    for (let k = 0; k < prec; k++) {
      pi += Math.pow(-1, k) / (2 * k + 1);
    }
    return pi * 4;
  }

  // Função assíncrona que utiliza a versão síncrona para calcular PI.
  async asyncPI(prec) {
    return new Promise((resolve) => {
      setTimeout(() => {
        const pi = this.syncPI(prec);
        resolve(pi);
      }, 1000); // Simula um cálculo que leva tempo com setTimeout.
    });
  }
}

module.exports = MyMath;

Enter fullscreen mode Exit fullscreen mode

Testando o Código Assíncrono em JavaScript:

const MyMath = require('./MyMath');
const myMath = new MyMath();

describe('MyMath', () => {
  test('asyncPI returns the correct PI value', async () => {
    const prec = 10; // Define a precisão como exemplo.
    const piValue = await myMath.asyncPI(prec);
    expect(piValue).toBe(3.0418396189294032);
  });
});

Enter fullscreen mode Exit fullscreen mode

Neste teste, você usa async/await para esperar a promessa retornada por asyncPI ser resolvida. Jest espera automaticamente pela resolução da promessa quando você declara a função de teste com async.

Isso mostra uma abordagem prática para melhorar a testabilidade de código assíncrono: separar a lógica complexa em funções síncronas que podem ser testadas independentemente e, em seguida, usar essas funções em operações assíncronas. Esse método não apenas torna seu código mais testável, mas também o mantém organizado e fácil de entender.


A maior parte desse conteúdo veio do livro "Engenharia de Software Moderna", escrito por Marco Tulio Valente. Esse livro é um tesouro cheio de dicas sobre como criar testes do jeito certo, usando o que tem de mais novo e eficiente no mundo da programação. Entretanto, a única diferença, é que o livro é em Java e aqui eu adaptei para utilizar Javascript.


AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →