Cách sử dụng truy vấn cơ sở dữ liệu trong kiểm thử API với Apidog (MySQL, MongoDB, Redis)

Tìm hiểu cách sử dụng truy vấn cơ sở dữ liệu trong kiểm thử API với Apidog: khởi tạo dữ liệu, đối chiếu các hàng với MySQL, MongoDB và Redis, và trích xuất giá trị DB giữa các bước.

INEZA Felin-Michel

INEZA Felin-Michel

15 tháng 7 2026

Cách sử dụng truy vấn cơ sở dữ liệu trong kiểm thử API với Apidog (MySQL, MongoDB, Redis)

Apidog cho doanh nghiệp

Triển khai tại chỗ

SSO & RBAC

Tuân thủ SOC 2

Khám phá Apidog Enterprise

Một mã trạng thái xanh có thể lừa dối. Điểm cuối `POST /orders` của bạn trả về `201 Created`, nội dung phản hồi trông hoàn hảo và bài kiểm tra của bạn đã vượt qua. Nhưng liệu hàng đó có thực sự được lưu vào cơ sở dữ liệu với trạng thái đúng không? Liệu số lượng hàng tồn kho có giảm đi không? Một bài kiểm tra chỉ đọc phản hồi HTTP sẽ kiểm tra những gì API *đã nói*, chứ không phải những gì hệ thống *đã làm*. Để khắc phục khoảng cách đó, bạn phải tự mình xem xét cơ sở dữ liệu.

Đó là lúc các truy vấn cơ sở dữ liệu trong một kịch bản kiểm thử phát huy tác dụng. Bạn thiết lập một trạng thái đã biết trước khi gửi yêu cầu, gửi yêu cầu, sau đó truy vấn bảng để xác nhận sự thật trên đĩa. Apidog có tính năng này được tích hợp thông qua Kết nối Cơ sở dữ liệu (Database Connections) và bộ xử lý Thao tác Cơ sở dữ liệu (Database Operation processor), vì vậy bạn có thể chạy các lệnh SQL hoặc NoSQL như các bước trong cùng một kịch bản điều khiển các cuộc gọi HTTP của mình, mà không cần bất kỳ mã kịch bản bên ngoài nào. Nếu bạn mới xây dựng kịch bản, hướng dẫn về cách viết kịch bản kiểm thử với Apidog bao gồm các kiến thức cơ bản ở cấp độ yêu cầu mà bài viết này xây dựng dựa trên. Để ôn lại cách các kho lưu trữ quan hệ mô hình hóa dữ liệu này, tổng quan về phía máy chủ của MDN là một tài liệu giới thiệu vững chắc.

button

Những lợi ích của thao tác cơ sở dữ liệu trong một bài kiểm thử

Một bài kiểm thử API mà không chạm vào cơ sở dữ liệu là một hộp đen. Nó tin tưởng vào phản hồi. Hầu hết thời gian điều đó không sao, nhưng những lỗi thú vị nằm ở khoảng cách giữa những gì API trả về và những gì nó duy trì: một trường trạng thái không bao giờ thay đổi, một khóa ngoại trỏ đến hư không, một lệnh xóa mềm lại xóa cứng.

Các bước thao tác cơ sở dữ liệu cho phép bạn làm ba điều mà một bài kiểm thử HTTP thuần túy không thể:

Apidog chia tính năng này thành hai phần. Đầu tiên, bạn tạo một kết nối có thể tái sử dụng trong Cài đặt > Kết nối cơ sở dữ liệu (Settings > Database Connections). Sau đó, bạn đính kèm một bước Thao tác cơ sở dữ liệu (Database Operation) vào một yêu cầu dưới dạng Bộ xử lý trước (Pre Processor) (chạy trước yêu cầu) hoặc Bộ xử lý sau (Post Processor) (chạy sau). Một kết nối, được tái sử dụng trong mọi kịch bản trong dự án.

Một lưu ý về phạm vi trước khi bạn lên kế hoạch. MySQL, SQL Server (2014 trở lên), PostgreSQL và Oracle hoạt động trên gói miễn phí. ClickHouse, MongoDB và Redis là các gói trả phí. Tài liệu của MongoDB nêu rõ: kết nối với MongoDB là một tính năng trả phí. Tương tự đối với Redis. Vì vậy, hướng dẫn về MySQL dưới đây chạy trên gói miễn phí; các phần Mongo và Redis cần gói trả phí.

Bước 1: Tạo kết nối cơ sở dữ liệu

Mở Cài đặt > Kết nối cơ sở dữ liệu (Settings > Database Connections) và nhấp vào + Mới ở góc trên bên phải. Chọn loại cơ sở dữ liệu của bạn, sau đó điền vào các trường kết nối:

Nếu cơ sở dữ liệu của bạn nằm sau một bastion, hãy mở rộng phần Đường hầm SSH (SSH Tunnel) và thêm chi tiết máy chủ trung gian (jump-host). MySQL cũng cung cấp chế độ SSL với bốn tùy chọn: `Prefer` (mặc định, thử SSL sau đó quay lại), `Require`, `Verify CA` và `Verify Full`. Chọn tùy chọn nghiêm ngặt nhất mà máy chủ của bạn hỗ trợ. Sau đó nhấp vào Lưu (Save).

Hai lỗi thường gặp khi kết nối sẽ giúp bạn tiết kiệm một buổi chiều bối rối:

Bước 2: Nạp dữ liệu bằng Bộ xử lý trước (Pre Processor)

Giả sử bạn đang kiểm thử quy trình tạo đơn hàng. Bạn muốn một khách hàng đã biết phải tồn tại trước khi đặt hàng, để bài kiểm thử không phụ thuộc vào bất cứ điều gì có sẵn trong bảng.

Mở yêu cầu của bạn, tìm Bộ xử lý trước (Pre Processors), di chuột qua Thêm Bộ xử lý cơ sở dữ liệu (Add Database Processor) và chọn Thao tác cơ sở dữ liệu (Database operation). Đặt tên cho nó như `seed customer`, chọn kết nối MySQL của bạn, sau đó trong phần Nhập lệnh SQL (Enter SQL Command), viết một lệnh INSERT. Các biến động sử dụng cú pháp `{{variable_name}}`, vì vậy bạn có thể lấy các giá trị trực tiếp từ môi trường của mình:

INSERT INTO customers (id, email, status)
VALUES ({{customer_id}}, '{{customer_email}}', 'active')
ON DUPLICATE KEY UPDATE status = 'active';

Bây giờ yêu cầu chạy với một trạng thái được đảm bảo. Khách hàng tồn tại, đang hoạt động và có một ID mà các bước sau của bạn đã biết. Việc nạp dữ liệu trong Bộ xử lý trước giúp mỗi bài kiểm thử tự chứa thay vì dựa vào các tác dụng phụ của thứ tự kiểm thử.

Bước 3: Xác nhận với cơ sở dữ liệu bằng Bộ xử lý sau (Post Processor)

Đây là phần cốt lõi. Yêu cầu của bạn tạo một đơn hàng. Sau khi nó trả về, bạn truy vấn bảng `orders` để xác nhận hàng đó tồn tại với trạng thái đúng.

Thêm yêu cầu gọi API của bạn:

POST /api/orders
Content-Type: application/json

{
  "customer_id": {{customer_id}},
  "items": [{ "sku": "APRON-01", "qty": 2 }]
}

Giả sử nội dung phản hồi mang theo ID đơn hàng mới, mà bạn thu thập vào một biến gọi là `order_id` bằng một xác nhận phản hồi thông thường. Bây giờ mở Bộ xử lý sau (Post Processors) trên yêu cầu đó. Trong chế độ THIẾT KẾ (DESIGN Mode), bạn sẽ tìm thấy chúng trong tab Chạy (Run); trong chế độ GỠ LỖI (DEBUG Mode), chúng nằm trong tab Yêu cầu (Request). Di chuột qua Thêm Bộ xử lý sau (Add PostProcessor), chọn Thao tác cơ sở dữ liệu (Database operation), đặt tên là `verify order row`, và chọn kết nối của bạn.

Trong phần Cấu hình thao tác (Configure Operation), chọn thao tác và nhập SQL:

SELECT id, status, total_cents
FROM orders
WHERE id = {{order_id}};

Kết quả truy vấn trả về dưới dạng một mảng các đối tượng, mỗi đối tượng cho một hàng. Để lấy một trường duy nhất, mở Trích xuất kết quả (Tùy chọn) (Extract Results (Optional)) và thêm một mục Trích xuất kết quả vào biến (Extract Result To Variable). Đặt Tên biến (Variable Name) như `db_order_status` và một Biểu thức JSONPath (JSONPath Expression) để cô lập trường từ hàng đầu tiên:

$[0].status

Nhấp vào Gửi (Send) và kiểm tra Bảng điều khiển (Console) để xem kết quả thô và giá trị đã trích xuất. Bây giờ `db_order_status` chứa những gì thực sự có trên đĩa. Thêm một xác nhận rằng nó bằng `pending` (hoặc bất cứ thứ gì API của bạn được cho là sẽ đặt), và bài kiểm thử của bạn cuối cùng xác minh tính bền vững, chứ không chỉ là phản hồi HTTP. Nếu API trả về `201` nhưng ghi `status = 'draft'`, đây là bước sẽ bắt được nó.

Bước 4: Trích xuất một giá trị cơ sở dữ liệu và sử dụng nó trong các bước tiếp theo

Việc trích xuất không chỉ dành cho các xác nhận. Thường thì cơ sở dữ liệu giữ một giá trị mà phản hồi không bao giờ trả về, và bạn cần nó cho yêu cầu tiếp theo.

Hãy hình dung một luồng công việc mà việc tạo một đơn hàng cũng tạo ra một `fulfillment_ref` nội bộ trên máy chủ, được ghi vào hàng nhưng bị bỏ qua khỏi phản hồi API. Yêu cầu tiếp theo của bạn, `GET /api/fulfillments/{ref}`, cần nó. Truy vấn nó trong một Bộ xử lý sau (Post Processor):

SELECT fulfillment_ref
FROM orders
WHERE id = {{order_id}};

Trích xuất nó với Tên biến (Variable Name) `fulfillment_ref` và Biểu thức JSONPath (JSONPath Expression) `$[0].fulfillment_ref`. Bởi vì Apidog gán biến đó cho môi trường, yêu cầu tiếp theo của bạn chỉ cần tham chiếu `{{fulfillment_ref}}` trong đường dẫn hoặc nội dung của nó và lấy giá trị thực, do máy chủ tạo. Đây là cùng một mẫu như chuỗi các phản hồi HTTP, được đề cập trong truyền dữ liệu giữa các bước kiểm thửđiều phối kiểm thử API và truyền dữ liệu, ngoại trừ nguồn sự thật là một bảng thay vì một nội dung JSON.

MongoDB và Redis: Các biến thể NoSQL

Bộ xử lý hoạt động tương tự đối với các kho dữ liệu NoSQL, với một giao diện cấu hình khác. Cả hai đều là tính năng trả phí, vì vậy hãy lên kế hoạch cho phù hợp. Tài liệu Apidog có toàn bộ tài liệu tham khảo trường nếu bạn cần.

MongoDB

Thêm bước Thao tác cơ sở dữ liệu (Database Operation) và chọn MongoDB làm loại. Thay vì SQL thô, bạn sẽ có một danh sách thả xuống Loại thao tác (Operation Type) với Find, Insert, Update, Delete và Chạy lệnh cơ sở dữ liệu (Run Database Command). Đối với bất kỳ hành động CRUD nào, Tên bộ sưu tập (Collection Name) là bắt buộc. Trường Điều kiện truy vấn (Query Condition) nhận JSON:

{ "_id": "65486728456e79993a150f1c" }

Apidog tự động chuyển đổi chuỗi ID phù hợp thành một ObjectId, vì vậy bạn không cần tự mình bọc nó. Khi bạn cần các kiểu BSON, các hàm hỗ trợ `ISODate(...)`, `ObjectId(...)`, `NumberDecimal(...)` và `NumberLong(...)` được hỗ trợ; sách hướng dẫn MongoDB tài liệu hóa cách mỗi loại này ánh xạ tới một giá trị được lưu trữ. Kết nối chấp nhận chuỗi kết nối đầy đủ hoặc các thành phần máy chủ và thông tin đăng nhập riêng lẻ.

Một lưu ý trung thực: luồng MySQL tài liệu hóa việc trích xuất JSONPath vào một biến, nhưng tài liệu của MongoDB và Redis không mô tả cùng cơ chế Trích xuất kết quả vào biến (Extract Result To Variable) đó. Vì vậy, hãy dựa vào các thao tác Mongo để nạp và xác nhận trạng thái, và đừng cho rằng đường dẫn trích xuất kiểu SQL hoạt động giống hệt nhau cho đến khi bạn đã xác minh nó trong Bảng điều khiển (Console).

Redis

Kết nối Redis yêu cầu Máy chủ (Host), Cổng (Port), Mật khẩu (Password)Chỉ mục cơ sở dữ liệu (Database Index). Các thao tác trực quan sử dụng một danh sách thả xuống Loại thao tác (Operation Type) hỗ trợ GET, SET và DELETE. Để đọc một phiên đã lưu vào bộ nhớ cache, chọn GET và đặt Khóa (Key) thành một cái gì đó như `user:session:123`. Đối với bất cứ điều gì danh sách thả xuống không bao gồm, tab Chạy lệnh Redis (Run Redis Command) chạy bất kỳ lệnh hợp lệ nào:

KEYS user:*

Đó là cách bạn xác nhận một mục bộ nhớ cache mà API được cho là đã ghi, hoặc xóa một mục trước khi kiểm thử để chứng minh điểm cuối làm mới lại nó.

Các biến thể nâng cao và giới hạn

Một vài điều đáng biết trước khi bạn xây dựng một bộ công cụ lớn:

Xử lý thông tin đăng nhập cho mỗi môi trường

Bạn không bao giờ muốn một bài kiểm thử vô tình chạm vào dữ liệu sản xuất. Giải pháp của Apidog là một Kết nối cơ sở dữ liệu (Database Connection) cho mỗi môi trường. Bạn tạo một kết nối `staging` và một kết nối `local`, mỗi cái có máy chủ và mật khẩu riêng.

Sau đó, bạn chuyển đổi môi trường bằng cách sử dụng menu thả xuống ở góc trên bên phải. Apidog tự động định tuyến mọi truy vấn trong kịch bản đến kết nối phù hợp với môi trường hiện đang được chọn. Chọn `staging` và lệnh `SELECT` của bạn chạy trên môi trường staging; chuyển sang `local` và cùng một bước đó chạy trên cơ sở dữ liệu của máy tính xách tay của bạn, không cần chỉnh sửa SQL hoặc bước đó. Thông tin đăng nhập khác nhau cho mỗi môi trường mà không cần cấu hình lại thủ công trong quá trình chạy.

Bởi vì các thông tin đăng nhập đó được lưu trữ cục bộ và không được đồng bộ hóa, điều này cũng giữ mật khẩu sản xuất tránh khỏi dự án đám mây được chia sẻ. Mỗi kỹ sư giữ mật khẩu của riêng mình.

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

Khi kịch bản vượt qua trong ứng dụng, hãy chạy nó không giao diện trong CI để mỗi yêu cầu kéo (pull request) xác minh lại cơ sở dữ liệu, không chỉ hợp đồng HTTP. Cài đặt CLI và xác thực:

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

Sau đó chạy chính xác kịch bản bạn đã xây dựng, bằng ID của nó, trên một môi trường đã chọn:

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 thử, `-e` là ID môi trường, và `-r` là trình báo cáo (`cli`, `html`, hoặc `junit`; phân tách bằng dấu phẩy cho nhiều loại, như `-r html,cli`). Một điều cần lên kế hoạch: chi tiết kết nối cơ sở dữ liệu là cục bộ, vì vậy trình chạy cần cấu hình đã xuất để tiếp cận cơ sở dữ liệu của bạn từ CI. Nếu bạn cung cấp các hàng kịch bản từ một tập dữ liệu, kiểm thử dựa trên dữ liệu với Apidog CLI cho thấy cách mỗi hàng chạy các xác nhận cơ sở dữ liệu tương tự, và lên lịch kiểm thử API với Apidog bao gồm việc chạy điều này theo một nhịp độ để một xác nhận cơ sở dữ liệu thất bại sẽ hiển thị như bất kỳ kiểm thử nào khác.

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

Những cơ sở dữ liệu nào miễn phí và những cơ sở dữ liệu nào trả phí? MySQL, SQL Server (2014 trở lên), PostgreSQL và Oracle nằm trong gói miễn phí. ClickHouse, MongoDB và Redis cần gói trả phí. Tài liệu của MongoDB và Redis đều nêu rõ kết nối của chúng là một tính năng trả phí, vì vậy hãy kiểm tra trang giá cả trước khi lên kế hoạch cho một bộ NoSQL. Tải Apidog để thử các cơ sở dữ liệu miễn phí trước.

Tôi có thể sử dụng một giá trị từ cơ sở dữ liệu trong một yêu cầu sau không? Có. Thêm một Bộ xử lý sau (Post Processor) với thao tác cơ sở dữ liệu, chạy một lệnh `SELECT`, sau đó sử dụng Trích xuất kết quả vào biến (Extract Result To Variable) với Tên biến (Variable Name) và Biểu thức JSONPath (JSONPath Expression) như `$[0].fulfillment_ref` để cô lập trường từ hàng đầu tiên. Tham chiếu nó sau này dưới dạng `{{variable_name}}`. Ý tưởng chuỗi tương tự cho các phản hồi HTTP được đề cập trong truyền dữ liệu giữa các bước kiểm thử.

Đồng đội của tôi có tự động nhận được kết nối cơ sở dữ liệu của tôi không? Không. Thông tin đăng nhập kết nối được lưu trữ cục bộ trên mỗi máy khách và không được đồng bộ hóa với đám mây, vì vậy mỗi thành viên trong nhóm tự cấu hình kết nối. Điều này là có chủ ý: nó giữ mật khẩu sản xuất tránh khỏi dự án được chia sẻ.

Kết nối MySQL 8 của tôi liên tục bị lỗi. Tại sao? MySQL 8 mặc định sử dụng plugin xác thực `caching_sha2_password`, có thể chặn kết nối. Chuyển đổi người dùng sang `mysql_native_password` bằng `ALTER USER ... IDENTIFIED WITH mysql_native_password` và kết nối lại.

Tôi có thể chạy các thủ tục lưu trữ hoặc logic cơ sở dữ liệu phức tạp không? Không thông qua giao diện trực quan. Nó xử lý các câu lệnh SELECT, INSERT, UPDATE và DELETE tiêu chuẩn, nhưng các thao tác phức tạp như thủ tục lưu trữ không được hỗ trợ. Giữ các bước kiểm thử của bạn thành các câu lệnh trực tiếp.

Tóm lại

Các truy vấn cơ sở dữ liệu biến một bài kiểm thử API từ "phản hồi trông đúng" thành "dữ liệu thực sự chính xác." Thiết lập một trạng thái đã biết trong Bộ xử lý trước (Pre Processor), xác minh hàng đã được lưu trữ trong Bộ xử lý sau (Post Processor) và trích xuất các giá trị do máy chủ tạo để chuỗi vào yêu cầu tiếp theo, tất cả trong một kịch bản. Thiết lập một kết nối cho mỗi môi trường và các bước tương tự sẽ chạy an toàn trên môi trường staging hoặc local mà không cần chỉnh sửa.

Hãy dùng thử miễn phí, không yêu cầu thẻ tín dụng: Tải Apidog, trỏ một kết nối MySQL vào cơ sở dữ liệu phát triển của bạn và thêm một Bộ xử lý sau (Post Processor) đọc lại hàng mà yêu cầu tiếp theo của bạn tạo ra.

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