你可以在測試情境中新增流程控制條件(迴圈、條件、等待、分組等)。這能提升更複雜測試情境/流程設定的運用,最終透過自動化測試功能解決複雜情境的測試挑戰。For 迴圈#
當你需要連續多次傳送單一請求時,使用 for 迴圈是一種高效率的方法。以下說明如何在 Apidog 測試情境中有效使用 for 迴圈:設定迭代次數:決定迴圈應執行多少次。這可以是固定數字,也可以是 {{variable}}。
新增請求:在 for 迴圈中,你可以包含一個或多個請求,也可以包含其他迴圈或條件分支。這種彈性允許建立複雜的測試情境,讓多個動作能依序進行測試。
Break If 條件:你可以在 for 迴圈中新增 Break if 條件。若條件符合,迴圈將立即終止。你可以拖曳並調整 Break if 的位置,甚至新增多個 Break if 條件來處理不同情境。
On Error 處理:透過在迴圈中新增 On Error 條件來管理錯誤。若發生錯誤,將觸發指定動作:Continue:跳過目前循環中剩餘的請求,並進入下一次迭代。
Break execution:停止迴圈,並繼續執行迴圈外的後續請求。
End execution:完全停止整個測試情境。
On Error 條件固定在迴圈開始處,無法移動。
在請求中使用迴圈索引#
目前迴圈的索引可作為請求中的區域變數,用來動態調整參數或請求主體。若要使用此功能:2
在請求參數中點擊魔法棒圖示
🪄,並選擇「Retrieve pre-step data」。
「Retrieve pre-step data」功能僅可在「Tests」模組中使用,無法在「APIs」模組中使用。
使用「Retrieve pre-step data」時,只有在整個測試情境一起執行時才能取得該值;執行個別步驟時無法存取。
3
選擇迴圈選項,通常標示為「Loop n times」。
5
你將取得類似
{{$.5.index}} 的動態變數。點擊「Insert」,它會在執行階段被替換為目前迴圈的索引,例如
0 或
5。
ForEach 迴圈#
當你有一個包含多個元素的陣列(特定內容清單或從先前步驟取得的清單),並且需要對清單中的每個項目執行相同操作時(例如先取得產品清單,然後將清單中的每個產品加入購物車),就需要使用 ForEach 迴圈。在 ForEach 迴圈中,迴圈內的操作會針對陣列中的每個元素執行。與 For 迴圈的 差異在於,你不需要關心迭代次數;只需要專注於迴圈陣列的內容。設定迴圈陣列:在 ForEach 迴圈中,你需要設定一個陣列作為迴圈物件。你可以使用變數,或手動輸入陣列,例如 ["a","b","c"]。
新增請求:在 ForEach 迴圈中,你可以新增一個或多個請求,或新增其他迴圈或條件分支等。
Break If 條件與 On Error 處理:你可以在 ForEach 迴圈中新增 Break if 和 On error,與上述 for 迴圈一致。
在 ForEach Loop 的進階設定中,你也可以自訂 Break If 和 On Error 的例外處理選項。如需更多資訊,請參閱判斷規則。
ForEach 使用範例#
假設有兩個端點:一個用於取得寵物資訊清單,另一個用於取得單一寵物的詳細資料。如果你需要取得最近新增至清單中的寵物詳細資料,可以在自動化測試中使用 ForEach 迴圈來設定此情境。1.
ForEach 迴圈外的第一個步驟,是請求寵物資訊清單端點以取得實際清單資料。通常,此介面的回應會包含一個陣列,其中有多個寵物的基本資訊,例如寵物 ID 和名稱。
2.
設定 ForEach 迴圈 ,並將來源陣列設為先前步驟回應中寵物陣列的子集。
3.
在迴圈中,設定一個請求到「Get Pet Information」端點,並使用 ForEach 迴圈中的元素值填入此請求的 ID 參數。
在請求中使用迴圈元素#
目前迴圈的元素/索引可作為請求中的區域變數,用來動態調整參數或請求主體。若要使用此功能:1
新增一個 ForEach 迴圈,並在迴圈中包含一個請求。
2
在請求參數中點擊
魔法棒圖示,並選擇「Retrieve pre-step data」。
3
選擇迴圈選項,通常標示為「Loop each element in
{{array}}」。
4
選擇「Current loop element」。你可以使用 JSONPath 來擷取元素的屬性。
5
你將取得類似
{{$.17.element}} 的動態變數。點擊「Insert」,它會在執行階段被替換為目前迴圈的元素,也就是迴圈陣列中的一個元素。
Current Loop Element:系統會自動從 ForEach 迴圈指定的陣列中擷取元素,並將其儲存在指定變數中。每次迭代開始時,此變數會更新為陣列中目前元素的值。如果元素是物件,你可以使用 JSONPath 擷取特定子欄位,例如 {{$.1.element.data.name}}。Current Loop Index:目前迴圈的索引會儲存在此變數中。它從 0 開始,並在每次後續迭代開始時加 1,以反映目前索引。
當你需要根據不同情境傳送不同請求時,可以使用 If 陳述式新增條件分支。當指定條件符合時,將執行對應步驟;否則將跳過。更多具體細節,請參閱判斷規則。設定 If 陳述式:If 陳述式支援各種條件,例如等於、不等於、包含、不包含等。條件兩側都可以使用常數與變數。
新增請求:可在條件分支中新增多個請求,也可以新增其他迴圈或條件分支。
執行條件分支:如果設定中的條件符合,測試步驟將會執行;否則將會跳過。
Else 陳述式:可在條件分支中新增 Else 陳述式,用來處理 If 條件不符合的情境。
If 使用範例#
寵物店老闆根據前一天寵物的銷售狀態,如果某隻寵物已售出,需將該寵物的銷售狀態變更為「Sold」。否則(else),需要查看仍在販售中的寵物清單。1.
點擊底部的「Add Step」按鈕,並選擇「Conditional Branching」。
2.
將從 API 請求回應取得的變數 saleStatus 輸入「If」後方的輸入框,並選擇條件「equals」。最後,輸入 true 作為比較值。
3.
將滑鼠停在條件分支操作上,即可看到「 + Else」選項。點擊它以新增「List of Pets for Sale」步驟(當條件不符合時,也就是查詢仍在販售中的寵物清單)。
判斷規則#
在測試情境中使用 If 陳述式時,你可以定義條件規則來控制測試執行。如果條件符合,對應步驟將會執行;否則將會跳過。同樣地,在 ForEach 和 For 迴圈的 Break If 設定中,你可以設定判斷規則,以更彈性地控制執行流程 。| 規則 | 說明 |
|---|
| Equals | 檢查兩個值是否相等。 |
| Does not equal | 檢查兩個值是否不相等。 |
| Exists | 檢查欄位或變數是否存在。 |
| Does not exist | 檢查欄位或變數是否不存在。 |
| Less than | 檢查一個值是否小於另一個值。 |
| Less than or equal | 檢查一個值是否小於或等於另一個值。 |
| Greater than | 檢查一個值是否大於另一個值。 |
| Greater than or equal | 檢查一個值是否大於或等於另一個值。 |
| Matches with Regex | 檢查字串是否符合指定的正規表示式。 |
| Contains | 檢查字串或陣列是否包含指 定值。 |
| Does not contain | 檢查字串或陣列是否不包含指定值。 |
| Is empty | 檢查欄位、陣列或變數是否為空。 |
| Is not Empty | 檢查欄位、陣列或變數是否不為空。 |
| In List | 檢查某個值是否屬於指定清單。 |
| Not in List | 檢查某個值是否不屬於指定清單。 |
執行條件檢查時(例如大於、大於或等於、等於或不等於),如果要比較的值是整數或字串,系統會自動將字串轉換為數字以進行準確比較。例如,如果你將字串 "18" 與數字 18 比較,系統會先將字串 "18" 轉換為數字 18,再進行比較。Equals#
檢查兩個值是否相等。如果相等,條件 符合且測試步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的使用者年齡是否等於 18。
條件範例:{{$.5.response.body.data.age}} Equals 18
實際執行效果:如果從前置步驟擷取的年齡值為 18(字串會自動轉換為數字),該步驟將會執行,例如顯示特定資訊或執行某些動作。
Does not equal#
檢查兩個值是否不相等。如果不相等,條件符合且測試步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的訂單狀態是否不等於「Paid」。
條件範例:{{$.4.response.body.data.status}} Does not equal Paid
實際執行效果:如果從前置步驟擷取的訂單狀態是其他值(例如「Pending」或「Shipped」),該步驟將會執行。
Exists#
檢查某個欄位或變數是否存在。如果存在,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的使用者資料中是否存在 email 欄位。
條件範例:{{$.3.response.body.data.email}} Exists
實際執行效果:如果 email 欄位存在於從前置步驟擷取的使用者資料中,該步驟將會執行。
Does not exist#
檢查某個欄位或變數是否不存在。如果不存在,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的使用者資料中是否不存在 phone 欄位。
條件範例:{{$.2.response.body.data.phone}} Does not exist
實際執行效果:如果 phone 欄位不存在於從前置步驟擷取 的使用者資料中,該步驟將會執行。
Less Than#
檢查一個值是否小於另一個值。如果是,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的產品庫存是否少於 10。
條件範例:{{$.1.response.body.data.stock}} Less Than 10
實際執行效果:如果從前置步驟擷取的庫存值為 8,條件符合且該步驟將會執行。
Less than or equal#
檢查一個值是否小於或等於另一個值。如果是,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的年齡是否小於或等於 12。
條件範例:{{$.2.response.body.data.age}} Less than or equal 12
實際執行效果:如果從前置步驟擷取的年齡值為 10,條件符合且該步驟將會執行。
Greater than#
檢查一個值是否大於另一個值。如果是,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的訂單金額是否大於 1000。
條件範例:{{$.1.response.body.data.amount}} Greater than 1000
實際執行效果:如果從前置步驟擷取的訂單金額值為 1105,條件符合且該步驟將會執行。
Greater than or equal#
檢查一個值是否大於或等於另一個值。 如果是,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的使用者點數是否大於或等於 500。
條件範例:{{$.3.response.body.data.points}} Greater than or equal 500
實際執行效果:如果從前置步驟擷取的點數值為 600,條件符合且該步驟將會執行。
Matches with Regex#
檢查字串是否符合指定的正規表示式。如果符合,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的 email 格式是否正確。
條件範例:{{$.2.response.body.data.email}} Matches with Regex /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i
實際執行效果:如果從前置步驟擷取的 email 格式符合正規表示式(例如 test@gmail.com),該步驟將會執行。
正規表示式應使用「literal」語法撰寫,也就是將模式包在 / 中,並在結尾附加選用的修飾符(例如 g 表示全域比對,i 表示不區分大小寫)。如需更多撰寫正規表示式的資訊,你可以參閱 MDN 文件。 Contains#
檢查字串或陣列是否包含指定值。如果包含,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的使用者角色清單是否包含「admin」角色。
條件範例:{{$.3.response.body.data.roles}} Contains admin
實際執行效果:如果從前置步驟擷取的角色清單包含「admin」,該步驟將會執行。
Does not contain#
檢查字 串或陣列是否不包含指定值。如果不包含,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取的使用者購物車是否不包含某個產品。
條件範例:{{$.4.response.body.data.cartItems}} Does not contain productId123
實際執行效果:如果從前置步驟擷取的購物車陣列不包含產品 productId123,該步驟將會執行。
Is empty#
檢查欄位、陣列或變數是否為空。如果是,條件符合且步驟將會執行;否則將會跳過。條件範例:{{$.2.response.body.data.remarks}} Is empty
實際執行效果:如果從前置步驟擷取的備註欄位為空,該步驟將會執行。
Is not Empty#
檢查欄位、陣列或變數是否不為空。如果不為空,條件符合且步驟將會執行;否則將會跳過。條件範例:{{$.1.response.body.data.orderRemarks}} Is not Empty
實際執行效果:如果從前置步驟擷取的訂單備註不為空,該步驟將會執行。
In List#
檢查某個值是否屬於指定清單。如果屬於,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取、由使用者選擇的產品是否在推薦產品清單中。
條件範例:{{$.3.response.body.data.productId}} In List ["prod123", "prod456", "prod789"]
實際執行效果:如果從前置步驟擷取的產品 ID 為「prod456」,該步驟將會執行。
在 Apidog 中,輸入清單時,每個元素應分別輸入,並透過按 Enter 鍵分隔。
Not in List#
檢查某個值是否不屬於指定清單。如果不屬於,條件符合且步驟將會執行;否則將會跳過。情境:檢查從前置步驟擷取、由使用者輸入的促銷碼是否不在已使用促銷碼清單中。
條件範例:{{$.4.response.body.data.promoCode}} Not in List ["usedCode1", "usedCode2"]
實際執行效果:如果從前置步驟擷取的促銷碼為「newPromo」,條件符合且該步驟將會執行;否則將會跳過。
當測試流程中的多個步驟彼此相關時,可以將它們分組以便分類。透過將測試步驟分組,你可以提升測試情境的可讀性與可操作性。當測試流程中的某個步驟在執行前需要等待一段時間時,你可以新增等待條件來解決此需求。等待使用範例#
模擬使用者查看寵物詳細資料,並在瀏覽 1000ms 後更新寵物資訊的瀏覽狀態。1.
點擊底部的「Add Step」按鈕,並選擇「Wait」。
當你使用測試流程控制時,測試報告不會顯示 If、for 等步驟,而只會顯示實際執行的請求,並依執行順序線性列出。