Guia de Testes Automatizados em Node.js com Mocha e Chai

Guia de Testes Automatizados em Node.js com Mocha e Chai

Testes automatizados são fundamentais para garantir a qualidade e a robustez do software. Mas no ecossistema Node.js, Mocha e Chai são duas ferramentas amplamente utilizadas para testes. Mocha é um framework de teste flexível e extensível, enquanto Chai é uma biblioteca de asserções que facilita a escrita de testes. Portanto neste guia, vamos explorar como configurar e utilizar Mocha e Chai para escrever e executar testes automatizados em projetos Node.js.

Pré-requisitos

Antes de começarmos, certifique-se de ter:

  • Node.js e npm instalados no seu sistema.
  • Conhecimento básico de JavaScript e Node.js.
  • Familiaridade com conceitos de testes de software.

Passo 1: Configurando o Ambiente

1. Inicializando o Projeto

Crie um novo diretório para o seu projeto e inicialize um novo projeto Node.js.

mkdir nodejs-testing
cd nodejs-testing
npm init -y

2. Instalando Mocha e Chai

Instale Mocha e Chai como dependências de desenvolvimento.

npm install --save-dev mocha chai

Passo 2: Escrevendo o Primeiro Teste

3. Estrutura do Projeto

Crie a seguinte estrutura de diretórios e arquivos:

nodejs-testing/
├── src/
│   └── calculator.js
└── test/
    └── calculator.test.js

4. Implementando o Módulo

Crie um arquivo calculator.js dentro da pasta src e implemente uma função simples de adição.

// src/calculator.js
function add(a, b) {
  return a + b;
}

module.exports = { add };

5. Escrevendo o Teste

Crie um arquivo calculator.test.js dentro da pasta test e escreva um teste para a função de adição.

// test/calculator.test.js
const { expect } = require('chai');
const { add } = require('../src/calculator');

describe('Calculator', () => {
  describe('add', () => {
    it('should return the sum of two numbers', () => {
      const result = add(2, 3);
      expect(result).to.equal(5);
    });
  });
});

Passo 3: Executando os Testes

6. Adicionando um Script de Teste

Adicione um script de teste no arquivo package.json.

"scripts": {
  "test": "mocha"
}

7. Rodando os Testes

Execute os testes usando o comando npm.

npm test

Testes Avançados

8. Testando Funções Assíncronas

Mocha suporta a execução de testes assíncronos utilizando callbacks ou async/await. Vamos modificar o calculator.js para incluir uma função de adição assíncrona.

// src/calculator.js
function add(a, b) {
  return a + b;
}

function addAsync(a, b) {
  return new Promise((resolve) => {
    setTimeout(() => resolve(a + b), 100);
  });
}

module.exports = { add, addAsync };

Atualize o arquivo de teste para incluir testes assíncronos.

// test/calculator.test.js
const { expect } = require('chai');
const { add, addAsync } = require('../src/calculator');

describe('Calculator', () => {
  describe('add', () => {j
    it('should return the sum of two numbers', () => {
      const result = add(2, 3);
      expect(result).to.equal(5);
    });
  });

  describe('addAsync', () => {
    it('should return the sum of two numbers asynchronously', async () => {
      const result = await addAsync(2, 3);
      expect(result).to.equal(5);
    });
  });
});

9. Testando Erros

Chai também permite que você verifique se uma função lança um erro esperado.

// src/calculator.js
function subtract(a, b) {
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw new Error('Both arguments must be numbers');
  }
  return a - b;
}

module.exports = { add, addAsync, subtract };

Adicione testes para a função de subtração que lança um erro.

// test/calculator.test.js
const { expect } = require('chai');
const { add, addAsync, subtract } = require('../src/calculator');

describe('Calculator', () => {
  describe('add', () => {
    it('should return the sum of two numbers', () => {
      const result = add(2, 3);
      expect(result).to.equal(5);
    });
  });

  describe('addAsync', () => {
    it('should return the sum of two numbers asynchronously', async () => {
      const result = await addAsync(2, 3);
      expect(result).to.equal(5);
    });
  });

  describe('subtract', () => {
    it('should return the difference of two numbers', () => {
      const result = subtract(5, 3);
      expect(result).to.equal(2);
    });

    it('should throw an error if arguments are not numbers', () => {
      expect(() => subtract(5, 'a')).to.throw('Both arguments must be numbers');
    });
  });
});

Integração Contínua

10. Configurando GitHub Actions

Você pode configurar um fluxo de trabalho de integração contínua (CI) com GitHub Actions para executar seus testes automaticamente a cada commit.

Crie um arquivo .github/workflows/nodejs.yml com a seguinte configuração:

name: Node.js CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x, 16.x]

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}

      - name: Install dependencies
        run: npm install

      - name: Run tests
        run: npm test

Conclusão

Testes automatizados são essenciais para a qualidade do software. Em conclusão Mocha e Chai fornecem uma combinação poderosa para escrever e executar testes em Node.js. Portanto neste guia, cobrimos desde a configuração do ambiente até a escrita e execução de testes básicos e avançados. Implementar testes automatizados em seu fluxo de desenvolvimento ajuda a detectar e corrigir erros rapidamente, garantindo que seu software funcione conforme o esperado.


Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *