Sobes.tech
Middle+

Quais são as características do teste de microserviços ao nível de componentes e módulos em comparação com o teste de aplicações monolíticas?

sobes.tech IA

Resposta da IA

Os testes de microserviços ao nível de componentes e módulos concentram-se na isolação e interação de serviços individuais, ao contrário dos testes em aplicações monolíticas, onde o teste abrange toda a base de código no seu conjunto.

Características dos testes de microserviços:

  • Isolamento de serviços: Testar cada microserviço separadamente, independentemente dos outros. Isto permite identificar rapidamente problemas num serviço específico.
  • Testes de contrato (Contract Testing): Verificar a interação entre serviços para garantir que trocam dados corretamente e cumprem os contratos API predefinidos. Ferramentas populares: Pact.
  • Testes de integração: Verificar a interação de vários microserviços entre si e com dependências externas (bases de dados, filas de mensagens). A complexidade reside na gestão de múltiplas dependências.
  • Gestão de dados de teste: Gerar e manter dados de teste para cada serviço separadamente, considerando as suas possíveis dependências de dados de outros serviços.
  • Orquestração de testes: Coordenar a execução de testes para diferentes microserviços, especialmente em testes de integração.
  • Testes de resistência e elasticidade: Verificar o comportamento dos serviços em caso de falhas de outros serviços ou alta carga.
  • Infraestrutura de testes: Requer uma infraestrutura de testes mais complexa para implementar e gerir múltiplos microserviços e os seus ambientes.
  • Testes de segurança: Focadas na verificação de autenticação, autorização e outros aspetos de segurança ao nível de cada serviço e na sua interação.

Comparação com monolitos:

Aspeto Aplicação monolítica Microserviços
Alcance dos testes Testar toda a base de código como um todo. Testar cada serviço isoladamente, e depois a sua integração.
Dependências Dependências internas dentro de uma mesma base de código. Dependências externas em rede entre serviços independentes.
Dados de teste Podem estar centralizados. Requerem gestão para cada serviço separadamente, considerando as dependências.
Integração Testar a integração de módulos dentro de um único processo. Testar a interação de serviços através da rede.
Resiliência Menos relevante ao nível de módulos, mais ao nível de toda a aplicação. É crítico testar o comportamento em caso de falhas de serviços individuais.
Complexidade Os testes podem ser mais simples em termos de infraestrutura, mas mais difíceis em isolamento. Os testes são mais complexos em infraestrutura e gestão de dependências, mas mais simples em isolamento de serviços.

Exemplo de Contract Test usando Pact:

// pact_broker/pacts/consumer-producer/latest.json
{
  "consumer": {
    "name": "MyConsumer"
  },
  "provider": {
    "name": "MyProducer"
  },
  "interactions": [
    {
      "description": "Uma requisição para obter usuário por ID",
      "request": {
        "method": "GET",
        "path": "/users/123",
        "headers": {
          "Accept": "application/json"
        }
      },
      "response": {
        "status": 200,
        "headers": {
          "Content-Type": "application/json"
        },
        "body": {
          "id": 123,
          "name": "John Doe"
        }
      }
    }
  ],
  "metadata": {
    "pactRust": {
      "version": "1.0.0"
    },
    "pactSpec": {
      "version": "3.0.0"
    }
  }
}

Este exemplo JSON descreve o contrato entre o consumidor (MyConsumer) e o fornecedor (MyProducer), especificando a requisição e resposta esperadas para obter um usuário por ID. O consumidor irá gerar um contrato semelhante do seu lado, e o fornecedor irá verificar se a sua API está de acordo com esse contrato.