iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0

今日主題

昨天提到了透過Collection Runner一次性地執行多個請求,但每個請求彼此間是互相獨立的,但有時候我們的API存在著相依性,像是必須先登入才能使用的API,或是必須先取得某些資訊,然後以取得的結果當作請求的輸入。也就是說,我們需要滿足以下條件

  • 調整執行的順序
  • 解析API回傳結果
  • 傳遞結果到另一個API

Scripting

在前面的章節中,我們已經在Tests裡面寫過JavaScript的程式碼來取得一些需要的資訊,其實不只是寫測試,Postman的Scripting功能還允許我們動態使用參數,或是在請求間去傳遞參數,通常在下面兩種不同時機點去使用。

  • Pre-request 分頁下撰寫腳本,這邊的腳本會在發送請求前執行
  • Tests 分頁下撰寫腳本,這邊的腳本會在取得回應後執行

https://ithelp.ithome.com.tw/upload/images/20220925/20140317NFxRma5ieT.png

從上圖我們可以知道,要進行傳遞參數的話,我們可以在執行完 A 請求後,在其Tests裡面去將回應的資料取出並設定到環境變數裡,也能在執行B請求前,透過它的Pre-request先執行 A 請求後再來設定環境變數。而複雜一點的流程可以透過不同層級來定義,Pre-reuqestTests也能以Collection或是Folder為群組來發揮作用,如下圖:

https://ithelp.ithome.com.tw/upload/images/20220925/20140317sgSG7TLY0k.png

Workflows

關於多個API的執行順序,常用的會是以Collection為單位進行,所以就會是按照排列順序來一個個執行,而在Collection Runner裡面,我們除了能手動拖拉去調整執行順序,還能夠透過postman.setNextRequest()這個函式來直接指定下一個請求。用法如下:

  • 寫在Pre-request或是Tests裡面,且有效範圍只在當前Collection
  • Collection Runner執行才有作用,一般Send或是整個Collection去執行都沒作用
  • 以請求的名字或是id進行指定
    postman.setNextRequest("request_name");
    
  • 以null表示停止
    postman.setNextRequest(null);
    

挑戰開始

在開始之前,請別忘了將今天的挑戰 Day 9: Scripting 先行fork到自己的工作區喔。

今天的挑戰前置步驟如下

  • 新增請求: 在資料夾Scripting之下利用Add request來新增一個請求,並重新命名為get random user,設定方法為GET,URL為https://randomuser.me/api/
  • 新增第二個請求: 在資料夾Scripting之下利用Add request來新增一個請求,並重新命名為echo the user,設定方法為POST,URL為https://postman-echo.com/post,Body類型要指定成raw,格式為json,內容如下
    {
      "name": "Dawn Ellis",
      "email": "dawn.ellis@example.com",
      "id": "334eecea-607d-4111-90ee-e57bea971654"
    }
    

這樣我們就有了兩個獨立的請求,但今天的目標是需要將兩個請求串聯起來,所以調整步驟如下

  • 將第二個請求進行參數化: 將內容以環境變數做為替換,這幾個環境變數可以在Collection的Variables分頁看到。由於目前還沒有值,預期會是在第一個請求執行完後修改環境變數來達成
    {
        "name": "{{firstName}} {{lastName}}",
        "email": "{{emailAddress}}",
        "id": "{{uuid}}"
    }
    
  • 撰寫第一個請求的腳本: 由於希望在第一個請求執行完能去修改一些指定的環境變數,因此切換到第一個請求的Tests分頁,填入以下內容,主要思路就是將API回應取出,解析需要的部分,然後回填到環境變數供第二個請求使用
    // 取得請求內容中使用者的資料
    let userData = pm.response.json().results[0];
    
    // 取出所需要的資料
    let first = userData.name.first;
    let last = userData.name.last;
    let email = userData.email;
    let uuid = userData.login.uuid;
    
    // 設定環境變數
    pm.collectionVariables.set("firstName", first);
    pm.collectionVariables.set("lastName", last);
    pm.collectionVariables.set("emailAddress", email);
    pm.collectionVariables.set("uuid", uuid);
    
    // 確認環境變數
    console.log(pm.collectionVariables.get("firstName"));
    console.log(pm.collectionVariables.get("lastName"));
    console.log(pm.collectionVariables.get("emailAddress"));
    console.log(pm.collectionVariables.get("uuid"));
    

    小提醒: 透過 Tests 分頁右方提供的 Snippets 可以找到腳本Set a collection variable示範如何設定環境變數

  • 修改第二個請求測試: 由於透過Collection Runner運行的話,會連同submit一起進行,所以可以在Tests裡加入postman.setNextRequest(null)來宣告沒有下一個請求了,這樣執行時就不會繼續呼叫submit的請求了。

到這邊就可以進行submit來確認是否通過今天挑戰了,如果測項都通過就表示挑戰成功囉。

今日回顧

今天我們透過腳本以及定義工作流程,成功串連了兩個有依賴關係的API,有興趣的朋友也可以看以下相關資料

那麼今天就到這邊,我們明天見~


上一篇
Postman challenge Day 8 - 批次執行 (Run a collection)
下一篇
Postman challenge Day 10 - 模擬服務 (Mock services)
系列文
[POSTMAN] 該知道的都知道,不知道的慢慢了解 - 與波斯麵三十天的感情培養32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言