# Casos de Teste

Um **Caso de Teste** é uma configuração que inclui um conjunto definido de entradas, condições e resultados esperados usados para verificar se um pipeline de integração específico está funcionando conforme o esperado. Casos de teste são especialmente úteis para melhorar a qualidade das integrações e documentar o comportamento esperado dos seus fluxos.

Eles permitem:

* Simular diversas condições de entrada.
* Simular respostas de conectores.
* Comparar automaticamente os resultados reais com os esperados.

## **Criando um Caso de Teste**

1. No menu lateral no Canvas, acesse **Fluxo**.
2. Clique em **Criar novo caso de teste**.

<figure><img src="https://2518718503-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcO0A6g1dOsu8BiHYqO67%2Fuploads%2FV1ASrKOBVo91mOWuvfw1%2Fcriar-caso-de-teste.gif?alt=media&#x26;token=fc78d800-87e8-413c-ba67-bb2018df7b30" alt=""><figcaption></figcaption></figure>

{% stepper %}
{% step %}

### Defina as condições

Ao criar um caso de teste, é necessário configurar os elementos que definem o cenário:

#### **Payload**

O payload representa os dados de entrada do teste. Ao adicioná-lo, forneça:

* **JSON:** Dados de entrada em formato JSON. Você também pode [reutilizar payloads salvos anteriormente no Painel de Execução](https://docs.digibee.com/documentation/developer-guide/pt-br/development-cycle/build-overview/execution-panel#coluna-payload) do pipeline clicando em **Carregar para editar**.
* **Nome:** Um nome para o payload.
* **Descrição:** Uma breve descrição explicando o contexto ou o propósito do payload.

#### **Respostas Mock**

Respostas mock permitem emular as saídas de conectores, útil para validar fluxos em diferentes condições. Ao criar uma resposta, forneça:

* **Conector:** O conector cuja resposta você deseja simular.
* **JSON:** A resposta simulada em formato JSON.
* **Nome:** Um nome para a resposta simulada.
* **Descrição:** Uma breve explicação do cenário representado pela simulação.

Para simular mais conectores, clique em **Adicionar mais mocks**.

#### **Resultados Esperados**

O resultado esperado define a saída que o fluxo deve produzir após a execução. Ele é usado para validar a execução ao comparar o resultado real com o resultado esperado, por meio de condições e operadores configuráveis.

<figure><img src="https://2518718503-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcO0A6g1dOsu8BiHYqO67%2Fuploads%2FIkj6siI2lr7ZKiSnWw5y%2FCasos%20de%20Teste%20-%20Resultados%20Esperados.gif?alt=media&#x26;token=bc35acbb-65f1-4eb7-97e1-3e1383d16caf" alt=""><figcaption></figcaption></figure>

Comece informando os seguintes dados:

* **Nome:** Um identificador único para a asserção.
* **Descrição:** Uma breve explicação do que está sendo validado.

Em seguida, adicione uma ou mais condições. Para adicionar uma condição, clique em **Adicionar condição** e configure os seguintes campos:

* **JSONPath:** A expressão JSONPath que aponta para o campo do resultado a ser avaliado.
* **Operador:** O operador de comparação usado para validar o resultado. As opções disponíveis são:
  * **Igual a, Diferente de:** Verifica se o valor retornado é igual ou diferente do valor esperado.
  * **Maior que, Maior ou igual a:** Verifica se o valor retornado é maior ou maior ou igual ao valor esperado.
  * **Menor que, Menor ou igual a:** Verifica se o valor retornado é menor ou menor ou igual ao valor esperado.
  * **É Verdadeiro, É Falso:** Valida se o valor retornado é um booleano definido como `true` ou `false`.
  * **É Nulo, Não É Nulo:** Valida se o valor retornado é `null` ou está definido.
  * **Está em, Não está em:** Valida se o valor retornado pertence ou não a um conjunto definido de valores.
  * **Está Vazio, Não Está Vazio:** Verifica se o valor retornado está vazio ou contém ao menos um valor, elemento ou propriedade.
  * **Contém, Não Contém:** Verifica se o valor retornado contém ou não o conteúdo esperado.
* **Valor:** O valor esperado a ser comparado. Pode ser um Valor Simples ou um Objeto JSON. Use o seletor do campo para alternar entre os formatos.

{% hint style="info" %}
Alguns operadores realizam verificações de estado e não exigem um valor para comparação, como **É Verdadeiro**, **É Falso**, **É Nulo**, **Não É Nulo**, **Está Vazio** e **Não Está Vazio**.
{% endhint %}

É possível combinar várias condições usando os seguintes operadores lógicos:

* `AND`
* `OR`
  {% endstep %}

{% step %}

### Documente o teste

Antes de salvar, forneça:

* **Nome:** Nome único para identificar o caso de teste.
* **Descrição:** Breve explicação do caso, incluindo o propósito ou cenário testado.
* **Grupo:** Um grupo para organizar o caso de teste. Clique em **Crie seu primeiro grupo** para começar a agrupar seus casos de teste ou selecione um grupo existente para atribuir o caso
  {% endstep %}

{% step %}

### Salve o teste

Após preencher todas as informações obrigatórias, clique em Salvar.

{% hint style="info" %}
O caso de teste deve conter pelo menos nome e resultado esperado para ser salvo.
{% endhint %}

O caso de teste aparecerá no menu lateral, em **Fluxo**. Clique no ícone de três pontos para:

* **Editar:** Editar configurações do teste.
* **Remover:** Excluir o teste.
* **Duplicar:** Criar uma cópia do teste.
* **Execução única:** Executar o teste.
* **Abrir execução:** Disponível após a execução do teste.
  {% endstep %}
  {% endstepper %}

## **Executando o Caso de Teste**

Para executar o caso de teste:

1. Verifique se o fluxo está conectado a um trigger. Sem isso, o teste não será executado.
2. No menu lateral, localize o teste e clique nos três pontos.
3. Selecione **Execução única**.
4. A plataforma executará o teste e comparará a saída com o esperado:

* **Se passar:** Um ícone de sucesso verde será exibido.
* **Se falhar:** Um ícone de falha vermelho será exibido.

5\. Para ver os detalhes no **Painel de Execução**, clique em **Abrir execução**. Mais informações podem ser encontradas na aba **Resultados**. Você também pode expandir a seção **Mensagens** no painel lateral esquerdo para analisar a saída de cada conector individualmente.

<figure><img src="https://2518718503-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcO0A6g1dOsu8BiHYqO67%2Fuploads%2Flhy3Mb0rnCGTnpos9VJV%2Fexecutar-caso-de-teste.gif?alt=media&#x26;token=2b44ae84-1e46-4922-8551-2f406a590b80" alt=""><figcaption></figcaption></figure>

## **Exemplo: Adicionar data de nascimento padrão**

* **Caso de uso:** Você quer garantir que uma data de nascimento padrão seja adicionada quando ela estiver ausente no JSON de entrada.
* **Objetivo:** Usar o **Transformer (JOLT) V2** para adicionar o campo `"dataNascimento": "01/01/1970"` quando ele não estiver presente na entrada.

### **Visão geral do pipeline**

Este pipeline usa um único conector:

* [**Transformer (JOLT) V2**](https://app.gitbook.com/s/SKBJ6ZiEWBU93x170HH4/connectors/tools/jolt-v2)**:** Adiciona uma data de nascimento padrão se ela estiver ausente no payload de entrada.

Vamos testar essa transformação usando um caso de teste com uma entrada que não inclui o campo `dataNascimento`.

### **Etapa 1: Configurar o Transformer JOLT (V2)**

Usaremos a operação `default` para adicionar um campo quando ele ainda não existir.

**Especificação JOLT:**

```json
[    
 {
   "operation": "default",
   "spec": {
     "cliente": {
       "dataNascimento": "01/01/1970"
     }
   }
 }
]
```

Essa especificação verifica se o campo `dataNascimento` existe dentro de `cliente`. Caso não exista, ele é adicionado com o valor padrão `”01/01/1970”`.

### **Etapa 2: Criar o Caso de Teste**

Vamos simular um payload que contém apenas o nome e o CPF, e verificar se o conector Transformer (JOLT) adiciona a data de nascimento padrão.

* **Payload:**

```json
{
 "cliente": {
   "nome": "Cliente Padrão",
   "cpf": "123.456.789-01"
 }
}
```

* **Resposta Mock:** *(Deixe em branco neste exemplo)*
* **Resultado Esperado:**
  * **JSONPath:** `$.cliente`
  * **Valor:**

```json
{
   "nome": "Cliente Padrão",
   "cpf": "123.456.789-01",
   "dataNascimento": "01/01/1970"
}
```

### **Validação do resultado**

Após a execução do caso de teste, a saída é a seguinte:

```json
{
  "cliente": {
   	"nome": "Cliente Padrão",
   	"cpf": "123.456.789-01",
   	"dataNascimento": "01/01/1970"
  }
}
```

Isso confirma que o teste foi bem-sucedido:

* O **Transformer (JOLT) V2** aplicou a operação `default` conforme o esperado.
* Como o campo `dataNascimento` não estava presente na entrada original, ele foi adicionado com o valor padrão `”01/01/1970”`.

## **Exemplo: Organizar catálogo de produtos**

* **Caso de uso:** Você quer reestruturar os dados de produto retornados de um banco de dados em um novo formato.
* **Objetivo:** Agrupar os detalhes do produto dentro de um objeto `detalhes` e renomear campos para melhor organização.

### **Visão geral do pipeline**

Este pipeline usa os seguintes conectores:

1. [**DB V2**](https://app.gitbook.com/s/SKBJ6ZiEWBU93x170HH4/connectors/structured-data/db-v2): Recupera os dados do produto.
2. [**Transformer (JOLT) V2**](https://app.gitbook.com/s/SKBJ6ZiEWBU93x170HH4/connectors/tools/jolt-v2): Reorganiza e renomeia os campos usando a operação `shift`.

Como não temos acesso ao banco de dados real, vamos simular essa resposta com um caso de teste usando uma resposta simulada do conector DB V2.

### **Etapa 1: Configurar o Transformer JOLT (V2)**

Vamos usar a operação `shift` do JOLT para mapear e reorganizar os campos.

**Especificação JOLT:**

```json
[
  {
    "operation": "shift",
    "spec": {
      "produto": {
        "id": "idProduto",
        "nome": "detalhes.nome",
        "marca": "detalhes.marca",
        "preço": "detalhes.preço.valor",
        "moeda": "detalhes.preço.moeda",
        "estoque": "detalhes.disponibilidade"
      }
    }
  }
]
```

Essa especificação renomeia `id` para `idProduto` e organiza os demais campos dentro do objeto `detalhes`.

### **Etapa 2: Criar o caso de teste**

Vamos simular a resposta do banco de dados e validar a transformação.

* **Payload:** *(Deixe em branco neste exemplo)*
* **Resposta Mock:**
  * **Conector:** DB V2
  * **Payload JSON:**

```json
{
  "produto": {
    "id": "12345",
    "nome": "Smartphone X1",
    "marca": "TechBrand",
    "preço": 699.99,
    "moeda": "BRL",
    "estoque": 25
  }
}
```

* **Resultado Esperado:**
  * **JSONPath:** `$.detalhes`
  * **Valor:**

```json
{
    "nome": "Smartphone X1",
    "marca": "TechBrand",
    "preço": {
      "valor": 699.99,
      "moeda": "BRL"
    },
    "disponibilidade": 25
  }
```

### **Validação do resultado**

Após a execução do caso de teste, a saída é a seguinte:

```json
{
  "idProduto": "12345",
  "detalhes": {
    "nome": "Smartphone X1",
    "marca": "TechBrand",
    "preço": {
      "valor": 699.99,
      "moeda": "BRL"
    },
    "disponibilidade": 25
  }
}
```

Isso confirma que o teste foi bem-sucedido:

* O **Transformer (JOLT) V2** aplicou a especificação corretamente para reestruturar os dados de entrada.
* Os campos foram renomeados e organizados dentro do objeto `detalhes`, conforme o planejado.
* O campo `idProduto` permaneceu no nível superior, enquanto os demais atributos foram agrupados logicamente dentro de `detalhes`.
