Khi thiết kế quy trình kiểm thử tự động trong Apidog, bạn sẽ sử dụng nhiều loại bước kiểm thử khác nhau—như yêu cầu API, truy vấn cơ sở dữ liệu, vòng lặp For, vòng lặp ForEach, Scripts, và nhiều hơn nữa.

Thông thường, dữ liệu được tạo ra ở một bước cần được sử dụng ở bước sau. Điều này tạo ra một luồng logic trong đó dữ liệu thúc đẩy quá trình, và các bước được liên kết với nhau.
Ví dụ, bạn có thể:
- Truy xuất mã thông báo người dùng ở bước trước, hoặc chạy truy vấn cơ sở dữ liệu để lấy một bản ghi cụ thể
- Sau đó sử dụng các kết quả đó trong một yêu cầu điểm cuối ở bước tiếp theo.
Điều này đặt ra một câu hỏi quan trọng:
Làm thế nào để bạn có thể tham chiếu chính xác dữ liệu từ các bước trước (upstream) trong các bước tiếp theo (downstream)?
Hai cơ chế truyền dữ liệu trong Apidog
Trong kiểm thử tự động của Apidog, có hai phương pháp chính để truyền dữ liệu giữa các bước kiểm thử khác nhau:
1. Truy xuất dữ liệu bước trước thông qua "Giá trị động"
Bạn có thể trực tiếp tham chiếu đầu ra của một bước trước (upstream) trong một bước sau (downstream) bằng cách sử dụng tính năng "Giá trị động". Điều này cho phép bạn lấy dữ liệu ngay lập tức mà không cần lưu trữ.

2. Lưu trữ biến và tái sử dụng
Bạn có thể trích xuất dữ liệu quan trọng từ một bước upstream và lưu trữ nó dưới dạng biến. Các biến này sau đó có thể được tái sử dụng trong bất kỳ bước nào tiếp theo.

Nắm vững hai phương pháp truyền dữ liệu này là chìa khóa để xây dựng các quy trình làm việc tự động hiệu quả, dựa trên dữ liệu trong Apidog.
Bài viết này giải thích cách xử lý dữ liệu trong các loại bước kiểm thử khác nhau từ hai góc độ: cách trích xuất dữ liệu và cách sử dụng nó. Bằng cách hiểu cả hai, bạn sẽ có thể xây dựng các quy trình kiểm thử linh hoạt hơn và kết nối tốt hơn.
Trích xuất và sử dụng dữ liệu phản hồi điểm cuối
Hiểu dữ liệu phản hồi điểm cuối
Trong kiểm thử tự động, các yêu cầu API thường trả về các phản hồi JSON có cấu trúc, thường đóng vai trò là đầu vào cho các bước kiểm thử sau này.

Không giống như các loại bước khác, phản hồi điểm cuối có xu hướng phức tạp hơn — thường xuyên bao gồm các đối tượng và mảng lồng nhau.
Cách trích xuất dữ liệu từ phản hồi điểm cuối
Có hai cách chính để trích xuất và truyền dữ liệu phản hồi điểm cuối giữa các bước kiểm thử:
Phương pháp một: Tham chiếu giá trị động
Sử dụng "Giá trị động" để trực tiếp tham chiếu dữ liệu từ các bước trước:
- Trong bất kỳ trường nhập liệu nào của một bước downstream, nhấp vào biểu tượng đũa thần.
- Chọn "Truy xuất dữ liệu bước trước"
- Apidog sẽ tự động chèn biểu thức chính xác — không cần phải viết thủ công.

Phương pháp hai: Trích xuất dữ liệu dưới dạng biến
Bạn cũng có thể sử dụng tính năng "Trích xuất biến" trong bộ xử lý hậu kỳ điểm cuối để trích xuất các trường cụ thể từ phản hồi dưới dạng biến.
Ví dụ, để trích xuất id
của các sản phẩm trong một phản hồi:
- Đặt tên biến là
products_id
- Sử dụng JSONPath:
$.products[0].id

Trong các bước sau, chỉ cần tham chiếu nó bằng cách sử dụng {{products_id}}
.
Cách sử dụng dữ liệu được trích xuất từ phản hồi điểm cuối
Sau khi bạn đã trích xuất dữ liệu từ phản hồi API—bằng cách sử dụng "Giá trị động" hoặc "Biến được trích xuất"—bạn có thể sử dụng dữ liệu đó trong các bước downstream theo nhiều cách:
1. Sử dụng dữ liệu trong yêu cầu điểm cuối
- Qua giá trị động: Giống như trước, nhấp vào biểu tượng đũa thần trong trường nhập liệu, chọn "Truy xuất dữ liệu bước trước", và Apidog sẽ tự động chèn biểu thức chính xác.
- Qua biến được trích xuất: Nếu bạn đã lưu một giá trị dưới dạng biến (ví dụ:
products_id
), chỉ cần sử dụng{{products_id}}
làm tham số trong yêu cầu API.

2. Sử dụng dữ liệu trong các thao tác cơ sở dữ liệu
Bạn có thể sử dụng phản hồi API làm đầu vào trong một truy vấn cơ sở dữ liệu. Cả hai phương pháp đều hoạt động:
- Phương pháp giá trị động
SELECT * FROM products WHERE id = '{{$.1.response.body.products[0].id}}'
Sử dụng giá trị động để tham chiếu dữ liệu phản hồi API trực tiếp trong truy vấn SQL:

- Phương pháp biến được trích xuất: Nếu bạn đã trích xuất ID sản phẩm dưới dạng biến có tên
products_id
, hãy sử dụng:
SELECT * FROM products WHERE id = '{{products_id}}'
3. Sử dụng dữ liệu trong Vòng lặp For
Để lặp lại các bước dựa trên độ dài của một mảng từ phản hồi API:
- Sử dụng giá trị động để lấy độ dài mảng, ví dụ:
{{$.1.response.body.products.length}}
Điều này đặt số lần lặp của vòng lặp.

4. Sử dụng dữ liệu trong Vòng lặp ForEach
Nếu bạn muốn lặp qua từng mục trong một mảng được trả về bởi một điểm cuối:
- Phương pháp giá trị động: Trực tiếp trích xuất toàn bộ mảng, ví dụ
{{$.1.response.body.products}}

- Phương pháp trích xuất biến: Giả sử toàn bộ mảng đã được trích xuất dưới dạng biến
products
, sau đó trực tiếp chèn{{products}}
vào vòng lặp.

5. Sử dụng dữ liệu trong scripts
Để sử dụng dữ liệu từ các bước trước bên trong một script, hãy sử dụng phương thức pm.variables.get()
. Cách thực hiện như sau:
- Phương pháp giá trị động: Đọc dữ liệu trực tiếp từ một bước trước:
const products = pm.variables.get("$.1.response.body.products")

- Phương pháp trích xuất biến: Nếu bạn đã lưu mảng hoặc giá trị dưới dạng biến, hãy sử dụng script sau để lấy dữ liệu:
Lấy giá trị của một biến tạm thời:
const products = pm.variables.get("products")
Lấy giá trị của một biến môi trường:
const products = pm.environment.get("products")
Lấy giá trị của một biến toàn cục:
const products = pm.globals.get("products")
{{products}}
. Thay vào đó, bạn phải truy xuất giá trị biến bằng cách sử dụng các phương thức thích hợp đã đề cập ở trên.Trích xuất và sử dụng kết quả truy vấn cơ sở dữ liệu
Hiểu dữ liệu cơ sở dữ liệu
Khi một bước truy vấn cơ sở dữ liệu được thực thi, nó trả về dữ liệu có cấu trúc dưới dạng một mảng các đối tượng. Ngay cả khi chỉ có một bản ghi được trả về, nó vẫn sẽ được gói trong một mảng. Ví dụ:

Không giống như phản hồi điểm cuối, dữ liệu từ các bước cơ sở dữ liệu không thể được truy cập trực tiếp bằng các biến động. Bạn phải trích xuất các giá trị vào biến trước.
Cách trích xuất dữ liệu từ cơ sở dữ liệu
Sau khi chạy truy vấn SQL trong một bước cơ sở dữ liệu, Apidog sẽ tự động phân tích phản hồi thành dữ liệu có cấu trúc, như sau:
[
{
"id": "1000",
"title": "Title 1",
"description": "Description for Title 1"
}
]
Sau đó, bạn có thể sử dụng JSONPath để trích xuất các trường cụ thể và lưu chúng dưới dạng biến.
Ví dụ:
- Tên biến:
products_id
- JSONPath:
$[0].id
(để trích xuất ID của mục đầu tiên). Nếu bạn muốn trích xuất toàn bộ tập kết quả, hãy sử dụng:$
. - Các bước downstream tham chiếu biến thông qua
{{ }}
, ví dụ:{{products_id}}

Cách sử dụng dữ liệu được trích xuất từ cơ sở dữ liệu
1. Sử dụng dữ liệu trong yêu cầu điểm cuối
Nếu truy vấn cơ sở dữ liệu của bạn trả về một ID và bạn đã lưu nó dưới dạng biến (products_id
), bạn có thể trực tiếp sử dụng nó trong một yêu cầu điểm cuối downstream:

2. Sử dụng dữ liệu trong Vòng lặp ForEach
Nếu truy vấn của bạn trả về một danh sách các bản ghi, và bạn muốn xử lý từng bản ghi một cách riêng lẻ, bạn có thể sử dụng toàn bộ mảng làm nguồn cho một vòng lặp ForEach
:

Tiền đề là bạn lưu toàn bộ mảng khi trích xuất biến trong các thao tác cơ sở dữ liệu, ví dụ:
- Tên biến:
products
- JSONPath:
$

3. Sử dụng dữ liệu trong scripts
Để sử dụng các biến cơ sở dữ liệu đã trích xuất trong một script, hãy sử dụng cùng phương pháp như với các biến khác.
Lấy giá trị của một biến tạm thời:
const products = pm.variables.get("products")
Lấy giá trị của một biến môi trường:
const products = pm.environment.get("products")
Lấy giá trị của một biến toàn cục:
const products = pm.globals.get("products")
Trích xuất và sử dụng dữ liệu từ Vòng lặp For
Vòng lặp For
hoạt động như thế nào?
Một Vòng lặp For
được sử dụng để lặp lại một tập hợp hành động cụ thể nhiều lần. Nó chạy dựa trên một số lần lặp được xác định.
Bạn có thể đặt số lần lặp cố định, hoặc sử dụng một giá trị động như độ dài của một mảng .length
được trả về từ một bước trước. Ví dụ: {{$.1.response.body.products.length}}
:

Lưu ý: Không giống như các bước khác xuất dữ liệu, một Vòng lặp For
bản thân nó không trực tiếp trả về dữ liệu. Nó chỉ cung cấp một giá trị chỉ mục (bắt đầu từ 0) để hiển thị số lần vòng lặp đã được thực thi.
Cách trích xuất dữ liệu từ Vòng lặp For
Trong quá trình thực thi, bạn có thể truy cập chỉ mục vòng lặp hiện tại bằng cú pháp biến động: {{$.9.index}}

- Số
9
đề cập đến ID của bướcVòng lặp For
. - Mỗi bước có một ID duy nhất.
- Chỉ mục bắt đầu từ 0 cho vòng lặp đầu tiên, 1 cho vòng lặp thứ hai, v.v.
Cách sử dụng dữ liệu được trích xuất từ Vòng lặp For
1. Sử dụng dữ liệu trong scripts
Nếu bạn muốn sử dụng thông tin liên quan đến vòng lặp trong test script của mình, bạn có thể sử dụng pm.variables.get()
để lấy chỉ mục hiện tại:
// Get the current loop index
const index = pm.variables.get("$.7.index");

2. Sử dụng dữ liệu với các nguồn dữ liệu khác
Một trường hợp sử dụng phổ biến cho Vòng lặp For
là xử lý dữ liệu từ các bước trước—như lặp qua một mảng và xử lý từng mục:
// Get the array from a previous step
const products = pm.variables.get("$.1.response.body.products");
// Get the current loop index
const index = pm.variables.get("$.7.index");
// Access the current item in the array using the index
console.log(products[index]);
Điều này cho phép bạn thực hiện các thao tác hàng loạt trên mỗi mục trong mảng trong mỗi lần lặp vòng lặp.
Trích xuất và sử dụng dữ liệu từ Vòng lặp ForEach
Vòng lặp ForEach
hoạt động như thế nào?
Vòng lặp ForEach được thiết kế đặc biệt cho dữ liệu mảng. Nó tự động lặp qua từng phần tử trong mảng và thực hiện cùng một tập hợp các thao tác.
Sự khác biệt chính giữa Vòng lặp ForEach
và Vòng lặp For
là Vòng lặp ForEach
tự động trích xuất toàn bộ dữ liệu của phần tử mảng hiện tại trong mỗi lần lặp, giúp nó có thể truy cập trực tiếp trong các bước con của nó.
Truy cập dữ liệu trong Vòng lặp ForEach
Trong một Vòng lặp ForEach
, hệ thống tự động tạo ra hai biến đặc biệt:
- Các phần tử vòng lặp hiện tại: Chứa toàn bộ dữ liệu của phần tử mảng đang được xử lý. Ví dụ:
{{$.4.element}}
. Nếu mảng chứa các đối tượng, bạn có thể trực tiếp truy cập các thuộc tính của chúng, chẳng hạn như:{{$.4.element.id}}
,{{$.4.element.title}}
, v.v.

- Chỉ mục vòng lặp hiện tại: Đại diện cho số lần lặp hiện tại (bắt đầu từ 0), ví dụ:
{{$.4.index}}
.

Lưu ý: Số 4
đề cập đến ID của bước Vòng lặp ForEach
. Trong quy trình làm việc thực tế của bạn, hãy thay thế điều này bằng ID bước chính xác từ quy trình của bạn.
Các trường hợp sử dụng phổ biến cho dữ liệu Vòng lặp ForEach
1. Sử dụng dữ liệu trong yêu cầu điểm cuối
Vòng lặp ForEach rất phù hợp để xử lý các thao tác dữ liệu hàng loạt. Ví dụ, nếu bạn có một mảng các mục, bạn có thể tự động gửi yêu cầu điểm cuối cho mỗi mục trong mảng. Trong mỗi vòng lặp, cùng một mẫu yêu cầu được tái sử dụng, nhưng được điền với dữ liệu khác nhau, chẳng hạn như {{$.4.element.id}}
.

2. Sử dụng dữ liệu trong các thao tác cơ sở dữ liệu
Bạn có thể sử dụng dữ liệu từ mục vòng lặp hiện tại để chạy truy vấn cơ sở dữ liệu hoặc chèn nhiều hàng.
Ví dụ: Truy vấn cơ sở dữ liệu bằng cách sử dụng trường của mục hiện tại
SELECT * FROM products WHERE id = '{{$.4.element.id}}'
Biểu thức {{$.4.element.id}}
có thể được truy cập bằng tính năng giá trị động.

Chèn nhiều trường từ mục hiện tại vào một bảng:
INSERT INTO products (id, title) VALUES ('{{$.4.element.id}}', '{{$.4.element.title}}')
3. Sử dụng dữ liệu trong scripts
Nếu bạn cần xử lý thêm dữ liệu từ vòng lặp trong một script tùy chỉnh, bạn có thể sử dụng phương thức pm.variables.get()
để truy xuất các giá trị:
// Get the current element
const item = pm.variables.get("$.4.element");
// Get the current index
const index = pm.variables.get("$.4.index");
Trích xuất và sử dụng dữ liệu từ Scripts
Dữ liệu Script hoạt động như thế nào
Không giống như các bước khác trong một quy trình làm việc, scripts không tự động tạo ra đầu ra có thể được sử dụng trực tiếp trong các bước tiếp theo. Nếu bạn muốn truyền dữ liệu từ một script sang các bước sau, bạn phải lưu trữ thủ công nó trong một biến.
Cách trích xuất dữ liệu từ một Script
Bạn có thể lưu các giá trị vào các loại biến khác nhau như sau:
// Get JSON response data
// 1. From the current endpoint response
// const currentData = pm.response.json();
// 2. Or get it from a previous step using a dynamic value
const preData = pm.variables.get("$.1.response.body");
// Save to environment variables
pm.environment.set('products', preData.products);
pm.environment.set('products_id', preData.products[0].id);
// Save to global variables
pm.globals.set('products', preData.products);
// Save to temporary variables (valid only during this run)
pm.variables.set('products', preData.products);
Khi các biến đã được trích xuất và thiết lập, bạn có thể tham chiếu chúng trong các bước sau bằng cách sử dụng cú pháp {{variableName}}
.
Cách sử dụng dữ liệu được trích xuất từ Scripts
1. Sử dụng dữ liệu trong yêu cầu điểm cuối
Các biến được đặt trong một script có thể được sử dụng trực tiếp làm tham số trong các yêu cầu điểm cuối downstream. Ví dụ, nếu bạn lưu products_id
trong script, bạn có thể tham chiếu nó trong một yêu cầu sau này như sau: {{products_id}}
.

2. Sử dụng dữ liệu trong các thao tác cơ sở dữ liệu
Các biến script cũng có thể được sử dụng để xây dựng các câu lệnh SQL động. Ví dụ:
SELECT * FROM products WHERE id = '{{products_id}}'
3. Sử dụng dữ liệu trong Vòng lặp For
Bạn có thể sử dụng một script để tạo số lần lặp hoặc các giá trị trung gian khác, lưu chúng dưới dạng "biến tạm thời", và truyền chúng đến bước Vòng lặp For
:
pm.variables.set("loopCount", 5);
Sau đó, trong cài đặt vòng lặp, sử dụng {{loopCount}}
làm số lần lặp.
4. Sử dụng dữ liệu trong Vòng lặp ForEach
Bạn có thể lưu trữ toàn bộ một mảng trong một biến và sử dụng nó làm nguồn dữ liệu cho một Vòng lặp ForEach
.
Ví dụ:
// Optionally retrieve array from a previous step using dynamic values
// const preData = pm.variables.get("$.1.response.body.products")
const preData = [{id: 1}, {id: 2}, {id: 3}];
// Save to environment variable
pm.environment.set('products', preData);
Sau đó, trong Vòng lặp ForEach
, đặt nguồn dữ liệu thành {{products}}
.
Kết luận
Để xây dựng một quy trình kiểm thử tự động hiệu quả, điều cần thiết là phải hiểu cách trích xuất và sử dụng dữ liệu từ các loại bước khác nhau:
- Các bước điểm cuối và cơ sở dữ liệu tạo ra dữ liệu liên quan đến nghiệp vụ.
- Các bước vòng lặp kiểm soát luồng logic.
- Các bước script được sử dụng để xử lý và biến đổi dữ liệu.
Bằng cách kết hợp tham chiếu giá trị động với trích xuất biến, bạn có thể thiết kế một quy trình kiểm thử linh hoạt và mạnh mẽ dựa trên dữ liệu.
Các phương pháp hay nhất để truyền dữ liệu:
- Sử dụng tham chiếu giá trị động cho dữ liệu đơn giản chỉ được sử dụng một lần hoặc thỉnh thoảng.
- Sử dụng trích xuất biến cho dữ liệu cần được tái sử dụng qua nhiều bước hoặc được xử lý trong scripts.
Việc chọn phương pháp phù hợp dựa trên độ phức tạp của dữ liệu và tần suất sử dụng sẽ giúp quy trình làm việc của bạn dễ bảo trì và hiệu quả hơn.