テスト・スイートとテスト・ケース

様々なユース・ケースに対してテスト・ケースを作成できます。JSONから、または会話テスターで会話を記録して、これらのテスト・ケースのいずれかを作成します。これらのテスト・ケースは、スキル・メタデータの一部であるため、バージョン間で保持されます。

このため、これらのテスト・ケースを実行して、スキルに対する拡張によって基本機能が破損していないことを確認できます。テスト・ケースは、コア機能を保持するだけではありません。これらを使用して、新しいシナリオをテストします。スキルが進化するにつれて、拡張によって導入された変更のために継続的に失敗するテスト・ケースをリタイアできます。

すべてのテスト・ケースは、テストをパーティション化できるテスト・スイート・コンテナに属します。「デフォルト・テスト・スイート」というテスト・スイートが用意されていますが、独自のテスト・スイートを作成することもできます。「テスト・スイート」ページには、すべてのテスト・スイートと、それらに属するテスト・ケースがリストされます。このページにリストされているテスト・スイートは、作成したテスト・スイート、または拡張またはクローニングしたスキルから継承されたテスト・スイートです。このページでは、テスト・スイートとテスト・ケースの作成および管理、およびテスト実行へのテスト・ケースのコンパイルを行うことができます。
test_suites.pngの説明が続きます

テスト・ケースの追加

スキルを最初から作成するか、スキルを拡張するかにかかわらず、使用例ごとにテスト・ケースを作成できます。たとえば、各ペイロード・タイプのテスト・ケースを作成できます。単に会話を記録するか、メッセージ・オブジェクトを定義するJSONファイルを作成することによって、スキルに対してテスト・ケースのスイート全体を構築できます。

会話からのテスト・ケースの作成

会話の記録は、JSONファイルを定義するよりも迅速で、エラーが少なくなります。会話からテスト・ケースを作成するには:
  1. テストを作成するスキルまたはデジタル・アシスタントを開きます。
  2. ページ上部のツールバーで、「プレビュー」をクリックします。
    これは、上マージンにある「プレビュー」アイコンのイメージです。

  3. 「ボット・テスター」をクリックします。
  4. チャネルを選択します。
    ノート

    テスト・ケースはチャネル固有です。テスト会話は、選択したチャネルで処理されるため、テスト・ケースについて記録される内容です。たとえば、スキル・テスターのテキストベースのチャネルのいずれかを使用して記録されたテスト・ケースを使用して、Oracle Web Channelで同じ会話をテストすることはできません。
  5. テストする動作または出力に固有の発話を入力します。
  6. 「テストとして保存」をクリックします。
    「テストとして保存」ボタンのイメージ

  7. 「会話をテスト・ケースとして保存」ダイアログを完成させます:
    • 必要に応じて、「有効」をオフにして、テスト実行からテスト・ケースを除外します。
    • ポストバック・アクションがある会話またはメッセージに対してテスト・ケースを実行している場合は、「ポストバック変数の無視」をオンにすると、ポストバック変数レベルで予期されるメッセージと実際のメッセージの違いを無視して、テスト・ケースが合格するようにできます。
    • テストを説明する名前および表示名を入力します。
    • オプションのステップとして、テスト・ケースがシナリオまたはユース・ケースに対して予想される動作をどのように検証するかを説明する詳細を「説明」フィールドに追加します。
    • 必要に応じて、「テスト・スイート」リストから「デフォルト・テスト・スイート」以外のテスト・スイートを選択します。
    • ユーザーがリクエストまたはレスポンスに入力できる様々なパラメータ値をテストするには、各入力パラメータの「入力パラメータ」フィールドのオブジェクトにアレイを追加し、「会話」テキスト領域でテストするユーザー入力に対応するプレースホルダを置き換えます。たとえば、「入力パラメータ」フィールドに配列{"AGE":["24","25","26"]}、「会話」テキスト領域に${"AGE"} (プレースホルダ)を入力します。
    • スキルまたはデジタル・アシスタントのレスポンスに、テスト・ケースの継続的な失敗の原因となるタイムスタンプなどの動的情報が含まれている場合は、これらの値を移入する変数定義を、${MY_VARIBALE_NAME}として書式設定されたプレースホルダに置き換えます。
  8. 「スイートに追加」をクリックします。
    save_conversation_history_test_case.pngの説明が続きます

ユーザー・メッセージの入力パラメータの追加

スキル・メッセージの値が常に変更されている場合にテスト・ケースが合格するように変数プレースホルダを追加するときは、入力パラメータを追加してユーザー・メッセージの様々な値をテストします。入力パラメータを使用すると、1つのテスト・ケースの複数のバリエーションを実行できるため、テストが簡素化されます。これらがない場合、パラメータ値ごとに重複するテスト・ケースを作成する必要があります。ただし、入力パラメータには柔軟性があるため、テスト・ケース定義で入力パラメータ値の配列を追加するだけで、複数のテスト結果を生成できます。テスト・ケースを実行すると、入力パラメータ配列定義の各要素に対して個別のテスト結果が生成されます。3つの入力パラメータのキーと値のペアの配列は、たとえば、3つのテスト結果を持つテスト実行になります。これらの結果の番号付けは、対応する配列要素の索引に基づきます。
input_parameters_test_run_results.pngの説明が続きます

テスト・ケースに入力パラメータを追加するには、ユーザー・メッセージのメッセージ・ペイロードのtext値をプレースホルダに置き換え、対応するパラメータ値の配列を定義する必要があります。
  1. ボット・テスター・ビューで、「テストとして保存」をクリックします。
  2. 「会話」テキスト領域で、ユーザー・メッセージ({"source": "user", ...})のtextフィールド値を、入力パラメータを指定するApache FreeMarker式に置き換えます。たとえば、次のスニペットの"${AGE}":
       {
            "source": "user",
            "messagePayload": {
                "type": "text",
                "text": "${AGE}",
                "channelExtensions": {
                    "test": {
                        "timezoneOffset": 25200000
                    }
                }
            }
        },
  3. フィールドを展開する矢印記号のイメージです。をクリックして、「入力パラメータ」フィールドを展開します。
    フィールドを展開するための矢印アイコン。

  4. 「入力パラメータ」フィールド・オブジェクト({})で、各パラメータのキーと値のペアを追加します。値は文字列値の配列である必要があります。例:
    {"AGE":["24","25","26"], "CRUST": ["Thick","Thin"]}

    input_parameters_added.pngの説明が続きます

    入力パラメータを定義する際には、次の点に注意してください。
    • 配列のみの使用 – 入力パラメータは、文字列ではなく配列として設定する必要があります。{"NAME": "Mark"}は、テスト結果の失敗などを引き起こします。
    • 配列で文字列値を使用 – すべての配列要素は文字列である必要があります。かわりに整数値({"AGE": ["25", 26]}など)として要素を入力すると、文字列に変換されます。null値に対するテスト結果は生成されません。{ "AGE": [ "24", "25", null ] }では、3つではなく2つのテスト結果が生成されます。
    • 一貫性のある大/小文字の使用 – FreeMarker式のキーとプレースホルダの大/小文字は一致する必要があります。大/小文字が一致しない(AgeAGEなど)と、テスト・ケースが失敗します。
  5. 「スイートに追加」をクリックします。

変数のプレースホルダの追加

スキルまたはデジタル・アシスタントのレスポンスの値が常に変化する変数は、テスト実行で実際の値と予想される値を比較すると、テスト・ケースが失敗します。動的情報は、スキル・レスポンスで${MY_VARIBALE_NAME}としてフォーマットされたプレースホルダに置き換えることで、比較から除外できます。たとえば、${.now?string.full} Apache FreeMarker日付操作によって戻された時間値などの時間値によって、テスト・ケースが記録された時刻とテスト・ケースが実行された時刻が一致しないため、テスト・ケースは継続的に失敗します。
view_variable_value_difference.pngの説明が続きます

これらのテスト・ケースに合格できるようにするには、「会話」テキスト領域のボットmessagePayloadオブジェクトのクラッシュ時間値をプレースホルダに置き換えます。たとえば、${ORDER_TIME}は、Monday, April 8, 2024 7:42:46 PM UTCのような日付文字列を次のように置き換えます。
{
        "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."
        }
    }

test_case_variable.pngの説明が続きます

ノート

新しく作成されたテスト・ケースの場合、「変数」フィールドにはSYSTEM_BOT_IDプレースホルダが表示されます。これは、スキルが別のインスタンスからインポートされるかクローニングされると変更されるsystem.botId値に自動的に置換されます。

JSONオブジェクトからのテスト・ケースの作成

メッセージ・オブジェクトの配列オブジェクトからテスト・ケースを作成するには、まず「テスト・スイート」ページで「+テスト・ケース」をクリックし、「新規テスト・ケース」ダイアログを完了します。プロパティは、記録されたテスト・ケースと同じですが、配列([])の「会話」ウィンドウにメッセージ・オブジェクトを入力する必要がある点が異なります。次に、様々なペイロード・タイプのテンプレートを示します:
    {
        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.]
}
 

テスト・ケースの実行

単一のテスト・ケース、テスト・ケースのサブセット、または「テスト・スイート」ページにリストされているテスト・ケースのセット全体に対して、テスト実行を作成できます。スキルが進化するにつれて、意図的にスキルに加えられた変更のために失敗するテスト・ケースをリタイアする必要がある場合があります。開発が進行中であることを理由に、テスト・ケースを一時的に無効にすることもできます。
ノート

継承されたテスト・ケースは削除できません。無効化のみが可能です。
テスト実行が完了したら、「テスト実行結果」タブをクリックし、合格または失敗したテスト・ケースを確認します。
test_run_results.pngの説明が続きます

テスト実行結果の表示

テスト実行結果ページには、最近実行されたテスト実行とその結果がリストされます。テスト実行にコンパイルされたテスト・ケースは、テスト・ケース定義に記録された予想される出力と実際の出力の比較に従って、合格または不合格のいずれかです。2つが一致する場合、テスト・ケースは成功します。そうでない場合、テスト・ケースは失敗します。テスト・ケースが失敗した場合は、「差異の表示」をクリックしてその理由を確認できます。
「差異の表示」ボタン

ノート

各スキルのテスト実行結果は14日間保存され、その後はシステムから削除されます。

失敗したテスト・ケースのレビュー

このレポートには、メッセージ・レベルでの失敗点がリストされ、「メッセージ要素」列にテスト・ケースの会話内のスキル・メッセージの位置が示されます。各メッセージについて、予測ペイロードと実際のペイロードの高レベルの比較がレポートに表示されます。ドリルダウンしてこの比較の詳細を表示し、このテスト・ケースが今後のテスト実行で合格できるように差異を調整するには、「アクション」メニューをクリックします。
top_level_menu.pngの説明が続きます

失敗したテスト・ケースの修正

必要に応じて、「実際値の適用」「差異の無視」および「追加」アクションを使用して、テスト・ケース(またはテスト・ケースの一部)を修正し、次回の実行時に失敗しないようにできます。「アクション」メニューのオプションはノード固有であるため、メッセージ・レベルのアクションはトラバーサルの下位ポイントのアクションとは異なります。
  • すべて開く– メッセージ・オブジェクト・ノードを開きます。
  • 差異の表示– 実際の出力と予想される出力を並べて比較します。ビューはノードによって異なります。たとえば、単一のアクションまたはアクション配列全体を表示できます。実際の出力と予想された出力を調整する前に、このアクションを使用できます。
    view_difference_message_level.pngの説明が続きます

  • 差異の無視– 値を衝突しても機能に影響しない場合は、このアクションを選択します。複数の違いがあり、それらを1つずつ実行したくない場合は、このオプションを選択できます。たとえば、ポストバック・レベルでは、実際の値を個別に適用することも、ポストバック・オブジェクト全体の差異を無視することもできます。
  • 実際値の適用– 一部の変更は、小さいものであっても、多くのテスト・ケースが同じ実行内で失敗する可能性があります。これは、プロンプトやラベルなどのテキスト文字列の変更によく当てはまります。たとえば、テキストのプロンプトを「How big of a pizza do you want?」から「What pizza size?」に変更すると、スキルの機能に影響がなくても、このプロンプトを含むテスト・ケースは失敗します。テスト・ケースをすべて再記録することでこの変更に対応できますが、かわりに「実際の値の適用」をクリックすると、変更されたプロンプトでテスト・ケース定義をすぐに更新できます。これでテスト・ケースが新しいスキル定義と一致したため、今後のテスト実行でテスト・ケースは成功します(または少なくとも文言の変更によって失敗しません)。
    ノート

    プロンプトやURLなどの文字列値を適用することはできますが、「実際値の適用」を使用して、エンティティの値またはその動作に対する変更によってテスト・ケースによって提供される値が無効になる場合(たとえば、「順不同の抽出」機能を無効化する)テスト・ケースを修正することはできません。エンティティを更新すると、受信することのない値がスキルによって継続的に要求され、そのレスポンスがテスト・ケースによって定義された順序と一致しなくなるため、ケースは失敗します。
  • 正規表現の追加– 正規表現を置換して、干渉するテキスト値を解決できます。たとえば、user*を追加して、競合するuserおよびuser1文字列を解決します。
  • 追加– トラバーサルのポストバック・レベルでは、改訂されたスキルにテスト・ケースに存在しなかったポストバック・アクションが含まれていると、「追加」アクションが表示されます。新しいポストバック・アクションが原因でテスト・ケースが失敗しないようにするには、「追加」をクリックしてテスト・ケースに含めることができます。(「追加」は、「実際値の適用」と似ていますが、ポストバック・レベルです。)
ノート

入力パラメータに対して生成されたテスト結果のセットは、すべて同じ元のテスト・ケースを参照するため、1つのテスト結果の入力パラメータ値を調整すると、残りのテスト結果でその入力パラメータの値が同時に調整されます。

テスト・ケースのインポートおよびエクスポート

同じスキルのパラレル・バージョンを開発する場合、またはクローンで作業する場合、スキルのあるバージョンから別のバージョンにテスト・スイートをインポートできます。
  1. テスト・スイートをエクスポートするには、最初にテスト・スイート(またはテスト・スイート)を選択します。次に、「詳細」「選択したスイートのエクスポート」または「すべてエクスポート」をクリックします。(ケバブ・メニューから「テストのエクスポート」を選択して、すべてのテスト・スイートをエクスポートすることもできます)
    こちらはケバブメニュー。

    スキル・タイル内)。エクスポートされたZIPファイルには、エクスポートされたテスト・スイートを記述するJSONファイルを含むtestSuitesというフォルダが含まれます。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. ターゲット・スキルの「テスト・スイート」ページを開き、「詳細」「インポート」をクリックします。
  3. テスト・スイートのJSON定義を含むZIPファイルを参照して選択します。次に、「アップロード」をクリックします。
  4. インポートが完了したら、確認通知の「レポートのダウンロード」をクリックして、ダウンロードしたZIPファイルに含まれるJSONファイルのインポートの詳細を確認します。
    通知メッセージの「レポートのダウンロード」リンク。

    例:
    {
      "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" : [ ]
        } ]
      } ]
    }
有効なテスト・ケースのみインポートできます。
無効なテスト・ケース・インポートの警告ダイアログ

失敗した結果の原因を確認するには、ダウンロードしたimportJSONファイルのinvalidReasons配列を確認します。
    "testCasesValidationDetails" : [ {
      "name" : "Test",
      "invalidReasons" : [ "INVALID_INPUT_PARAMETERS" ],
   ...