因為需要幫公司新人Webapi訓練來新增整合測試,來減少人工測試的時間,所以研究了一下PostMan Script的使用方法。
邏輯上也是可以使用程式來寫整合測試,但在使用PostMan上我覺得操作起來更簡潔方便一些。
什麼是PostMan Script?
Postman Script 是指在 Postman 工具中可以使用JavaScript的程式碼,在 Pre-request Script 或 Tests 中寫腳本,來執行更複雜的測試或工作流程。
舉例: 我有一個Request A,我希望在呼叫A之前(Pre-request Script)先設定一些基本參數或步驟,然後執行A之後,拿A得到的結果進行驗證(Test),來判斷是否得到預期的結果。
在正式使用之前,先來了解,幾個在使用 PostMan Script 要了解的基本概念:
1.Collection:
用途:是一組相關的 API 請求的集合。
功能: Collection 層級上,你可以定義變數、Pre-request Script、和 Tests。
該 Collection 的任何請求被執行時,這些設定都會被應用。
執行 :使用 Postman Runner,你可以執行整個 Collection 的請求。
2.Folder:
用途:Collection 內部進一步組織Request,可以依照特定功能、工作流程或其他邏輯作劃分。
功能:跟 Collection 類似,你也可以在 Folder 層級上定義變數、Pre-request Script、和 Tests。該Folder的Request被執行時,這些設定都會被應用。
3.Request:
用途:定義 API 請求,以及驗證 API 響應和其行為
功能:每個 Request 可以有其自己的變數、Pre-request Script、和 Tests。
這些只在該請求被執行時應用。
4.Environment:
用途:建立環境變數,可以在多個Request或腳本當中做使用
5.Pre-request Script:
用途:在實際請求被發送之前,會先執行此處腳本的內容。通常用於設定變數、生成Header、或執行其他任何需要在請求之前完成的任務。
6.Tests:
用途:在實際請求發送之前後,會執行此處腳本的內容。主要是用來檢查,Response的結果是否符合預期。
7.Runner:
用途: 可以自動連續執行整個Collection的請求,在執行之前可以導入文件(EX:測試項目),以及不同的環境配置(EX:請求之間的延遲),並且在執行後會得到所有請求的執行結果。
執行腳本的順序:會依照層級架構,Collection => Folder =>Request
實際應用案例:
我現在做了一個小算盤的功能,Client端會先發一個createCalculator的Post,去拿到一台小算盤的Id,
然後再透過這個ID跟指令,去操作小算盤,舉例:
範例(連續):
1.透過 createcalculator,取得Response id = 1。
2.透過 pressbutton,傳入 id = 1,buttonKey = ButtonFive, 取得Response:
"upperMessage": "",
"downMessage": "5",
"inOrderTraversal": "",
"postOrderTraversal": "",
"preOrderTraversal": ""
3.透過pressbutton,傳入 id=1,buttonKey = ButtonPlus, 取得Response:
"upperMessage": "5+",
"downMessage": "5",
"inOrderTraversal": "",
"postOrderTraversal": "",
"preOrderTraversal": ""
4.透過pressbutton,傳入 Id=1,buttonKey = ButtonThree, 取得Response:
"upperMessage": "5+",
"downMessage": "3",
"inOrderTraversal": "",
"postOrderTraversal": "",
"preOrderTraversal": ""
5.透過pressbutton,傳入 Id=1,buttonKey = ButtonEqual, 取得Response:
"upperMessage": "5+3=",
"downMessage": "8",
"inOrderTraversal": "5+3",
"postOrderTraversal": "53+",
"preOrderTraversal": "+53"
上述是我希望得到的效果,為此,我寫了一個驗證我API的Json檔案(可以從Runner導入文件)
{
"name": "1.加法",
"input": "5+3=", //我預期輸入的全部指令,在實際執行Request時,
一個字元代表每做一個Post,buttonKey的參數
EX: 2+3= => ButtonTwo,ButtonPlus,ButtonThree,ButtonEqual
"upperMessage": "5+3=", //我預期的所有回傳結果
"downMessage": "8",
"inOrderTraversal": "5+3",
"postOrderTraversal": "53+",
"preOrderTraversal": "+53"
}
現在我希望可以透過PostMan Script 去測試得到我要的結果:
我的腳本要做的事情大概如下:
1.透過createcalculator,取得id。
2.轉換input:把輸入字串,切成一格一格的字元,去字典找字元對應的buttonKey。
3.有多少buttonKey,就拿id跟buttonKey去呼叫pressbutton多少次。
4.拿最後一次Request pressbutton 的結果去跟我預期的所有回傳結果作比對。
我會依照 Collection => Folder =>Request 寫腳本:
1.Environment:先設定我的環境變數,讓整個Collection可以使用
url: 寫好的WebApi,本地Server開起來的Url。
buttonDictionary = input 對應的buttonKey轉換。
EX: 2+3= 轉換成: ButtonTwo,ButtonPlus,ButtonThree,ButtonEqual
2.Collection:
因為步驟是從createcalculator取得id開始,這一層可以不寫腳本
3.Request:
createcalculator:
因為步驟是從createcalculator取得id開始,所以不需要在createcalculator寫Pre-request Script,只需要透過Test拿到id,作為一個環境變數。然後把input轉換成一個轉換後的buttonList,存放buttonKey。
pressButton :
Pre-request Script:
需要知道當前的Request執行到哪個buttonKey,所以我選擇用currentIndex記錄下一次Request應該要從buttonList拿哪一個buttonKey。如果已經全部都執行過了,就會把lastRequest設成True。
Tests:
這裡會先用lastRequest判斷是否已經把所有buttonKey執行完了?如果是,就開始比對我原始提供的驗證資料與最後一個Response的結果做比對(使用pm.test),如果不是,就會繼續呼叫pressButton。
執行Runner
寫好腳本之後,就可以把驗證資料的檔案上傳,然後就可以執行了!
實際執行的效果,透過pm.test的參數文字設計,可以產生出你要的文字格式,成功就是Passed,失敗就是Failed。
以上就是基本的使用範例!