Cách thêm rẽ nhánh If/Else và kiểm soát luồng vào kịch bản kiểm thử API trong Apidog

Thêm phân nhánh điều kiện if/else và kiểm soát luồng vào các kịch bản kiểm thử API trong Apidog để một lần chạy có thể phân nhánh dựa trên phản hồi trước đó, cùng với tự động hóa CLI.

Ashley Innocent

Ashley Innocent

15 tháng 7 2026

Cách thêm rẽ nhánh If/Else và kiểm soát luồng vào kịch bản kiểm thử API trong Apidog

Apidog cho doanh nghiệp

Triển khai tại chỗ

SSO & RBAC

Tuân thủ SOC 2

Khám phá Apidog Enterprise

Hầu hết các bài kiểm tra API chạy theo một đường thẳng. Gọi đăng nhập, gọi thanh toán, gọi điểm cuối biên nhận, xác nhận trên đường đi. Điều đó hiệu quả cho đến khi một bước có thể thất bại theo cách mà bước tiếp theo phụ thuộc vào. Nếu đăng nhập trả về mã 401, việc chạy yêu cầu thanh toán là vô nghĩa. Tệ hơn nữa, nó che giấu lỗi thực sự đằng sau một lỗi thứ hai, gây hiểu nhầm. Điều bạn muốn là một bài kiểm tra đọc phản hồi đăng nhập, quyết định có tiếp tục hay không và báo cáo sự thật về nơi mọi thứ đã hỏng.

Quyết định đó là logic có điều kiện, và bạn xây dựng nó bằng kiểm soát luồng. Hướng dẫn này chỉ cho bạn cách thêm phân nhánh if/else vào một kịch bản kiểm tra API trong Apidog để một lần chạy có thể phân nhánh dựa trên phản hồi trước đó. Bạn sẽ xây dựng một kịch bản thực tế: đăng nhập, kiểm tra mã trạng thái và chỉ tiếp tục đến thanh toán khi đăng nhập thực sự thành công. Nếu bạn mới làm quen với các kịch bản Apidog, hướng dẫn chi tiết về cách viết kịch bản kiểm tra với Apidog sẽ bao gồm các kiến thức cơ bản tuyến tính mà bài viết này xây dựng dựa trên. Để hiểu định nghĩa về mẫu phân nhánh, hướng dẫn về các câu lệnh điều kiện của MDN là một tài liệu khởi đầu tốt. Bạn có thể tải xuống Apidog và thực hành theo miễn phí.

nút

Kiểm soát luồng là gì và không phải là gì

Trong Apidog, các bài kiểm tra tự động nằm trong mô-đun Tests (Kiểm tra). Đơn vị bạn làm việc là một Kịch bản Kiểm tra (Test Scenario), mà tài liệu mô tả là tương tự như một Collection trong Postman. Bên trong một kịch bản, bạn sắp xếp các Bước Kiểm tra (Test Steps): mỗi bước là một yêu cầu riêng lẻ hoặc một yếu tố kiểm soát luồng như một nhánh, một vòng lặp hoặc một độ trễ.

Kiểm soát luồng là tập hợp các yếu tố kiểm soát luồng. Nó cho phép một kịch bản làm được nhiều hơn là chỉ tuần tự thực hiện các yêu cầu. Tài liệu Apidog về kiểm soát luồng và phân nhánh điều kiện là tài liệu tham khảo đằng sau mọi nhãn được sử dụng ở đây. Yếu tố mà bài viết này tập trung vào là Phân nhánh Điều kiện (Conditional Branching), đây là tên gọi của Apidog cho if/else. Một nhánh đọc một giá trị bạn cung cấp, kiểm tra giá trị đó với một điều kiện và chạy một tập hợp các bước khi điều kiện đúng và một tập hợp khác khi điều kiện sai.

Một điều cần làm rõ ngay từ đầu, bởi vì hai khái niệm này dễ bị nhầm lẫn. Phân nhánh không phải là lặp. Một nhánh quyết định một lần xem một khối các bước có chạy hay không. Một vòng lặp chạy một khối nhiều lần. Apidog có các tính năng riêng biệt cho việc lặp, được gọi là Vòng lặp For (For Loops) và Vòng lặp ForEach (ForEach Loops), và chúng thuộc về một vấn đề khác: lặp lại cùng một yêu cầu trên một phạm vi hoặc trên các mục trong một mảng. Nếu bạn cần duyệt qua một mảng các ID đơn hàng, đó là một vòng lặp ForEach, được đề cập trong hướng dẫn vòng lặp ForEach, chứ không phải một nhánh. Hướng dẫn này tập trung vào if/else.

Tài liệu Apidog không liệt kê bất kỳ hạn chế nào về phiên bản miễn phí hoặc trả phí đối với kiểm soát luồng, phân nhánh điều kiện, vòng lặp hoặc việc truyền dữ liệu giữa các bước. Cũng không có sự phân biệt giữa phiên bản đám mây và phiên bản tự lưu trữ (self-hosted) được ghi nhận cho các tính năng này. Nếu bạn có thể xây dựng một kịch bản, bạn có thể thêm một nhánh vào đó.

Xây dựng một kịch bản phân nhánh dựa trên phản hồi đăng nhập

Đây là mục tiêu. Người dùng đăng nhập. Nếu điểm cuối đăng nhập trả về 200, kịch bản sẽ tiếp tục tạo một thanh toán. Nếu nó trả về bất kỳ thứ gì khác, kịch bản sẽ dừng lại và báo cáo lỗi thay vì giả vờ rằng thanh toán đã chạy.

Bước 1: Tạo kịch bản kiểm tra

Mở Apidog và truy cập mô-đun Tests (Kiểm tra). Nhấp vào dấu `+` bên cạnh thanh tìm kiếm để tạo một Kịch bản Kiểm tra (Test Scenario) mới, chọn thư mục mà nó sẽ được lưu trữ và đặt ưu tiên để hoàn tất việc tạo. Giờ đây bạn đã có một kịch bản trống sẵn sàng cho các bước.

Bước 2: Thêm yêu cầu đăng nhập làm bước đầu tiên

Thêm Bước Kiểm tra đầu tiên của bạn. Apidog cung cấp cho bạn một vài cách để đưa một yêu cầu vào: nhập từ một đặc tả điểm cuối hiện có, nhập từ một trường hợp điểm cuối đã lưu, thêm trực tiếp một yêu cầu tùy chỉnh hoặc thêm một yêu cầu từ một chuỗi cURL. Để bắt đầu nhanh, hãy thêm một yêu cầu tùy chỉnh. Đặt nó thành POST và trỏ nó đến điểm cuối xác thực của bạn với một body JSON:

POST https://api.your-store.com/v1/login
Content-Type: application/json

{
  "email": "dana@example.com",
  "password": "correct-horse-battery-staple"
}

Chạy bước này một lần để xác nhận nó trả về những gì bạn mong đợi. Một lần đăng nhập thành công sẽ trả về 200 và một token trong body, tương tự như:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "userId": "usr_10482"
}

Bước 3: Vào chế độ điều phối (orchestrate mode)

Nhấp vào bất kỳ bước nào để vào chế độ điều phối. Bảng điều khiển bên trái hiển thị luồng tổng thể của kịch bản; bảng điều khiển bên phải hiển thị chi tiết của bước bạn đã chọn. Chế độ xem chia đôi này là nơi bạn sắp xếp nhánh. Nếu bạn cần sắp xếp lại các bước, hãy kéo biểu tượng `≡` trên một bước để di chuyển nó.

Bước 4: Thêm nhánh điều kiện

Nhấp vào nút `Add Step` (Thêm bước). Đây là cách chính để chèn bất kỳ yếu tố kiểm soát luồng nào. Từ menu, chọn `Conditional Branching` (Phân nhánh Điều kiện). Thao tác này tạo ra một câu lệnh If, một nhánh trống đang chờ một điều kiện và một số bước để chạy.

Bây giờ hãy xây dựng điều kiện. Bạn cần đưa mã trạng thái của phản hồi đăng nhập vào nhánh. Apidog xây dựng các điều kiện từ một tập hợp cố định các toán tử so sánh. Danh sách đầy đủ bao gồm: Bằng (Equals), Không bằng (Does not equal), Tồn tại (Exists), Không tồn tại (Does not exist), Nhỏ hơn (Less than), Nhỏ hơn hoặc bằng (Less than or equal), Lớn hơn (Greater than), Lớn hơn hoặc bằng (Greater than or equal), Khớp với Regex (Matches with Regex), Chứa (Contains), Không chứa (Does not contain), Trống (Is empty), Không trống (Is not Empty), Trong danh sách (In List) và Không trong danh sách (Not in List).

Đối với nhánh này, bạn muốn mã trạng thái đăng nhập bằng 200. Vì vậy, điều kiện đọc là: trạng thái phản hồi đăng nhập `Bằng (Equals)` `200`.

Bước 5: Tham chiếu phản hồi trước đó trong điều kiện

Để đưa kết quả đăng nhập vào trường điều kiện, bạn có hai phương pháp.

Phương pháp đầu tiên không cần thiết lập. Nhấp vào trường giá trị của điều kiện và nhấp vào biểu tượng đũa thần, sau đó chọn `Retrieve pre-step data` (Truy xuất dữ liệu bước trước). Apidog cho phép bạn trỏ trực tiếp vào bước đăng nhập trước đó và lấy một giá trị từ phản hồi của nó. Về cơ bản, điều này sử dụng một tham chiếu bước trước với cú pháp `{{$.<step id>.response.body.<field path>}}`. Ví dụ, nếu bạn muốn lấy token từ body đăng nhập thay vì trạng thái, bạn sẽ tham chiếu `{{$.1.response.body.token}}`, trong đó `1` là ID của bước đăng nhập.

Hai điều cần biết về `Retrieve pre-step data` (Truy xuất dữ liệu bước trước). Nó chỉ hoạt động trong mô-đun Tests (Kiểm tra), không hoạt động trong mô-đun APIs. Và nó chỉ được giải quyết khi bạn chạy toàn bộ kịch bản, chứ không phải khi bạn chạy một bước riêng lẻ. Nếu một tham chiếu bước trước trông trống rỗng trong quá trình chạy riêng lẻ, điều đó là bình thường; hãy chạy toàn bộ kịch bản và nó sẽ được điền vào.

Phương pháp thứ hai sử dụng một biến có tên và hoạt động trong cả mô-đun Tests (Kiểm tra) và APIs. Trong yêu cầu đăng nhập, hãy mở các bộ xử lý sau (post-processors) của nó và thêm hành động `Extract Variable` (Trích xuất biến). Trích xuất trường bạn quan tâm bằng biểu thức JSONPath, ví dụ `$.token`, và Apidog sẽ lưu trữ nó dưới một tên. Sau đó bạn có thể tham chiếu nó ở bất kỳ đâu sau này dưới dạng `{{token}}`. Đây là cách tiếp cận linh hoạt hơn khi bạn muốn cùng một giá trị có sẵn trên các mô-đun hoặc trong một số nhánh. Cơ chế sâu hơn của việc di chuyển giá trị giữa các bước được đề cập trong hướng dẫn về cách truyền dữ liệu giữa các bước kiểm tra.

Đối với nhánh mã trạng thái, `Retrieve pre-step data` (Truy xuất dữ liệu bước trước) trên trạng thái của bước đăng nhập là con đường ngắn nhất.

Bước 6: Thêm nhánh else

Di chuột qua khối If và nhấp vào `+ Else`. Điều này cung cấp cho bạn đường dẫn thay thế chạy khi điều kiện sai, nghĩa là đăng nhập không trả về 200.

Bây giờ hãy điền vào cả hai phía:

Kịch bản của bạn bây giờ đọc giống như logic đơn giản: nếu đăng nhập bằng 200, chạy thanh toán; nếu không, báo cáo và dừng.

Bước 7: Lưu

Nhấp vào `Save All` (Lưu tất cả) để lưu kịch bản. Các thay đổi chưa được lưu sẽ hiển thị một dấu chấm, vì vậy nếu bạn thấy dấu chấm đó, bạn vẫn còn việc phải làm. Chạy toàn bộ kịch bản và xem nhánh được giải quyết. Trỏ đăng nhập đến thông tin đăng nhập hợp lệ và khối If sẽ được kích hoạt. Trỏ nó đến thông tin đăng nhập không hợp lệ và khối Else sẽ được kích hoạt thay thế.

Các biến thể và kiểm soát luồng nâng cao

Khi nhánh cơ bản hoạt động, các khối xây dựng tương tự sẽ bao quát nhiều khía cạnh.

Phân nhánh dựa trên một trường trong body, không chỉ trạng thái. Mã trạng thái là trường hợp phổ biến, nhưng các điều kiện đọc bất kỳ giá trị nào bạn có thể tham chiếu. Giả sử đăng nhập của bạn trả về `200` ngay cả đối với tài khoản bị khóa, với trạng thái thực tế nằm trong trường `status`. Truy xuất `{{$.1.response.body.status}}` và sử dụng toán tử `Equals` (Bằng) so với `"active"`, hoặc sử dụng `Contains` (Chứa) so với một chuỗi thông báo. Danh sách các toán tử cũng cung cấp cho bạn các kiểm tra phạm vi: `Greater than` (Lớn hơn) trên số dư trả về, `In List` (Trong danh sách) để kiểm tra xem một vai trò trả về có phải là một trong số các giá trị được phép hay không.

Kết hợp phân nhánh với vòng lặp. Phân nhánh và lặp lại kết hợp với nhau. Bên trong một vòng lặp ForEach qua một mảng ID sản phẩm, một bước Phân nhánh Điều kiện có thể bỏ qua các sản phẩm hết hàng và xử lý phần còn lại. Tham chiếu chỉ mục vòng lặp `{{$.<loop step id>.index}}` bắt đầu từ 0, và một phần tử ForEach là `{{$.<loop step id>.element.<field path>}}`. Vòng lặp là một chủ đề riêng; hướng dẫn vòng lặp ForEach sẽ đi sâu vào chúng một cách thích hợp.

Dừng vòng lặp sớm bằng Break If. Khi bạn đang lặp, phần tử `Break If condition` (Điều kiện ngắt nếu) sẽ kết thúc vòng lặp ngay khi một điều kiện được đáp ứng. Bạn có thể kéo nó để định vị lại và thêm nó nhiều lần trong một vòng lặp.

Xử lý lỗi với On Error. Vòng lặp mang một phần tử `On Error` (Khi có lỗi) được cố định ở đầu vòng lặp, mà bạn không thể di chuyển. Các tùy chọn của nó quyết định điều gì sẽ xảy ra khi một yêu cầu bên trong vòng lặp gặp lỗi: `Ignore` (Bỏ qua) tiếp tục với yêu cầu tiếp theo, `Continue` (Tiếp tục) bỏ qua phần còn lại của các yêu cầu của chu kỳ hiện tại, `Break execution` (Ngắt thực thi) dừng vòng lặp và tiếp tục sau đó, và `End execution` (Kết thúc thực thi) dừng toàn bộ kịch bản.

Thêm một khoảng chờ giữa các bước. Đôi khi một dịch vụ hạ nguồn cần một khoảng thời gian trước khi nó phản ánh một thao tác ghi. Phần tử `Wait` (Chờ) thêm một độ trễ được đo bằng mili giây, hữu ích giữa một lệnh gọi tạo và lệnh đọc kiểm tra nó.

Tham chiếu giá trị bên trong các script. Nếu một nhánh cần logic quá phức tạp đối với danh sách các toán tử, một script pre-processor (tiền xử lý) hoặc post-processor (hậu xử lý) có thể tính toán nó. Bên trong một script, bạn không thể sử dụng trực tiếp cú pháp `{{variable}}`. Thay vào đó, hãy sử dụng `pm.variables.get("$.2.response.body.token")`, khớp với ID bước và đường dẫn trường bạn muốn. Đối với mẫu rộng hơn về việc nối chuỗi các yêu cầu để yêu cầu này cung cấp dữ liệu cho yêu cầu tiếp theo, hãy xem hướng dẫn về nối chuỗi yêu cầu và bài viết sâu hơn về điều phối kiểm tra API và truyền dữ liệu.

Lưu ý về tự tham chiếu: một kịch bản không thể tham chiếu chính kịch bản kiểm tra gốc. Cơ chế bảo vệ đó ngăn chặn các vòng lặp vô hạn ngoài ý muốn khi bạn lồng các kịch bản.

Tự động hóa quy trình làm việc với Apidog CLI

Kịch bản bạn vừa xây dựng không nhất thiết phải chạy chỉ bên trong ứng dụng. Apidog cung cấp một trình chạy dòng lệnh (command-line runner) thực thi các kịch bản đã lưu một cách không giao diện (headless), điều này chính xác là những gì bạn muốn trong CI. Cài đặt và đăng nhập:

npm install -g apidog-cli
apidog login --with-token <YOUR_ACCESS_TOKEN>

Sau đó, chạy kịch bản phân nhánh của bạn bằng ID, trỏ nó đến một môi trường và chọn một bộ báo cáo (reporter):

apidog run --access-token $APIDOG_ACCESS_TOKEN -t <scenario_id> -e <env_id> -r cli

Ở đây `-t` là ID kịch bản kiểm tra, `-e` là ID môi trường và `-r` là bộ báo cáo. Sử dụng `cli` cho đầu ra console, hoặc `html` và `junit` cho các tạo phẩm mà pipeline của bạn có thể xuất bản; phân tách chúng bằng dấu phẩy như `-r html,cli` để xuất nhiều loại cùng một lúc. Nhánh được giải quyết theo cùng một cách như trong ứng dụng: trình chạy đọc phản hồi đăng nhập, đi theo đường dẫn If hoặc Else, và mã thoát phản ánh kết quả để một lần đăng nhập thất bại sẽ làm lỗi bản dựng. Thiết lập đầy đủ nằm trong hướng dẫn cài đặt Apidog CLI, và cách tích hợp nó vào một pipeline được đề cập trong hướng dẫn GitHub Actions của Apidog CLI. Nếu bạn muốn chạy cùng một kịch bản theo lịch trình thay vì mỗi lần commit, hãy xem cách lên lịch kiểm tra API trong Apidog.

Câu hỏi thường gặp

Sự khác biệt giữa Phân nhánh Điều kiện và vòng lặp trong Apidog là gì?

Phân nhánh Điều kiện quyết định một lần xem một khối các bước có chạy hay không, dựa trên một điều kiện. Một vòng lặp chạy một khối nhiều lần. Sử dụng một nhánh khi bạn có một quyết định chọn một trong hai, chẳng hạn như chỉ tiếp tục đến thanh toán nếu đăng nhập thành công. Sử dụng vòng lặp For hoặc ForEach khi bạn cần lặp lại một yêu cầu trên một số lượng hoặc một mảng. Hướng dẫn vòng lặp ForEach bao gồm toàn bộ phần lặp.

Tại sao tham chiếu `Retrieve pre-step data` của tôi lại trả về trống?

Hai nguyên nhân phổ biến. Thứ nhất, `Retrieve pre-step data` chỉ hoạt động trong mô-đun Tests (Kiểm tra), không phải mô-đun APIs. Thứ hai, nó chỉ được giải quyết khi bạn chạy toàn bộ kịch bản kiểm tra. Nếu bạn chạy một bước riêng lẻ, tham chiếu chưa có gì để trỏ đến. Hãy chạy toàn bộ kịch bản và giá trị sẽ được điền vào.

Tôi có thể phân nhánh dựa trên một trường bên trong body phản hồi, chứ không chỉ mã trạng thái không?

Có. Tham chiếu trường bằng một biểu thức pre-step như `{{$.1.response.body.status}}` hoặc trích xuất nó vào một biến có tên, sau đó chọn một toán tử như `Equals` (Bằng), `Contains` (Chứa) hoặc `In List` (Trong danh sách). Bất kỳ giá trị nào bạn có thể tham chiếu đều có thể điều khiển một điều kiện. Việc di chuyển các giá trị đó được đề cập trong cách truyền dữ liệu giữa các bước kiểm tra.

Làm cách nào để sử dụng một biến bên trong một script thay vì một trình tạo điều kiện?

Các script không chấp nhận trực tiếp cú pháp `{{variable}}`. Thay vào đó, hãy sử dụng `pm.variables.get("$.2.response.body.token")` trong một script tiền xử lý (pre-processor) hoặc hậu xử lý (post-processor), khớp với ID bước và đường dẫn trường bạn muốn.

Phân nhánh có tốn thêm chi phí, hay yêu cầu phiên bản tự lưu trữ (self-hosted) không?

Tài liệu Apidog không liệt kê bất kỳ hạn chế nào về gói tính năng đối với kiểm soát luồng, phân nhánh điều kiện, vòng lặp hoặc truyền dữ liệu, và không có sự phân biệt giữa phiên bản đám mây và phiên bản tự lưu trữ cho các tính năng này. Nếu bạn có thể xây dựng một kịch bản, bạn có thể thêm các nhánh vào đó.

Tổng kết

Một bài kiểm tra tuyến tính cho bạn biết có gì đó đã hỏng. Một bài kiểm tra phân nhánh cho bạn biết ở đâu, và ngừng lãng phí các bước trên một đường dẫn không thể thành công nữa. Thêm một bước Phân nhánh Điều kiện, cung cấp cho nó một phản hồi trước đó bằng `Retrieve pre-step data` hoặc một biến đã trích xuất, kết nối If và `+ Else`, và kịch bản của bạn bây giờ sẽ đưa ra quyết định theo cách mà API thực của bạn làm. Khi nó hoạt động trong ứng dụng, một lệnh `apidog run` sẽ mang cùng logic đó vào CI. Hãy dùng thử Apidog miễn phí, không yêu cầu thẻ tín dụng, và biến các bài kiểm tra tuyến tính của bạn thành các kịch bản có khả năng tư duy.

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API