Testes de Integração 🔗
Tags: javascript, testing, jest, softwaredevelopment
Published: 2024-04-07 18:43:47

O objetivo principal dos **testes de integração** é ter uma maior assertividade e conseguir interagir com o sistema real. Eles ajudam a garantir que as diversas partes do seu sistema como módulos individuais, serviços ou funções trabalhem juntas como esperado.

Ao invés de testar partes isoladas do código (como funções individuais ou classes), é testado como diferentes partes funcionam juntas. Isso inclui **interações** com bancos de dados, APIs externas ou qualquer outro serviço que seu aplicativo use.

O **objetivo** desses testes é garantir que todos os módulos ou serviços do seu aplicativo trabalhem junto quando combinados, detectando problemas que podem não ser visíveis em testes de unidade.

---


## Exemplo: Agenda de Compromissos 📅
Digamos que você está trabalhando em um sistema de agenda para gerenciar compromissos, e quer testar se a lógica de adicionar e listar compromissos está funcionando corretamente, incluindo a interação com um banco de dados real.

```
// Agenda.js
class Agenda {
  constructor(database) {
    this.database = database;
  }

  addAppointment(appointment) {
    // Código para adicionar um compromisso ao banco de dados
  }

  listAppointments() {
    // Código para listar compromissos do banco de dados
  }
}

module.exports = Agenda;

```

Em seguida, você escreve um teste de integração para verificar se a adição e listagem de compromissos estão funcionando como esperado:

```
// Agenda.test.js
const Agenda = require('./Agenda');
const Database = require('./Database'); // Uma classe que representa o seu banco de dados real

describe('Agenda Integration Test', () => {
  it('should add and list appointments', async () => {
    const database = new Database();
    const agenda = new Agenda(database);

    await agenda.addAppointment({ /* dados do compromisso */ });
    await agenda.addAppointment({ /* dados do compromisso */ });
    await agenda.addAppointment({ /* dados do compromisso */ });

    const appointments = await agenda.listAppointments();

    expect(appointments).toHaveLength(3);
  });
});

```
**Importante:** Nesse exemplo, você não usa mocks ou stubs, pois o objetivo é interagir com o sistema real, como um banco de dados. Assim, você terá uma instância real do banco de dados em seu teste, que deve estar configurado para um ambiente de teste, idealmente usando uma base de dados que possa ser limpa ou recriada antes de cada teste para garantir a consistência.

---

Testes de integração geralmente são mais **lentos** do que testes de unidade devido à sua complexidade e à necessidade de interagir com sistemas externos.

Ao executar testes de integração, você está verificando não apenas a **lógica do negócio**, mas também a **integração** dessa lógica com outras partes do sistema, assegurando que o sistema como um todo funcione conforme o esperado.

---

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.

---