Postman Test Script

除了拿 Postman 來檢測 api 之外,其實 Postman 還有 Pre-request Script 的功能,以及請求後的資料驗證功能,透過發請求之前再去發其他請求其實是一個很實用的功能。


可以想像一下,如果我們有兩個 api,分別為 login, profileView 

在 login 的 api 我們預期會回應一個 token 的資料

在 profileView 中則將該 token 的資料帶入,請求個人資料呈現

在 postman 中,也許我們會建立這兩支 api,測試的流程會先打 login 得到資料後,再把資料複製起來,放到第二支 api 去進去測試

但透過 postman pre-request 的做法,我們只要打 profileView 就可以一次完成兩個 request 了

那這是怎麼達到的呢?首先先看 postman 的官方網站的介紹

流程圖(轉至 postman 官網資料)


從圖片上就可以了解,目前 postman 支援了發送請求前可以在 pre-request 中先做其他的動作(login),接著就會來完成這次的 request (profileView),最後則是會到達 test 的階段

在 test 這個階段我們可以驗證回傳的文字包含什麼,或是 http status code 是否為 200 的事情

甚至於可以透過 postman console 來達到 request 與 response 的 trouble shooting 

而這些 script code 在 postman 都已經很貼心的在右邊的側欄可以看到

假設我們在 postman 的環境變數有這兩個

Login 與 viewProfile 如下簡單所示

        [HttpPost]
        [Route("login")]
        public LoginResponsetModel login([FromBody] LoginRequestModel request)
        {
            //check user and pwd            
            return new LoginResponsetModel { Token = Guid.NewGuid().ToString() };
        }

        [HttpPost]
        [Route("viewProfile")]
        public string viewProfile([FromBody] ViewProfileRequestModel requestModel)
        {
            //check token 
            return $"your token is {requestModel.Token}";
        }

login 畫面如下

viewProfile如下

接下來我們就得在 viewProfile 中的 pre-request 中寫入先 login 的request

Pre-request scriipt

var apiLogin = pm.variables.get("API_URL") + "/v1/login" ;

pm.sendRequest({
    url: apiLogin,
    method: 'POST',
    header: {
        'Content-Type':'application/json',
        'otherHeader': '[your other header]'
    },
    body: {
        mode: 'raw',
        raw: JSON.stringify({ UserName: "ace",  Password:"dotblog"})
    }
},  function(err, response) {
    var jsonResponse = response.json();
    console.log (jsonResponse.token);
    pm.environment.set("Token", jsonResponse.token );
});

假設我們從 login 中取得的 token 為 d780aa83-1d6c-4b2f-bbc1-e858264820bf

那麼在 pre-request 執行完之後,環境變數 Token 即會被覆寫成 d780aa83-1d6c-4b2f-bbc1-e858264820bf

而呼叫 profileView 則會拿 Token d780aa83-1d6c-4b2f-bbc1-e858264820bf 進行呼叫請求,並取得結果,進而執行 Tests 裡的檢驗事項

Tests
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

 

甚至從 postman console 都能很清楚看出 request 與 response 的所有資訊

最後再來比對一下 postman 的變數的確是從 x 被改成呼叫 viewProfile 中的值了

如此一來 api 的測試又變的更為簡單了

參考文件
https://learning.getpostman.com/docs/postman/scripts/intro_to_scripts/
https://learning.getpostman.com/docs/postman/sending_api_requests/debugging_and_logs/#network-calls-with-postman-console