測試和調試自定義應用程式

對自定義應用程式執行單元測試

在電腦上安裝Docker Desktop。 要測試自定義工作器,請在應用程式的根目錄中執行以下命令:

$ aio app test

如下所述,此程式會為專案中的Asset compute應用程式動作執行自訂單元測試架構。 可透過package.json檔案中的設定來連接。 也可以進行JavaScript單元測試,例如Jest。 aio app test 同時執行。

aio-cli-plugin-asset-compute外掛程式在自訂應用程式應用程式中以開發相依性形式內嵌,因此不需要安裝在組建/測試系統上。

應用單元測試框架

asset compute應用單元測試框架允許測試應用而不寫任何代碼。 它依賴應用程式的源到轉譯檔案原則。 必須設定特定檔案和資料夾結構,以使用測試來源檔案、選用參數、預期的轉譯和自訂驗證指令碼來定義測試案例。 依預設,會比較轉譯以取得位元組相等。 此外,使用簡單的JSON檔案,即可輕鬆模擬外部HTTP服務。

添加測試

應在Adobe I/O項目的根級test資料夾內進行測試。 每個應用程式的測試案例應位於路徑test/asset-compute/<worker-name>中,每個測試案例應包含一個資料夾:

action/
manifest.yml
package.json
...
test/
  asset-compute/
    <worker-name>/
        <testcase1>/
            file.jpg
            params.json
            rendition.png
        <testcase2>/
            file.jpg
            params.json
            rendition.gif
            validate
        <testcase3>/
            file.jpg
            params.json
            rendition.png
            mock-adobe.com.json
            mock-console.adobe.io.json

查看示例自定義應用程式以了解一些示例。 下面是詳細的參考。

測試輸出

包括自訂應用程式記錄在內的詳細測試輸出可在位於Firefly應用程式根目錄的build資料夾中使用,如aio app test輸出所示。

模擬外部服務

您可以在測試案例中定義mock-<HOST_NAME>.json檔案,其中HOST_NAME是您要模擬的主機,借此模擬動作中的外部服務呼叫。 對S3進行個別呼叫的應用程式就是範例使用案例。 新的測試結構如下所示:

test/
  asset-compute/
    <worker-name>/
      <testcase3>/
        file.jpg
        params.json
        rendition.png
        mock-<HOST_NAME1>.json
        mock-<HOST_NAME2>.json

模擬檔案為JSON格式的http回應。 如需詳細資訊,請參閱本檔案🔗。 如果有多個要模擬的主機名,請定義多個mock-<mocked-host>.json檔案。 以下是google.com的範例模擬檔案,名為mock-google.com.json:

[{
    "httpRequest": {
        "path": "/images/hello.txt"
        "method": "GET"
    },
    "httpResponse": {
        "statusCode": 200,
        "body": {
          "message": "hello world!"
        }
    }
}]

示例worker-animal-pictures包含與其交互的Wiki媒體服務的模擬檔案

跨測試案例共用檔案

如果您在多個測試間共用file.*params.jsonvalidate指令碼,建議使用相對符號連結。 Git支援這些功能。 請務必為共用檔案指定唯一的名稱,因為您可能有不同的名稱。 在下列範例中,測試會混合併比對幾個共用檔案,以及它們自己的檔案:

tests/
    file-one.jpg
    params-resize.json
    params-crop.json
    validate-image-compare

    jpg-png-resize/
        file.jpg    - symlink: ../file-one.jpg
        params.json - symlink: ../params-resize.json
        rendition.png
        validate    - symlink: ../validate-image-compare

    jpg2-png-crop/
        file.jpg
        params.json - symlink: ../params-crop.json
        rendition.gif
        validate    - symlink: ../validate-image-compare

    jpg-gif-crop/
        file.jpg    - symlink: ../file-one.jpg
        params.json - symlink: ../params-crop.json
        rendition.gif
        validate

測試預期錯誤

錯誤測試案例不應包含預期的rendition.*檔案,並應在params.json檔案內定義預期的errorReason

注意

如果測試案例不包含預期的rendition.*檔案,且未在params.json檔案內定義預期的errorReason,則假設該案例是任何errorReason的錯誤案例。

錯誤測試用例結構:

<error_test_case>/
    file.jpg
    params.json

參數檔案,錯誤原因:

{
    "errorReason": "SourceUnsupported",
    // ... other params
}

請參閱Asset compute錯誤原因的完整清單和說明。

調試自定義應用程式

下列步驟顯示如何使用Visual Studio Code調試自定義應用程式。 它可讓您查看即時記錄、點擊中斷點、逐步執行程式碼,以及在每次啟動時即時重新載入本機程式碼變更。

其中許多步驟通常由aio自動執行,請參閱Firefly檔案中的應用程式除錯一節。 目前,下列步驟包含因應措施。

  1. 從GitHub安裝最新的wskdebug以及選用的ngrok

    npm install -g @openwhisk/wskdebug
    npm install -g ngrok --unsafe-perm=true
    
  2. 新增至您的使用者設定JSON檔案。 它持續使用舊版VS程式碼偵錯器,新版偵錯器有部分問題 wskdebug:"debug.javascript.usePreview": false

  3. 關閉透過aio app run開啟的應用程式任何例項。

  4. 使用aio app deploy部署最新代碼。

  5. 僅使用aio asset-compute devtool執行Asset computeDevtool。 保持開啟。

  6. 在VS程式碼編輯器中,將下列除錯設定新增至您的launch.json:

    {
      "type": "node",
      "request": "launch",
      "name": "wskdebug worker",
      "runtimeExecutable": "wskdebug",
      "args": [
        "PROJECT-0.0.1/__secured_worker",           // Replace this with your ACTION NAME
        "${workspaceFolder}/actions/worker/index.js",
        "-l",
        "--ngrok"
      ],
      "localRoot": "${workspaceFolder}",
      "remoteRoot": "/code",
      "outputCapture": "std",
      "timeout": 30000
    }
    

    aio app deploy的輸出擷取ACTION NAME

  7. 從運行/調試配置中選擇wskdebug worker,然後按播放表徵圖。 等待它啟動,直到它在​調試控制台​窗口中顯示​準備激活

  8. 在Devtool中按一下​run。 您可以在VS程式碼編輯器中看到執行的動作,且記錄開始顯示。

  9. 在代碼中設定斷點,重新運行,該斷點應該已命中。

任何程式碼變更都會即時載入,並在下次啟動時立即生效。

注意

自訂應用程式中,每個請求會有兩個啟用。 第一個要求是Web動作,會在SDK程式碼中以非同步方式呼叫本身。 第二次啟動是點擊您程式碼的啟動。

本頁內容