Conjuntos de Testes e Casos de Teste

Você pode criar um caso de teste para diferentes casos de uso. Você cria um desses casos de teste com base em JSON ou gravando conversas no Testador de Conversa. Esses casos de teste fazem parte dos metadados da habilidade para que eles persistam nas versões.

Por causa disso, você pode executar esses casos de teste para garantir que quaisquer extensões feitas à habilidade não tenham quebrado a funcionalidade básica. Os casos de teste não se limitam apenas a preservar as funções principais. Você os usa para testar novos cenários. À medida que sua habilidade evolui, você pode retirar os casos de teste que falham continuamente por causa das alterações que foram introduzidas por meio de extensões.

Todos os casos de teste pertencem a um conjunto de testes, contêineres que permitem particionar seus testes. Nós fornecemos um conjunto de testes chamado Conjunto de Testes Padrão, mas você também pode criar o seu próprio. A página Suítes de Teste lista todas as suítes de teste e os casos de teste que pertencem a elas. Os conjuntos de testes listados nesta página podem ser aqueles que você criou ou podem ter sido herdados de uma habilidade estendida ou clonada. Você pode usar esta página para criar e gerenciar suítes de teste e casos de teste e compilar casos de teste em execuções de teste.
Veja a seguir a descrição do teste suites.png
Descrição da ilustração test-suites.png

Adicionar Casos de Teste

Se você estiver criando uma habilidade do zero ou estendendo uma habilidade, poderá criar um caso de teste para cada caso de uso. Por exemplo, você pode criar um caso de teste para cada tipo de payload. Você pode criar uma suíte inteira de casos de teste para uma habilidade apenas gravando conversas ou criando arquivos JSON que definem objetos de mensagem.

Criar um Caso de Teste com Base em uma Conversa

A gravação das conversas é mais rápida e menos propensa a erros do que a definição de um arquivo JSON. Para criar um caso de teste com base em uma conversa:
  1. Abra a habilidade ou o assistente digital para o qual deseja criar o teste.
  2. Na barra de ferramentas na parte superior da página, clique em Visualizar.
    Esta é uma imagem do ícone Visualizar na margem superior.

  3. Clique em Testador de Bot.
  4. Selecione o canal.
    Observação

    Os casos de teste são específicos do canal: a conversa de teste, como é tratada pelo canal selecionado, é o que é registrado para um caso de teste. Por exemplo, os casos de teste registrados usando um dos canais baseados em texto do Testador de Habilidades não podem ser usados para testar a mesma conversa no Canal Oracle Web.
  5. Informe as declarações específicas do comportamento ou da saída que você deseja testar.
  6. Clique em Salvar como Teste.
    Uma imagem do botão Salvar como Teste

  7. Preencha a caixa de diálogo Salvar Conversa como Caso de Teste:
    • Se necessário, exclua o caso de teste das execuções de teste desativando Ativado.
    • Se você estiver executando um caso de teste para conversas ou mensagens que tenham ações de postback, poderá ativar Ignorar Variáveis de Postback para permitir que o caso de teste seja aprovado ignorando as diferenças entre a mensagem esperada e a mensagem real no nível da variável de postback.
    • Informe um nome e um nome para exibição que descreve o teste.
    • Como etapa opcional, adicione detalhes no campo Descrição que descrevam como o caso de teste valida o comportamento esperado para um cenário ou caso de uso.
    • Se necessário, selecione uma suíte de teste diferente da Suíte de Teste Padrão na lista Suíte de Teste.
    • Para testar os diferentes valores de parâmetro que os usuários podem informar em suas solicitações ou respostas, adicione matrizes ao objeto no campo Parâmetros de Entrada para cada parâmetro de entrada e substitua os placeholders correspondentes para a entrada do usuário que você está testando na área de texto Conversa. Por exemplo, informe um array {"AGE":["24","25","26"]} no campo Parâmetros de Entrada e ${"AGE"} (o espaço reservado) na área de texto Conversa.
    • Se as respostas da habilidade ou do assistente digital incluírem informações dinâmicas, como timestamps, que farão com que os casos de teste falhem continuamente, substitua a definição de variável que preenche esses valores por um placeholder formatado como ${MY_VARIBALE_NAME}.
  8. Clique em Adicionar à Suíte.

Adicionar Parâmetros de Entrada para Mensagens do Usuário

Ao adicionar espaços reservados variáveis para garantir que os casos de teste sejam aprovados quando as mensagens de habilidade tiverem valores em constante alteração, você adiciona parâmetros de entrada para testar uma variedade de valores nas mensagens do usuário. Os parâmetros de entrada simplificam o teste porque permitem executar várias variações de um único caso de teste. Sem eles, você precisaria criar casos de teste duplicados para cada valor de parâmetro. No entanto, devido à flexibilidade oferecida pelos parâmetros de entrada, você pode gerar vários resultados de teste apenas adicionando uma matriz para os valores de parâmetro de entrada na definição do caso de teste. Quando você executa o caso de teste, resultados de teste separados são gerados para cada elemento na definição da matriz de parâmetros de entrada. Uma matriz de três pares chave-valor de parâmetro de entrada resulta em uma execução de teste com três resultados de teste, por exemplo. A numeração desses resultados é baseada no índice do elemento de array correspondente.
Veja a seguir a descrição da entrada-parâmetros-teste-execução-results.png
Descrição da ilustração input-parameters-test-run-results.png

Para adicionar parâmetros de entrada ao seu caso de teste, substitua o valor text no payload da mensagem do usuário por um espaço reservado e defina um array correspondente de valores de parâmetro:
  1. Na exibição Testador de Bot, clique em Salvar como Teste.
  2. Na área de texto Conversa, substitua o valor do campo text em uma mensagem do usuário ({"source": "user", ...}) por uma expressão FreeMarker do Apache que nomeia o parâmetro de entrada. Por exemplo, "${AGE}" no seguinte trecho de código:
       {
            "source": "user",
            "messagePayload": {
                "type": "text",
                "text": "${AGE}",
                "channelExtensions": {
                    "test": {
                        "timezoneOffset": 25200000
                    }
                }
            }
        },
  3. Clique em Imagem do símbolo de seta que expande o campo.para expandir o campo Parâmetros de Entrada.
    O ícone de seta para expandir o campo.

  4. No objeto de campo Parâmetros de Entrada ({}), adicione pares de chave/valor para cada parâmetro. Os valores devem ser matrizes de valores de string. Por exemplo :
    {"AGE":["24","25","26"], "CRUST": ["Thick","Thin"]}


    Veja alguns pontos a serem observados ao definir parâmetros de entrada:
    • Usar somente matrizes – Os parâmetros de entrada devem ser definidos como matrizes, não como strings. {"NAME": "Mark"} resulta em falha no resultado do teste, por exemplo.
    • Use valores de string em sua matriz – Todos os elementos da matriz devem ser strings. Se você inserir um elemento como um valor inteiro ({"AGE": ["25", 26]}, por exemplo), ele será convertido em uma string. Nenhum resultado de teste é gerado para valores nulos. { "AGE": [ "24", "25", null ] } resulta em dois resultados de teste, não três.
    • Use uso de maiúsculas e minúsculas consistente – O uso de maiúsculas e minúsculas para a chave e o espaço reservado na expressão FreeMarker deve corresponder. Casing incompatível (Age e AGE, por exemplo), fará com que o caso de teste falhe.
  5. Clique em Adicionar à Suíte.

Adicionar Placeholders da Variável

As variáveis com valores em constante mudança nas respostas da habilidade ou do assistente digital farão com que os casos de teste falhem quando a execução do teste comparar o valor real com o valor esperado. Você pode excluir informações dinâmicas da comparação substituindo um placeholder formatado como ${MY_VARIBALE_NAME} na resposta da habilidade. Por exemplo, um valor temporal, como o retornado pela operação de data FreeMarker do Apache ${.now?string.full}, fará com que os casos de teste falhem continuamente devido à incompatibilidade do horário em que o caso de teste foi registrado e o horário em que o caso de teste foi executado.
Veja a seguir a descrição da view-variable-value-difference.png
Descrição da ilustração view-variable-value-difference.png

Para permitir que esses casos de teste sejam aprovados, substitua o valor do tempo de conflito no objeto messagePayload do bot na área de texto Conversa por um espaço reservado. Por exemplo, ${ORDER_TIME} substitui uma string de data como Monday, April 8, 2024 7:42:46 PM UTC no seguinte:
{
        "source": "bot",
        "messagePayload": {
            "type": "text",
            "text": "You placed an order at ${ORDER_TIME} for a large Veggie pizza on thin crust. Your order will be delivered to your home at 04:30 PM."
        }
    }


Observação

Para casos de teste recém-criados, o campo Variável registra o placeholder SYSTEM_BOT_ID que é automaticamente substituído pelos valores system.botId que mudam quando a habilidade é importada de outra instância ou clonada.

Criar um Caso de Teste com Base em um Objeto JSON

Você cria um caso de teste com base em um objeto de array de objetos de mensagem clicando primeiro em + Caso de Teste na página Conjunto de Testes e, em seguida, preenchendo a caixa de diálogo Novo Caso de Teste. As propriedades são as mesmas dos casos de teste registrados, exceto que você deve preencher a janela Conversas do array ([]) com os objetos de mensagem. Este é o modelo para os diferentes tipos de payload:
    {
        source: "user",             //text only message format is kept simple yet extensible.
        type: "text"
        payload: {
            message: "order pizza" 
        }
    },{
        source: "bot",
        type: "text",
        payload: {
            message: "how old are you?"
            actions: [action types --- postback, url, call, share],  //bot messages can have actions and globalActions which when clicked by the user to send specific JSON back to the bot.
            globalActions: [...]
        }
    },
    {
        source: "user",
        type: "postback"
        payload: {      //payload object represents the post back JSON sent back from the user to the bot when the button is clicked
            variables: {
                accountType: "credit card"
            }, 
            action: "credit card", 
            state: "askBalancesAccountType"
        }
    },
    {
        source: "bot",
        type: "cards"
        payload: {
            message: "label"
            layout: "horizontal|vertical"
            cards: ["Thick","Thin","Stuffed","Pan"],    // In test files cards can be strings which are matched with button labels or be JSON matched  
            cards: [{
                title: "...",
                description: "..."
                imageUrl: "...",
                url: "...",
                actions: [...]  //actions can be specific to a card or global
            }],
            actions: [...],
            globalActions: [...]
        }
         
    },
    {
        source: "bot|user",
        type: "attachment"  //attachment message could be either a bot message or a user message    
        payload: {
            attachmentType: "image|video|audio|file"
            url: "https://images.app.goo.gl/FADBknkmvsmfVzax9"
            title: "Title for Attachment"
        }   
    },
    {
        source: "bot",
        type: "location"       
        payload: {
            message: "optional label here"
            latitude: 52.2968189
            longitude: 4.8638949
        }
    },
    {
        source: "user",
        type: "raw"
        payload: {
            ... //free form application specific JSON for custom use cases. Exact JSON matching
        }
    }
    ...
    //multiple bot messages per user message possible.]
}
 

Executar Casos de Teste

Você pode criar execuções de teste para um único caso de teste, um subconjunto de casos de teste ou para todo o conjunto de casos de teste listados na página Conjunto de Testes. À medida que sua habilidade evolui, você pode precisar retirar casos de teste que estão fadados a falhar por causa das alterações que foram deliberadamente feitas em uma habilidade. Você também desativa temporariamente um caso de teste devido ao desenvolvimento contínuo.
Observação

Não é possível excluir um caso de teste herdado, só é possível desativá-lo.
Após a conclusão da execução do teste, clique na guia Resultados da Execução do Teste para descobrir quais casos de teste foram aprovados ou falharam.
Veja a seguir a descrição da execução do teste-results.png
Descrição da ilustração test-run-results.png

Exibir Resultados da Execução do Teste

A página Resultados da Execução de Teste lista as execuções de teste recentemente executadas e seus resultados. Os casos de teste compilados na execução do teste são aprovados ou falham de acordo com uma comparação da saída esperada registrada na definição de caso de teste e na saída real. Se as duas corresponderem, o caso de teste será aprovado. Caso contrário, o caso de teste falhará. Quando os casos de teste falharem, você poderá descobrir por que clicar em Exibir Diferenças.
O botão Exibir Diferenças

Observação

Os resultados da execução do teste de cada habilidade são armazenados por um período de 14 dias, após o qual são removidos do sistema.

Revisar Casos de Teste com Falha

O relatório lista os pontos de falha no nível da mensagem, com a coluna Elemento da Mensagem observando a posição da mensagem da habilidade na conversa do caso de teste. Para cada mensagem, o relatório fornece uma comparação de alto nível das cargas úteis esperadas e reais. Para fazer drill-down para ver essa comparação em detalhes – e para reconciliar as diferenças para permitir que esse caso de teste seja aprovado em execuções de teste futuras – clique no menu Ações.
Veja a seguir a descrição do menu.png de nível superior
Descrição da ilustração de nível superior - menu.png

Corrigir Casos de Teste com Falha

Quando necessário, você pode usar as ações Aplicar Valor Real, Ignorar Diferença e Adicionar para corrigir um caso de teste (ou partes de um caso de teste) para evitar que ele falhe na próxima vez que for executado. As opções no menu Ações são específicas do nó, portanto, as ações no nível da mensagem diferem daquelas em pontos inferiores na passagem.
  • Expandir Tudo – Expande os nós de objeto da mensagem.
  • Exibir Diferença – Fornece uma comparação lado a lado da saída real e esperada. A visualização varia dependendo do nó. Por exemplo, você pode exibir uma única ação ou toda a matriz de ações. Você pode usar essa ação antes de reconciliar a saída real e esperada.

  • Ignorar Diferença – Escolha essa ação quando valores conflitantes não afetarem a funcionalidade. Se você tem várias diferenças e não quer passar por elas uma a uma, você pode escolher essa opção. No nível de postback, por exemplo, você pode aplicar valores reais individualmente ou ignorar diferenças para todo o objeto de postback.
  • Aplicar Valor Real – Algumas alterações, por menores que sejam, podem fazer com que muitos casos de teste falhem na mesma execução. Geralmente esse é o caso de alterações em strings de texto, como prompts ou rótulos. Por exemplo, alterar um prompt de texto de "Qual tamanho de pizza você deseja?" para "Qual o tamanho da pizza?" fará com que qualquer caso de teste que inclua esse prompt falhe, mesmo que a funcionalidade da habilidade permaneça inalterada. Embora você possa acomodar essa alteração gravando novamente o caso de teste, é possível atualizar rapidamente a definição do caso de teste com o prompt revisado clicando em Aplicar Valor Real. Como o caso de teste agora está de acordo com a nova definição de habilidade, o caso de teste será aprovado (ou pelo menos não falhará por causa do texto alterado) em futuras execuções de teste.
    Observação

    Embora você possa aplicar valores de string, como prompts e URLs, não é possível usar Aplicar Valor Real para corrigir um caso de teste quando uma alteração nos valores de uma entidade ou seu comportamento (desativar a função Extração Fora da Ordem, por exemplo) faz com que os valores fornecidos pelo caso de teste se tornem inválidos. A atualização de uma entidade fará com que o caso falhe porque a habilidade solicitará continuamente um valor que nunca receberá e suas respostas estarão fora de sintonia com a sequência definida pelo caso de teste.
  • Adicionar Expressão Regular – Você pode substituir uma expressão Regex para resolver valores de texto conflitantes. Por exemplo, você adiciona user* para resolver strings user e user1 conflitantes.
  • Adicionar – No nível de postback da passagem, as ações Adicionar são exibidas quando uma habilidade revisada inclui ações de postback que não estavam presentes no caso de teste. Para evitar que o caso de teste falhe devido à nova ação de postback, você pode clicar em Adicionar para incluí-lo no caso de teste. (Adicionar é semelhante a Aplicar Valor Real, mas no nível de postback.)
Observação

O conjunto de resultados de teste gerados para parâmetros de entrada refere-se ao mesmo caso de teste original, portanto, a reconciliação de um valor de parâmetro de entrada em um resultado de teste reconcilia simultaneamente os valores desse parâmetro de entrada no restante dos resultados de teste.

Importar e Exportar Casos de Teste

Você pode importar suítes de testes de uma versão da habilidade para outra quando estiver desenvolvendo versões paralelas da mesma habilidade ou trabalhando com clones.
  1. Para exportar um conjunto de teste, primeiro selecione o conjunto de teste (ou conjuntos de teste). Em seguida, clique em Mais > Exportar Suíte Selecionada ou Exportar Tudo. (Você também pode exportar todos os conjuntos de testes selecionando Exportar Testes no menu kebab
    Este é o menu kebab.

    no mosaico de habilidades.) O arquivo ZIP exportado contém uma pasta chamada testSuites que tem um arquivo JSON descrevendo o conjunto de testes exportado. Veja aqui um exemplo do formato JSON:
    {
      "displayName" : "TestSuite0001",
      "name" : "TestSuite0001",
      "testCases" : [ {
        "channelType" : "websdk",
        "conversation" : [ {
          "messagePayload" : {
            "type" : "text",
            "text" : "I would like a large veggie pizza on thin crust delivered at 4:30 pm",
            "channelExtensions" : {
              "test" : {
                "timezoneOffset" : 25200000
              }
            }
          },
          "source" : "user"
        }, {
          "messagePayload" : {
            "type" : "text",
            "text" : "Let's get started with that order"
          },
          "source" : "bot"
        }, {
          "messagePayload" : {
            "type" : "text",
            "text" : "How old are you?"
          },
          "source" : "bot"
        }, {
          "messagePayload" : {
            "type" : "text",
            "text" : "${AGE}",
            "channelExtensions" : {
              "test" : {
                "timezoneOffset" : 25200000
              }
            }
          },
          "source" : "user"
        }, {
          "messagePayload" : {
            "type" : "text",
            "text" : "You placed an order at ${ORDER_TIME} for a large Veggie pizza on thin crust. Your order will be delivered to your home at 04:30 PM."
          },
          "source" : "bot"
        } ],
        "description" : "Tests all values with a single utterance. Uses input parameters and variable values",
        "displayName" : "Full Utterance Test",
        "enabled" : true,
        "inputParameters" : {
          "AGE" : [ "24", "25", "26" ]
        },
        "name" : "FullUtteranceTest",
        "platformVersion" : "1.0",
        "trackingId" : "A0AAA5E2-5AAD-4002-BEE0-F5D310D666FD"
      } ],
      "trackingId" : "4B6AABC7-3A65-4E27-8D90-71E7B3C5264B"
    }
  2. Abra a página Suítes de Teste da habilidade de destino e clique em Mais > Importar.
  3. Navegue até o arquivo ZIP que contém a definição JSON das suítes de teste e selecione-o. Em seguida, clique em Fazer Upload.
  4. Depois que a importação for concluída, clique em Fazer Download do Relatório na notificação Confirmação para saber mais detalhes sobre a importação no arquivo JSON que está incluído no arquivo ZIP baixado.
    O link Fazer Download do Relatório na mensagem de notificação.

    Por exemplo:
    {
      "status" : "SUCCESS",
      "statusMessage" : "Successfully imported test cases and test suites. Duplicate and invalid test cases/test suites ignored.",
      "truncatedDescription" : false,
      "validTestSuites" : 2,
      "duplicateTestSuites" : 0,
      "invalidTestSuites" : 0,
      "validTestCases" : 2,
      "duplicateTestCases" : 0,
      "invalidTestCases" : 0,
      "validationDetails" : [ {
        "name" : "DefaultTestSuite",
        "validTestCases" : 1,
        "duplicateTestCases" : 0,
        "invalidTestCases" : 0,
        "invalidReasons" : [ ],
        "warningReasons" : [ ],
        "testCasesValidationDetails" : [ {
          "name" : "Test1",
          "invalidReasons" : [ ],
          "warningReasons" : [ ]
        } ]
      }, {
        "name" : "TestSuite0001",
        "validTestCases" : 1,
        "duplicateTestCases" : 0,
        "invalidTestCases" : 0,
        "invalidReasons" : [ ],
        "warningReasons" : [ ],
        "testCasesValidationDetails" : [ {
          "name" : "Test2",
          "invalidReasons" : [ ],
          "warningReasons" : [ ]
        } ]
      } ]
    }
Você só pode importar casos de teste válidos.
A caixa de diálogo de advertência para importações de caso de teste inválido

Para localizar a causa do resultado com falha, revise o array invalidReasons no arquivo importJSON submetido a download.
    "testCasesValidationDetails" : [ {
      "name" : "Test",
      "invalidReasons" : [ "INVALID_INPUT_PARAMETERS" ],
   ...