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 Conversas. Esses casos de teste fazem parte dos metadados da habilidade para que eles persistam nas versões.

Por isso, você pode executar esses casos de teste para garantir que quaisquer extensões feitas para a habilidade não tenham quebrado a funcionalidade básica. Os casos de teste não se limitam apenas a preservar as funções principais. Use-os 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 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 todos os suítes de teste e os casos de teste que pertencem a eles. Os conjuntos de testes listados nesta página podem ser aqueles que você criou ou podem ter sido herdados de uma habilidade que você estendeu ou clonou. 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.
Descrição da test-suites.png a seguir
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 da 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.
    Imagem do botão Save as Test

  7. Preencha a caixa de diálogo Salvar Conversa como Caso de Teste:
    • Se necessário, expulse o caso de teste das execuções de teste desativando Ativado.
    • Se você estiver executando um caso de teste para conversas ou mensagens que têm ações de postback, poderá ativar Ignorar Variáveis de Postback para permitir que o caso de teste passe 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 descreva o teste.
    • Como uma 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 um conjunto de testes diferente do Conjunto de Testes Padrão na lista Conjunto de Testes.
    • 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 placeholder) 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 placeholders 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 proporcionada 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 em sua definição de caso de teste. Quando você executa o caso de teste, são gerados resultados de teste separados para cada elemento na definição da matriz de parâmetros de entrada. Um array de três pares de 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.
A descrição da entrada-parameters-test-run-results.png segue
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 de mensagem 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 nomeie 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 Uma 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 do campo Parâmetros de Entrada ({}), adicione pares de valores-chave para cada parâmetro. Os valores devem ser matrizes de valores de string. Por exemplo :
    {"AGE":["24","25","26"], "CRUST": ["Thick","Thin"]}


    Veja a seguir algumas coisas a serem observadas ao definir parâmetros de entrada:
    • Use arrays somente - Os parâmetros de entrada devem ser definidos como arrays, não strings. {"NAME": "Mark"} resulta em um resultado de teste com falha, por exemplo.
    • Use string values 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 em três.
    • Use consistence casing (Usar maiúsculas e minúsculas consistentes) - A caixa da chave e o espaço reservado na expressão FreeMarker devem corresponder. Invólucro incompatível (Age e AGE, por exemplo), fará com que o caso de teste falhe.
  5. Clique em Adicionar à Suíte.

Adicionar Placeholders Variáveis

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 que está 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 por causa da incompatibilidade do horário em que o caso de teste foi registrado e do horário em que o caso de teste foi executado.
Segue 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 interferência 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 anota 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 matriz 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 gravados, 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, talvez você precise retirar casos de teste que provavelmente falharão por causa das alterações feitas deliberadamente 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.
Depois que a execução de teste for concluída, clique em a guia Resultados de Execução de Teste para descobrir quais dos casos de teste foram aprovados ou falharam.
A descrição da test-run-results.png segue
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 falham, você pode descobrir por que clicando em Exibir Diferenças.
O botão Exibir Diferenças

Observação

Os resultados da execução do teste para cada habilidade são armazenados por um período de 14 dias, após os quais 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 de habilidade na conversa do caso de teste. Para cada mensagem, o relatório fornece uma comparação de alto nível dos payloads esperados e reais. Para fazer drill-down e ver essa comparação em detalhes – e reconciliar as diferenças para permitir que esse caso de teste seja aprovado em execuções de teste futuras – clique no menu Ações.
Descrição da ilustração top-level-menu.png a seguir
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 travessia.
  • Expandir Tudo - Expande os nós do objeto de mensagem.
  • Exibir Diferença - Fornece uma comparação lado a lado da saída real e esperada. A view varia dependendo do nó. Por exemplo, você pode exibir uma única ação ou toda a matriz de ações. É possível usar essa ação antes de reconciliar a saída real e esperada.

  • Ignorar Diferença - Escolha esta ação quando os valores de bloqueio não afetarem a funcionalidade. Se você tiver várias diferenças e não quiser passar por elas um por um, 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 de novo o caso de teste, é possível atualizar rapidamente a definição do caso de teste com o prompt revisado clicando em Apply Actual Value. 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á devido ao texto alterado) em execuções de teste futuras.
    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 etapa 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 em conflito. Por exemplo, você adiciona user* para resolver strings user e user1 conflitantes.
  • Adicionar - No nível de postback da travessia, 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 do teste.

Importar e Exportar Casos de Teste

Você pode importar conjuntos 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 Suite Selecionada ou Exportar Tudo. (Você também pode exportar todos os conjuntos de testes selecionando Exportar Testes no menu kebab
    Este é o menu do kebab.

    no mosaico de habilidades.) O arquivo ZIP exportado contém uma pasta chamada testSuites que tem um arquivo JSON descrevendo a suíte de teste exportada. 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. Procure e selecione o arquivo ZIP que contém a definição JSON das suítes de teste. Em seguida, clique em Fazer Upload.
  4. Após a conclusão da importação, 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 submetido a download.
    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" : [ ]
        } ]
      } ]
    }
Só é possível importar casos de teste válidos.
A caixa de diálogo de advertência para importações inválidas de casos de teste

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" ],
   ...